《嵌入式系统及应用-Chapter08-嵌入式C语言程序设计课件》由会员分享,可在线阅读,更多相关《嵌入式系统及应用-Chapter08-嵌入式C语言程序设计课件(29页珍藏版)》请在金锄头文库上搜索。
1、嵌入式系统及应用,第八章 嵌入式C语言程序设计,嵌入式代码的编写方法,嵌入式C编程的0 x10个经典问题,嵌入式代码的编写方法,无操作系统代码的编写 基于操作系统代码的编写,无操作系统代码的编写,无操作系统前后台程序 应用背景 功能需求特别简单,如:家电 执行的功能相对单一,如:红绿灯 片内资源受限(RAM),如:51单片机系统 开发过程,如:测试某个模块,无操作系统代码的编写,优点: 代码结构简单 占用资源少,没有操作系统的开销 缺点: 嵌入式系统完备的实时性难以达到 要手工维护多个任务的同时运行、共享资源的访问、任务间通信,程序流程难以控制,无操作系统代码的编写,程序结构的划分(前后台)
2、前台,用中断完成,用于快速响应异步事件,一般简短精悍,可以迅速完成 后台,主程序及其子程序完成,用于做事件的后续处理,一般用于做耗时的数据后续处理 一般情况下,前台中断函数负责发送消息标志,后台程序检测该标志,并进行响应的消息处理,无操作系统代码的编写,void main (void) Initial(); while(1) if ( TestMsg( MSG_SOME_KEY_DOWN ) ) FunKeyProc(); ClearMsg( MSG_SOME_KEY_DOWN ); else if ( TestMsg( MSG_UPDATE_OUT ) ) UpdateDisplay();
3、ClearMsg( MSG_UPDATE_OUT ); else if . / 清看门狗,进低功耗 ,无操作系统代码的编写,前台处理 _interrupt void TIMER_ISR(void) SendMsg(MSG_UPDATE_OUT ); 消息处理宏 #define MSG_SOME_KEY_DOWN0 x0000000F #define MSG_UPDATE_OUT0 x00000010 unsigned int MsgQueue; #define SendMsg(msgId)( MsgQueue |= msgId ) #define TestMsg(msgId)( MsgQueu
4、e OSTaskCreate(Task0, (void *)0,.); OSTaskCreate(Task1, (void *)0,.); . OSStart();. ,基于操作系统代码的编写,uCOS各个任务可以独立编写void Task0 (void *pdata)/*任务0的执行代码*/ /* Application specific initialization */ while (1) /* Task specific code */ OSTimeDly(100); void Task1 (void *pdata) /*任务1的执行代码*/ /* Application specif
5、ic initialization */ while (1) /* Task specific code */ ,基于操作系统代码的编写,基于操作系统代码编写的要领: 必须调用OS的延迟、等待函数,否则无法进行任务切换 任务之间的通信采用OS提供的接口解决,通常用信号量、消息队列等,不要擅自定义全局变量 任务的功能划分要简明清晰,不要混杂其他模块的功能 当不需要某些系统提供的功能时,应当通过OS配置文件去除掉,以降低系统对资源的消耗,嵌入式程序员应该知道的0 x10个问题,嵌入式程序员应该知道的问题,用预处理指令#define声明一个常数,用以表明1年中有多少秒?,嵌入式程序员应该知道的问题,
6、写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?,嵌入式程序员应该知道的问题,预处理器标识#error的目的是什么?,嵌入式程序员应该知道的问题,嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?,嵌入式程序员应该知道的问题,用变量a给出下面的定义: An integer A pointer to an integer A pointer to a pointer to an integer An array of 10 integers An array of 10 pointers to integers A pointer to an array of 10 intege
7、rs A pointer to a function that takes an integer as an argument and returns an integer An array of ten pointers to functions that take an integer argument and return an integer,嵌入式程序员应该知道的问题,关键字static的作用是什么?,嵌入式程序员应该知道的问题,关键字const有什么含意?,嵌入式程序员应该知道的问题,关键字volatile有什么含意?并给出三个不同的例子;,嵌入式程序员应该知道的问题,给定一个整型
8、变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它位不变。,嵌入式程序员应该知道的问题,在某工程中,要求设置一绝对地址为0 x67a9的整型变量的值为0 xaa66;编译器是一个纯粹的ANSI编译器。写代码去完成这一任务?,嵌入式程序员应该知道的问题,中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展让标准C支持中断。一般使用一个新的关键字_interrupt。下面的代码就使用了_interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。 _interrupt double compute_area
9、 (double radius) double area = PI * radius * radius; printf(nArea = %f, area); return area; ,嵌入式程序员应该知道的问题,下面的代码是做什么的?void foo(void) unsigned int a = 6; int b = -20; (a+b 6) ? puts( 6) : puts(= 6); ,嵌入式程序员应该知道的问题,评价下下面这段代码?unsigned int zero = 0; unsigned int compzero = 0 xFFFF;,嵌入式程序员应该知道的问题,尽管不像非嵌入
10、式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。那么嵌入式系统中,动态分配内存可能发生的问题是什么?,嵌入式程序员应该知道的问题,Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子: #define dPS struct s * typedef struct s * tPS;以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?,嵌入式程序员应该知道的问题,C语言会有一些令人震惊的结构,下面的结构是合法的吗,如果是它做些什么? int a = 5, b = 7, c; c = a+b;,