前言:前段时间分享的文章【单片机裸机代码框架设计思路】,很多读者给我留言,觉得很不错,对于初学者而言,这是一个进阶的技巧,对于我而言,这是对自己总结和表达能力的一个提升 。
本文章我们再谈谈单片机代码的模块化设计思想是如何设计的 。之前的【单片机裸机代码框架设计思路】文章为了尽量简洁的表达,我几乎所有代码都放在了main.c中,这个在实际项目中,或者说当任务比较多的时候,几乎是不太现实的 。
模块化设计的目的是让代码高内聚,低耦合,是为了降低程序复杂度,使程序设计、调试和维护等操作简单化
第一点:单独的功能模块各自独立建立xxx.c和xxx.h文件
这一点相信大家可能都知道,因为51单片机的书都有讲,如果您已经知道了,请跳过第一点 。
下面以之前的文章单片机裸机代码为例进行说明:如下图所示
我把功能代码分成了4大块:
定时器功能代码:timer0.c、timer0.hTask裸机框架功能代码:task.c、task.h中断函数功能代码:interrupt.c、interrupt.h(任务很少,也可以不分出来,看具体情况)公共函数功能代码:public.c、public.h(存放一些公共的函数和全局变量)
(1)定时器功能代码:timer0.c、timer0.h
可以看出:timer0.c包含了3个常用函数,和1个定时器结构体变量,定时器中断是放在interrupt.c里面
timer0.h包含一些常用的宏定义,和结构体变量类型定义,对于常用的2ms/5ms/10ms定义初始值,可以使用宏定义,修改起来就会很方便,如下所示,这是一个小技巧
为什么使用TIMER_VALUE来代替T5ms时,是因为如果不使用这个宏,那么定时器初始化的时候要给TL0/TH0赋值T5ms,在定时器中断函数中还要赋值一次,我需要改动两个地方,中断赋值很容易被忽略掉,所以使用TIMER_VALUE宏定义代码,我就可以只需要改T5ms就可以一次性更改定时器中断的时间 。
(2)Task裸机框架功能代码:task.c、task.h
task.c包含裸机代码框架中功能所有代码,心跳函数,初始化任务,启动任务,停止任务还有任务处理函数
task.h代码如下:包含任务的数组定义等等
(3)中断函数功能代码:interrupt.c、interrupt.h
这个范例代码比较简单,只有1个定时器的中断函数,如下所示
(4)公共函数功能代码:public.c、public.h
存放公共函数,比如禁止总中断,使能总中断,软件延时函数等等
要特别提到的一点,这是一个小技巧:public.h包含所有外设的头文件和常用的C语言库头文件,这样做的好处是,只需要修改这一个地方,其余.c文件只需要包含一条include "public.h"就可以了 。
第二点:结构化封装外设
这个才是本文章我想提到的重点,对于一般初学者而言,可能写的最多的就是Timer0_Init(); 然后和Timer0_ISR() 函数,然后main.c调用就完事了 。这种写法的确简单,也好理解,但是如果你的外设特别多,如果还有ADC,传感器,等等,你需要定义全局变量传递参数时,外设越多,那么全局变量就越多,后续修改起来,你就会发现太痛苦了,能把功能实现就不错了 。
推荐阅读
- Axure查看页面代码的详细操作方法。
- 办公室撩妹套路,代码都为你准备好了
- 0xc004c003,小编教你Win10激活失败并提示错误代码0xC004C003的解决方法
- 0xc004C012,小编教你win10激活错误代码0xc004f074
- 0xC004C004,小编教你Win10系统激活失败提示错误代码0xc004f074
- 0xC004C4A2,小编教你win10激活失败提示错误代码0x8007007B
- 工学,工学是什么
- 0xD0000272,小编教你解决Win10激活失败提示错误代码0xC004C003
- 0x8007007B,小编教你win10激活系统失败错误代码0x8007007B
- 查看Axure页面的代码的操作方法。