嵌入式系统及应用-chapter07-嵌入式c语言程序设计ppt课件

嵌入式系统及应用-chapter07-嵌入式c语言程序设计ppt课件

ID:19869746

大小:133.00 KB

页数:45页

时间:2018-10-07

嵌入式系统及应用-chapter07-嵌入式c语言程序设计ppt课件_第1页
嵌入式系统及应用-chapter07-嵌入式c语言程序设计ppt课件_第2页
嵌入式系统及应用-chapter07-嵌入式c语言程序设计ppt课件_第3页
嵌入式系统及应用-chapter07-嵌入式c语言程序设计ppt课件_第4页
嵌入式系统及应用-chapter07-嵌入式c语言程序设计ppt课件_第5页
资源描述:

《嵌入式系统及应用-chapter07-嵌入式c语言程序设计ppt课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、嵌入式系统及应用第七章嵌入式C语言程序设计与汇编混合编程嵌入式代码的编写方法嵌入式C编程的0x10个经典问题与汇编混合编程内嵌汇编访问全局变量C与汇编互相调用内嵌汇编在C程序嵌入汇编程序,可以实现一些高级语言没有的功能,提高程序执行效率;内嵌汇编语法_asm{指令...指令}内嵌汇编举例__inlinevoidenable_IRQ(void) { inttmp; _asm { MRStmp,CPSR BICtmp,tmp,#0x80 MSRCPSR_C,tmp } }内嵌汇编使用限制物理寄存器限制不

2、能直接向PC寄存器赋值,程序跳转只能使用B或BL指令实现;通常内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而影响代码的效率.编译器可能会使用R12或R13存放编译的中间结果,在计算表达式的值时可能会将寄存器R0~R3,R12和R14用于子程序调用.内嵌汇编使用限制常量:常量前面的"#"可以省略.指令展开:如果包含常量操作数,该指令有可能被内嵌汇编器展开成几条指令.标号:C程序中的标号可以被内嵌的汇编指令使用,但是只有指令B可以使用C程序中的标号,而指令BL则不能使用.内存

3、单元的分配:内存分配均由C编译器完成,分配的内存单元通过变量供内嵌汇编器使用.内嵌汇编器不支持内嵌汇编程序中用于内存分配的伪指令.访问全局变量使用IMPORT伪指令引入全局变量,并利用LDR和STR指令根据全局变量的地址访问它们,对于不同类型的变量,需要采用不同选项的LDR和STR指令: unsignedcharLDRB/STRB unsignedshortLDRH/STRH unsignedintLDR/STR charLDRSB/STRSB shortLDRSH/STRSH访问全局变量举例ARE

4、Aglobats,CODE,READONLY EXPORTasmsubroutime IMPORTglovbvar asmsubroutime LDRR1,=glovbvar LDRR0,[R1] ADDR0,R0,#1 STRR0,[R1] MOVPC,LR ENDC语言和汇编相互调用在C程序和ARM汇编程序之间相互调用必须遵守ATPCS.C语言编译器编译的子程序满足用户指定的ATPCS类型.而对于汇编语言来说,完全要依赖用户来保证各个子程序满足选定的ATPCS类型.汇编语言子程序必须满足下面3个

5、条件:在子程序编写时必须遵守相应的ATPCS规则堆栈的使用要遵守相应的ATPCS规则在汇编编译器中使用-apcs选项基本ATPCS寄存器的使用规则堆栈的使用规则参数传送的规则寄存器使用规则子程序间通过R0-R3来传递参数子程序中使用R4-R11来保存局部变量R12用作过程调用中间临时寄存器R13用作堆栈指针R14用作连接寄存器,保存子程序返回地址R15用作程序计数器堆栈使用规则ATPCS规定堆栈为FD类型,即满递减堆栈,并且对堆栈的操作是8字节对齐.若包含外部调用,还必须满足:外部接口的堆栈必须是8

6、字节对齐的;在汇编程序中使用PRESERVE8伪指令告诉连接器,本汇编程序数据是8字节对齐的;参数传递规则当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用堆栈来传递参数;所有参数看作是存放在连续的内存字单元的字数据.然后,依次将各字数据传送到寄存器R0,R1,R2,R3中,如果参数多于4个,将剩余的字数据传送堆栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈.参数传递规则子程序结果返回结果为一个32位的整数时,可以通过寄存器R0返回;结果为一个64位的整数时

7、,可以通过寄存器R0和R1返回;结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或s0来返回;C程序调用汇编程序汇编程序的设置要遵循ATPCS规则,保证程序调用时参数的正确传递.在汇编程序中使用EXPORT伪指令声明本子程序,使其它程序可以调用此子程序.在C语言程序中使用extern关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序.C程序调用汇编程序举例#include externvoidstrcopy(char*d,constchar*s) intm

8、ain(void) { constchar*srcstr="Firststring-source"; chardststr[]="Secondstring-destion"; printf("Beforecopying."); printf("'%s''%s'",srcstr,dststr); strcopy(dststr,srcstr);/*调用汇编程序*/ printf("Aftercopying:"); printf("'%s''%s'"

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。