![](https://csdnimg.cn/release/download_crawler_static/5032711/bg6.jpg)
C 语言嵌入式系统编程修炼之道
6
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)软件功能模块,其模块的划分应满足低偶合、高内聚的要求。
2.2 多任务还是单任务
所谓"单任务系统"是指该系统不能支持多任务并发操作,宏观串行地执行一个任务。而
多任务系统则可以宏观并行(微观上可能串行)地"同时"执行多个任务。
多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务 OS 的核心是系统调
度器,它使用任务控制块(TCB)来管理任务调度功能。TCB 包括任务的当前状态、优先
级、要等待的事件或资源、任务程序码的起始地址、初始堆栈指针等信息。调度器在任务被
激活时,要用到这些信息。此外,TCB 还被用来存放任务的"上下文"(context)。任务的上
下文就是当一个执行中的任务被停止时,所要保存的所有信息。通常,上下文就是计算机当
前的状态,也即各个寄存器的内容。当发生任务切换时,当前运行的任务的上下文被存入
TCB,并将要被执行的任务的上下文从它的 TCB 中取出,放入各个寄存器中。
嵌入式多任务 OS 的典型例子有 Vxworks、ucLinux 等。嵌入式 OS 并非遥不可及的神
坛之物,我们可以用不到 1000 行代码实现一个针对 80186 处理器的功能最简单的 OS 内核,
作者正准备进行此项工作,希望能将心得贡献给大家。
究竟选择多任务还是单任务方式,依赖于软件的体系是否庞大。例如,绝大多数手机程
序都是多任务的,但也有一些小灵通的协议栈是单任务的,没有操作系统,它们的主程序轮
流调用各个软件模块的处理程序,模拟多任务环境。
2.3 单任务程序典型架构
(1)从 CPU 复位时的指定地址开始执行;
(2)跳转至汇编代码 startup 处执行;
(3)跳转至用户主程序 main 执行,在 main 中完成:
a.初试化各硬件设备;
b.初始化各软件模块;