嵌入式c的模块化编程

在一些大型项目中,不可能一个人完全做所有的工作,这时候就需要多人协作完成,每个人负责一部分,将自己负责的一部分做成一个模块,提供简明的接口供其他函数调用,这时候就需要对模块化编程的思想和步骤非常熟悉。

 

概述:

1. 模块即是一个.c 文件和一个.h 文件的结合,头文件(.h)中是对于该模块接口的声明;

  这一条概括了模块化的实现方法和实质:将一个功能模块的代码单独编写成一个.c文件,然后把该模块的接口函数放在.h文件中.

  例如:假如你用到液晶显示,那么你可能会写一个液晶驱动模块,以实现字符、汉字和图像的现实,命名为: led_device.c,该模块的.c文件大体可以写成:

  .h文件中给出模块的接口.在上面的例子中, 向LCD写入字符函数:wr_lcd (uchar dat_comm,uchar content)就是一个接口函数,因为其它模块会调用它,那么.h文件中就必须将这个函数声明为外部函数(使用extrun关键字修饰),另一个延时函数:void delay (uint us)只是在本模块中使用(本地函数,用static关键字修饰),因此它是不需要放到.h文件中的。

2. extern关键字声明

  某模块提供给其它模块调用的外部函数和全局变量需在.h 中文件中冠以extern 关键字声明

  例如:如果一个模块中的变量要给其他模块调用,在.h文件中外部数据冠以extern关键字声明。比如上例的变量value就是一个全局变量,若是某个模块也使用这个变量,则和使用外部函数一样,只需在使用的模块.c文件中包含#include“lcd_device.h”即可。

3. static关键字声明

  模块内的函数和全局变量需在.c 文件开头冠以static 关键字声明;

  在C 语言中,关键字static 有三个明显的作用:

    (1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。

    (2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

    (3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

4. 最好不要再.h文件中定义变量

 

模块化编程步骤:

  注:一个嵌入式系统设计一般包括两个模块

  (1)硬件驱动模块---一种特定硬件对应一个模块

  (2)软件功能模块---模块的划分应满足低偶合、高内聚的要求

 

以keil为例,具体实施模块化编程步骤

这个程序分为三层,共7个模块,共同为主程序服务(它们之间也会相互调用)。

主要的模块和功能简介:

  底层驱动

  1. 红外键盘:程序通过红外键盘进行操作。红外键盘独占定时器0和外部中断0,以实现红外解码和键盘键值的识别。红外键盘定义了五个按键,分别为上翻、下翻、左翻、右翻和确认键。

  2. LCD液晶显示:程序主要通过LCD显示信息,LCD液晶显示驱动提供显示汉字、图形和ASCII码的函数接口。可以全屏、单行显示汉字,任意位置显示ASCII码,还可以全屏、半屏显示图形。

  功能模块

  1. LCD菜单程序:菜单程序可以使人机交互更加方便、容易。本菜单程序的菜单级别深度受RAM大小的限制,每增加一级菜单将多消耗4字节的RAM。菜单程序主要完成菜单功能函数的调度,LCD显示刷新。

  2. 计算器程序:实现65536以内的加、减、乘、除,超出范围会出现溢出,溢出发生时,LCD显示“错误:出现溢出”的错误提示,同时本次运算被忽略。对于负数会显示“-”号,除数为零时LCD显示“错误:除数为零”的错误提示。

  3. 开机次数记忆程序:主要对基于IIC总线的EEPROM进行读写,单片机每次上电后,将开机次数写入EEPROM.

  4. 串口测试程序:进入该程序后,单片机向电脑发送字符串“Hello Word!”,发送数字24(以字符的形式显示)。编写此程序的目的是为了能够方便的向电脑发送字符串和变量,便于程序的调试。串口占用串口资源,与频率测量程序共享定时器1

  5. 频率测量:复用定时器1,占用外部中断1,实现5~20KHZ频率的测量.

  主工程

  主工程的任务:

    程序初始化

    LCD菜单显示

    监视键盘程序并根据键值更新菜单

详细实施步骤:

  1. 新建工程。

  2. 创建.c文件

    点击File—New(或者点击快捷图标:),新建一个文档。

    点击File—Save(或者点击快捷图标:),保存新建的文档,在文件名后填写LCD_device.c(液晶驱动模块: LCD_device,提供显示汉字、字符和图像的接口),点击确定。

              在该文档内编写LCD驱动程序。

  3. 创建.h文件

    和.c文件创建一样,只不过最后保存为.h文件

    在此文件中声明函数和变量以及宏定义

  4. 重复2和3创建其他模块的.c和.h文件

  5. 重复2创建main.c文件

执行完以上步骤还需要将这些文件加入到工程中,否则编译出现以下警告

  *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL

  *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL

  添加.c文件:

    在Project Workspace框中,右击Source group 1文件夹(也可以是别的文件夹),选择Add Files to  Group‘Source Group 1’,在弹出的对话框中添加你的.c文件即可。

  添加.h文件:

    点击目录框的魔术棒按钮--选择c/c++--在include paths中添加路径---保存即可

    

 

参考文章

posted @ 2019-05-10 17:06  Freddy520  阅读(712)  评论(0编辑  收藏  举报