- 1、本文档共43页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章嵌入式Cc编程
函数指针的相关问题: C语言中函数名直接对应于函数生成的指令代码在内存中的地址,因此函数名可以直接赋给指向函数的指针; 调用函数实际上等同于“跳转指令 + 参数传递处理 + 回归位置入栈”,本质上最核心的操作是将函数生成的目标代码的首地址赋给CPU的PC寄存器(指令指针寄存器); 因为函数调用的本质是跳转到某一个地址单元的code去执行,所以可以“调用”一个根本就不存在的函数实体; Reset例子: 在ARM中,CPU启动后跳转到绝对地址0行,对应的函数可以定义为: typedef void (*sys_reset)(); sys_reset reset = (sys_reset) 0x0; … reset(); 3、数组与动态申请 从静态存储区域分配。内存在程序编译的时候分配好,在程序的整个运行期间都存在。例如全局变量,static变量。 在栈上创建。在执行函数时,函数内局部变量的存储单元可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。 适合动态分配的条件: malloc/free char* p=malloc(…); if(p==NULL) …; function(p) { …/*一系列针对p的操作*/ } … free(p); p=NULL; 不适合静态分配,如需要内存太大 需要的空间在运行时才能确定 4.CPU字长与存储器位宽不一致 ARM处理器字长为32位,而NOR FLASH的位宽为8位,需要为NOR FLASH提供读写字节、半字和字的接口 typedef unsigned char BYTE; typedef unsigned short HWORD; typedef unsigned int WORD; /*函数功能:读NVRAM中字节 *参数:offset,读取位置相对NVRAM基地址的偏移 *返回:读取到的字节值*/ extern BYTE nr_read_byte(WORD offset) {return *((BYTE*)(NVRAM+offset*4));} /*函数功能:向NVRAM中写一个字节 *参数:offset,写入位置相对NVRAM基地址的偏移 *data,欲写入的字节 */ extern void WriteByteNVRAM(WORD offset,BYTE data) { *((BYTE*)(NVRAM+offset*4)) = data; } 练习:完成字/半字的写入,以及根据不同的字节顺序正确读写的代码。 1、使用宏定义或内联函数 2、使用寄存器变量 3、利用硬件特性 4、活用位操作 5、内嵌汇编 1.使用宏定义或内联函数 在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。 2.使用寄存器变量 只有局部自动变量和形参才可以定义为寄存器变量 register是一个“建议”型关键字 3.利用硬件特性 寄存器CPU内部RAM(Cache)外部同步RAM外部异步RAMFLASH/ROM 若程序代码已经被烧录在FLASH或ROM中,我们可以让CPU直接从其中读取代码执行 对于UART等设备,其内部有一定容量的接收BUFFER,我们应尽量在BUFFER被占满后再向CPU提出中断。 采用DMA读取,其数据传输的基本单位是块,而所传输的数据是从设备直接送入内存的(或者相反)。 4.活用位操作 使用C语言的位操作可以减少除法和取模的运算。灵活的位操作可以有效地提高程序运行的效率。 /*方法1*/ int i,j; i=879/16; j=562%32; /*方法2*/ int i,j; i=8794; j=562-(56255); 5.内嵌汇编 程序中对时间要求苛刻的部分可以用内嵌汇编来重写,以带来速度上的显著提高。 20%的程序消耗了80%的运行时间,改进效率,最主要是考虑改进那20%的代码 /*把两个输入参数的值相加,结果存放到另外一个全局变量中*/ int result; void add(long a, long* b) { _asm { LDR r0, a LDR r1, [b] ADD r2, r0, r1 STR result, r2 } } 举例: 4.3.1 ARM C ++编译器及语言库设计 ARM C++编译器及语言库介绍 本章对嵌入式编程语言作了简单阐述,嵌入式编
文档评论(0)