汉扬编程 编程大纲 嵌入式C语言程序的系统架构设计

嵌入式C语言程序的系统架构设计

嵌入式C语言程序的系统架构,一般大都采用如下的形式:

void main(void){ DI( ); InitOS( ); EI(); while(1) { while(!flagBaseTimeIsUp); flagBaseTimeIsUp = false; FEED_DOG(); task1( ); task2( ); …… }}根据行标,稍微解释一下:

第3行:关中断

第4行:系统初始化

第5行:开中断

第8行:定时时基检测

第9行:定时时基标志复位

第10行:喂狗

第11行:任务1

可以看出来,整个系统除了初始化的部分,基本上就是一个大的死循环。所有任务在整个系统中是不断被轮循的。整个轮循过程在正常运行时,是不会被打断的。除非产生中断或者进入休眠。我们先来看一下系统初始化的部分。

系统的初始化

在我们对整个系统做初始化的时候,是不希望被打断的,因此初始化之前会主动关闭中断。直到初始化结束,再开启中断使能。这样整个初始化过程就是在不受外界干扰的情形下,全速执行的。其实系统初始化,主要完成的就是赋值的工作。根据对象的不同,可以大致分为两类:一类是针对硬件寄存器的赋值;另一类是针对堆变量的赋值。针对硬件寄存器的赋值,实际上就是底层驱动配置程序。

底层驱动程序

底层驱动配置,一般由驱动工程师来完成,当然这是在你们公司足够专业的情况下。

#if MCU_CPU_CLK_INITInitMCU_CPU_CLK();#endif#if MCU_WDT_INITInitMCU_WDT();#endif#if _MCU_PORT_INITInitMCU_PORT();#endif#if MCU_TMR_INITInitMCU_TMR();#endif#if MCU_AD_INITInitMCU_AD();#endif#if MCU_SPI_INITInitMCU_SPI();#endif#if MCU_CAN_INITInitMCU_CAN();#endif一般需要对系统时钟、看门狗、端口状态、计时时钟、模数转换和需要用到的总线,比如,SPI总线、CAN总线等做专门的底层配置。当然,这里的列举出来的硬件单元并不完整,也可能有的部分有的项目都用不上。其实,这里采用这种#if、#endif预编译的架构设计也是为了方便配置。不需要的模块,就配置成这样:

#define MCU_CPU_CLK_INIT (0)需要的话,配置成非零就可以了。

至于针对堆变量的赋值,相当于是对其他所有全局变量的初始化,这里面包括系统变量、状态变量、缓冲器,数据结构等所有变量的初始化。

接下来我们再来看一下主循环中的部分。

主循环中的定时时基

关于定时时基,我在前面的专题也有谈到过,它相当于是操作系统中分给每个进程的运行时间片。这个时基不能过大,也不能过小。如果我们单片机的单个指令周期是纳秒级,我们一般可以选择10毫秒做为一个时基。也就是说,时基的选择至少是单个指令周期的10的3到4次方倍,也就是留给所有任务的最大运行时间总和不能超过10毫秒。

因此在一般情况下,在每个任务中,都不可能存在指令延时函数

void Delay(t_uint16 cnt){ while (cnt>0) { cnt–; }}如果需要延时的话,要么基于时基来计数累加,要么就只能采用其他的定时器中断计时了。前一种方法前面有专题谈到过,后一种方法和系统定时时基差不多,配置系统时钟,开启相应中断,编写相应中断函数就可以了。

void SysTick_Handler(void){ SYSTICK_ClrIF(); flagBaseTimeIsUp = true;}最后我们再来看一下主循环中的任务。

主循环中的任务

关于主循环中的任务,可以分为系统任务和功能任务。系统任务并不直接用来实现某个具体产品的功能,而是服务于整个系统运行的,因此我们也可以称之为系统服务。比如,端口扫描和低功耗等。

#if IO_SCAN IO_Scan();#endif#if LOW_POWER Low_Power();#endif像这些系统服务,并不体现具体的功能逻辑,但是他们服务于具体的功能任务。比如,车窗的控制。当车窗需要产生运动变化时,一般是功能任务WinControl(),检测到来自外部端口的输入变化,也就是通过系统服务IO_Scan(),来获取控制信号的变化,从而控制车窗产生状态变化。很明显,系统服务IO_Scan()实际上为功能任务WinControl()提供了触发条件。

至于功能任务WinControl()的实现,完全可以采用状态机的方式来实现,这个我前面有专题讨论过,大家可以参考一下,这里就再讨论了。

小结

整个系统架构设计,实际上就是一个大的while循环,具体设计起来还是要具备模块化(横向)和分层(纵向)的设计思想。

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6253.html

嵌入式开发C语言编程的那些编程思路与技巧

详解嵌入式开发中的三种程序架构

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部