蓝桥杯 模板Template Part1:模块化编程&工程模板
发布日期:2021-07-01 03:13:10 浏览次数:2 分类:技术文章

本文共 3345 字,大约阅读时间需要 11 分钟。

九层妖塔 起于垒土
在这里插入图片描述

蓝桥杯 模板Template Part1:模块化编程&工程模板



改编自国信长天蓝桥杯官方蓝皮书例程,按照自己的习惯进行了补充和修改



一、流程图

在这里插入图片描述


二、工程结构

蓝桥杯考场编程以实用快捷为目的,并不是为了后期工程移植,所以省去了各种.h头文件,除了ds1302.h,iic.h,onewire.h三个官方提供的底层驱动,其他的各种用户自己写的头文件都融合成一个main.h头文件。使工程结构更加简洁,避免了外部变量声明不到的尴尬。

 51结构比较简单,正点原子建立32工程的结构并不适合51。
 在名为蓝桥杯的总工程文件夹里新建如下文件夹:
在这里插入图片描述

  ●Project文件夹,用来存放编译过程产生的文件和最终的工程文件和二进制文件(hex文件)。

  ●Source文件夹,用来存放主源程序(即主C文件)和各种C文件;
在这里插入图片描述

  ●Library文件夹,用来存放头文件&库文件。

在这里插入图片描述


三、变量命名规则

 ●局部变量普通标识符命名即可。

 ●全局变量建议加前缀unsigned char型的加uc_uc_Key_Valueunsigned int型的加ui_ui_SEG_flagunsigned long型的加ul_ul_ms;字符串数组前再加p表示指针,如puc_SEG_Buf[9]


四、基础知识

1、编译预处理

 ●编译预处理即在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令行进行处理的过程。

 ●分为:宏定义,文件包含和条件编译。
 ●宏定义
  ○宏定义命令行的常见形式:宏名即标识符。

#define 宏名  被替换文本#define 宏名    //仅说明标识符被定义

 ●文件包含

  ○文件包含:指在一个文件中,去包含另一个文件的全部内容。
  ○形式:

#include "文件名"或#include
<文件名>

  在预编译时,预编译程序将用指定文件中的内容来替换此命令行。

关于keil中的文件包含可参考

 ●条件编译

  ○对程序中的内容选择性地编译。便于程序的调试和移植,避免重复编译。
  ○常见形式:当标识符没有由#define定义过,则编译程序段。

#ifndef 标识符#define  标识符 程序段#endif

2、变量的定义和说明

 ●定义(definition):创建变量,为变量分配确定的存储单元。

 ●说明or声明(declaration):只是说明变量的性质,并不分配内存。


3、extern

 ●在同一编译单位内用extern说明符扩展全局变量的作用域

  当全局变量定义在后,引用在前时,应该在引用处用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已经在外部(后边)定义了的全局变量,已经分配了存储单元,不需要再为它另外开辟存储单元。使变量的作用域扩展到从extern说明处。
  全局变量的说明与全局变量的定义的不同:变量的定义(开辟存储单元)只能出现一次,在定义全局变量时,不可使用extern说明符;而对全局变量的说明,则可以多次出现在需要的地方,此时需要用extern进行说明。
 ●在不同编译单位内用extern说明符扩展全局变量的作用域
  模块化编程中,通常创建多个源文件(C文件),每个源文件可以单独进行编译,进行语法检查,若无错误即生成目标文件(.obj),然后用系统提供的连接程序把多个目标文件连接成一个可执行文件(.exe)。每个可进行单独编译的源文件称为编译单位
  在一个文件中定义所有的全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已经在其他编译单位中定义,通知编译程序不必再为他们开辟存储单元。



五、操作流程


1、程序构架&模块分类

 对要写的程序进行框架的搭建,自上而下进行编程。先确定整个程序可以划分为哪几个模块,再分别实现每个模块的功能,每个模块多外只提供一个接口即可,便于程序的移植和调试。

 一个嵌入式系统通常包含两类模块:
  ●硬件驱动模块:一种特定的硬件对应一个模块。
  ●软件功能模块:对应某个功能的实现,没有特定的硬件
对应。(比如一些通信协议的驱动)

蓝桥杯考场编程以实用快捷为目的,并不是为了后期工程移植,所以省去了各种.h头文件,除了ds1302.h,iic.h,onewire.h三个官方提供的底层驱动,其他的各种用户自己写的头文件都融合成一个main.h头文件。使工程结构更加简洁,避免了外部变量声明不到的尴尬。

 51结构比较简单,正点原子建立32工程的结构并不适合51。
 在名为蓝桥杯的总工程文件夹里新建如下文件夹:
在这里插入图片描述

  ●Project文件夹,用来存放编译过程产生的文件和最终的工程文件和二进制文件(hex文件)。

  ●Source文件夹,用来存放主源程序(即主C文件)和各种C文件;
在这里插入图片描述

  ●Library文件夹,用来存放头文件&库文件。

在这里插入图片描述

2、新建工程

 按照通常方法新建工程即可,注意工程目录要选到Project文件夹,如下图所示。

在这里插入图片描述
 刚建完工程的Project文件夹如下图所示。
在这里插入图片描述

3、新建文件

 直接点击New可以新建text文本文档,点击保存,命名为main.c 注意后缀。保存路径为main文件夹。

在这里插入图片描述
 如此,可以分别建立Init.c文件,Key16.c文件,SEG.c文件。

4、管理工程项目(C文件)

 虽然在 3、新建文件 中已经新建了一些c文件和头文件并保存在总工程文件夹蓝桥杯中,但实际上只是在物理路径上存放在了工程文件夹中,实际上并没有在工程中。

 在下图的左侧工程管理栏中也可以看出。
在这里插入图片描述
4、管理工程项目就是将前边建的文件包含到工程中。

 ①项目目标(Project Targets)管理

 单击 Manage Project Items,在Project Items一栏下, 在Project Targets下面双击Target 1可以改变目标文件名字,将其改为蓝桥杯

在这里插入图片描述

 ②分组管理

 同样双击Groups栏下的Source Group 1将其改为Source。在Groups栏下点击Groups栏右侧新建按钮可新建Group,再新建一个Group命名如为Library

在这里插入图片描述

 ③组内文件的添加

 在mainGroup的条件下,在Files栏下点击Add Files…按钮,添加对应的文件到相应的Group下。如下图所示。

此处的工程项目管理是添加相应的文件到工程。

在这里插入图片描述

在这里插入图片描述

 再看此时的左侧工程管理栏,C文件已经在工程中被添加到相应的模块文件夹中了。

在这里插入图片描述


5、路径包含的设置(头文件)

 在里解释了两个概念:当前目录标准系统目录

 显然对于keil来说新建工程时自动生成的Project文件夹才是keil承认的当前目录。而并非是用户自己建立的大工程文件夹蓝桥杯
 如果使用双引号进行文件包含,IDE会先在当前目录中查找文件,再去标准系统目录查找。在此建议,使用尖括号来进行文件包含,使IDE在编译时直接在标准系统目录中查找文件,以节约时间,而且可以通过路径包含的设置将任意目录设置为标准系统目录,使头文件的存放更加灵活,适合模块化编程。

 通过菜单选项进行设置标准系统目录,来指定用尖括号时的查找路径。在keil中的具体操作就是在(Project->)Options for Target''->C51 可用于设置当前项目的C51编译器控制命令。在Include Paths一栏用于设定包含文件的目录路径。

 单击下图红框中按钮,进行标准系统目录包含路径的添加。只需要将用到的所有用户自己写的头文件的存放路径添加到即可。

在这里插入图片描述
 单击下图红框中按钮,新建一个路径。
在这里插入图片描述
 单击下图红框中按钮,对新建的路径添加具体路径。
在这里插入图片描述
 选择到头文件所在的文件夹即可,因为添加的是路径,所以此处操作进行的是选择文件夹,并不是选择头文件。头文件只有在程序中被包含被调用时才会添加到工程。
在这里插入图片描述

在这里插入图片描述

 添加完头文件路径后,进行编译,如下图,工程中依旧没由头文件。

整个工程是用C文件搭建起来的,头文件只有被包含被调用时,才会被添加到工程。



  

  
  
  

转载地址:https://methadone-no1.blog.csdn.net/article/details/114097442 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:蓝桥杯 模板Template Part3:定时器
下一篇:蓝桥杯 模板Template Part4:LED

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月21日 17时24分41秒