快捷搜索:

C语言嵌入式系统编程修炼之软件架构篇

模块划分

模块划分的"划"是筹划的意思,意指如何合理的将一个很大年夜的软件划分为一系列功能自力的部分相助完成系统的需求。说话作为一种布局化的法度榜样设计说话,在模块的划分上主要依据功能(依功能进行划分在面向工具设计中成为一个差错,牛顿定律碰到了相对论),C说话模块化法度榜样设计需理解如下观点:

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

(2) 某模块供给给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;

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

(4) 永世不要在.h文件中定义变量!定义变量和声明变量的差别在于定义会孕育发生内存分配的操作,是汇编阶段的观点;而声明则只是奉告包孕该声明的模块在连接阶段从其它模块探求外部函数和变量。如:

/*module1.h*/

int a = 5; /* 在模块1的.h文件中定义int a */

/*module1 .c*/

#include "module1.h" /* 在模块1中包孕模块1的.h文件 */

/*module2 .c*/

#include "module1.h" /* 在模块2中包孕模块1的.h文件 */

/*module3 .c*/

#include "module1.h" /* 在模块3中包孕模块1的.h文件 */

以上法度榜样的结果是在模块1、2、3中都定义了整型变量a,a在不合的模块中对应不合的地址单元,这个天下上从来不必要这样的法度榜样。精确的做法是:

/*module1.h*/

extern int a; /* 在模块1的.h文件中声明int a */

/*module1 .c*/

#include "module1.h" /* 在模块1中包孕模块1的.h文件 */

int a = 5; /* 在模块1的.c文件中定义int a */

/*module2 .c*/

#include "module1.h" /* 在模块2中包孕模块1的.h文件 */

/*module3 .c*/

#include "module1.h" /* 在模块3中包孕模块1的.h文件 */

这样假如模块1、2、3操作a的话,对应的是同一片内存单元。

一个嵌入式系统平日包括两类模块:

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

(2)软件功能模块,其模块的划分应满意低偶合、高内聚的要求。

多义务照样单义务

所谓"单义务系统"是指该系统不能支持多义务并发操作,宏不雅串行地履行一个义务。而多义务系统则可以宏不雅并行(微不雅上可能串行)地"同时"履行多个义务。

多义务的并发履行平日依附于一个多义务操作系统(),多义务的核心是系统调整器,它应用义务节制块(TCB)来治理义务调整功能。TCB包括义务确当前状态、优先级、要等待的事故或资本、义务法度榜样码的肇端地址、初始客栈指针等信息。调整器在义务被激活时,要用到这些信息。此外,TCB还被用来寄放义务的"高低文"(context)。义务的高低文便是当一个履行中的义务被竣事时,所要保存的所有信息。平日,高低文便是谋略机当前的状态,也即各个寄存器的内容。当发生义务切换时,当前运行的义务的高低文被存入TCB,并将要被履行的义务的高低文从它的TCB中掏出,放入各个寄存器中。

嵌入式多义务OS的典典范子有Vxworks、ucLinux等。嵌入式并非遥弗成及的神坛之物,我们可以用不到1000行代码实现一个针对80186处置惩罚器的功能最简单的OS内核,作者正筹备进行此项事情,盼望能将心得供献给大年夜家。

究竟选择多义务照样单义务要领,依附于软件的体系是否宏大年夜。例如,绝大年夜多半手机法度榜样都是多义务的,但也有一些小灵通的协议栈是单义务的,没有操作系统,它们的主法度榜样轮流调用各个软件模块的处置惩罚法度榜样,模拟多义务情况。

您可能还会对下面的文章感兴趣: