嵌入式系统C语言编程方法研究
摘要:嵌入式系统是当前最热门最有发展前途的IT应用领域之一。嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器、存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高。特别是随着消费家电的智能化,嵌入式更显重要。未来的物联网时代,射频识别技术都是基于嵌入式的基础上在互联网上完成的一个通信技术。
关键词:嵌入式系统;C语言;编程思维
一般形式的软件编程不同于嵌入式系统C语言编程,嵌入式系统编程建立在特定的51单片机、ARM芯片、DSP数字处理芯片等硬件平台上,所以要求其编程语言具有较强的硬件操控能力。汇编语言是最接近于机器语言的一种编程语言。但是,由于汇编语言结构的复杂性,且移植到不同的硬件平台,所以它并不是嵌入式系统开发的一般选择。而与之相比,C语言是一种最接近机器语言的高级语言,称之为嵌入式底层硬件开发的最佳编程语言。
在了解嵌入式系统构成的基础上,嵌入式C语言的编程要注意以下几个方面:
1.1程序模块化
是指怎样合理的将一个很大的工程文件划分为一系列功
能独立的各个模块进行编程、编译、调试。C语言是一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论)来划分,C语言程序模块化设计需要涉及的概念:①一个程序文件(.c文件)和一个库文件(.h)文件的合成一个模块,头文件(.h)中是对于该模块软硬件接口的声明;②某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;③以static关键字声明的变量,是模块内的函数和全局变量,需在.c 文件开头;④只有在汇编中,才可以认为定义变量和声明变量的区别在于定义会产生内存分配的操作,所以,禁止.件中定义变量。
1.2任务模式选择
所谓任务模式选择,就是单任务还是多任务的选择。“单任务系统”是指该系统模式下,不能支持在同一时刻下的多任务并发操作。在计算机编译原理中,也介绍过,计算任务的执行,可以认为是宏观串行地执行一个任务。而多任务系统则可以宏观并行(微观上是串行)地“同时”执行多个任务。多任务的并发执行通常依赖于一个多任务操作系统(OS),多任务OS的核心是系统调度器,它使用任务控制块(TCB)来管理任务调度功能。
嵌入式多任务OS的典型例子有Vxworks、ucLinux等。嵌入式OS并非遥不可及的神坛之物,我们可以用不到1000行代码实现一个针对80186处理器的功能最简单的OS内核,作者正
准备进行此项工作,希望能将心得贡献给大家。
1.3单任务模式程序
(1)从MCU复位(reset)时的指定地址开始执行;
(2)跳转至汇编程序startup处执行;
(3)跳转至用户主程序main函数执行,在main从上而下顺序执行:①初始化(驱动程序)各硬件设备;②初始化(各接口程序)各软件模块;③进入死循环(无限循环),调用各模块的处理函数
while(1) { }
也可利用无条件循环这样写:
for(;;){}
用户main函数和各模块的处理函数都以C语言完成。用户main函数最后都进入了一个死循环,这也是一个可选方案。
1.4中断服务程序
中断是嵌入式系统中重要的组成部分,它规定了一个硬件在规定的条件下,跳转到其他子函数执行其他优先级高的任务。但是在标准C中不包含中断。因此许多编译开发商在标准C上增加了对中断的支持。当一个函数被定义为ISR的时候,编译器会自动配置程序所需要的函数的堆栈。
在下面的一个队列,将中断类型添加到队列中时,在main 函数的执行过程中,主程序死循环中不断扫描该程序是否有中断,有则取出中断函数,进行相应的处理。
在下面的一个队列,在中断服务程序中,只是将中断类型添加入该队列中,在主程序的死循环中不断扫描中断队列是否有中断,有则取出队列中的第一个中断类型,进行相应处理。
/* 存放中断的队列*/
typedef struct tagIntQue
{
int intType; /* 说明类型*/
struct tagIntQue *next;
}IntQueue;
IntQueue lpIntQueHead;
__interrupt ISRexample ()
{ int intType;
intType=GetSystemType();
QueueAddTail(lpIntQueHead,intType);/*加入新的中断*/ }
在main函数循环中判断是否有中断:
While(1)
{
If( !IsIntQueueEmpty() )
{
intType=GetFirstInt();
switch(intType){
case xxx:
汇编语言转c语言的软件
break;
case xxx:
break;
}
}
}
按上述方法设计的中断服务程序所占用的内存很小,实际的工作都交由主程序由上至下执行。
1.5硬件模块驱动驱动程序
一个硬件驱动模块通常应包括如下函数:
(1)中断服务程序ISR。
(2)硬件驱动:①修改寄存器,设置硬件参数(如芯片工作模式、串口波特率、效验位);②将中断程序入口地址写入中断向量表格:
/*设置中断向量表*/
m_myPtr=make_far_pointer(0l);/*返回void far型指针void far**/
m_myPtr += ITYPE_UART;/*ITYPE_UART:uart中断服务程