版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在嵌入式系统开发中,目前使用的主要编程语言是C语言和汇编语言。在稍大规模的嵌入式软件中,如操作系统,大部分代码都是用C语言编写的,因为C语言的结构比较好,人们容易理解,并且有大量的支持库。汇编语言,如硬件系统启动时的初始化,包括设置中央处理器状态、启用中断、设置主频率、控制参数和初始化内存。一些中断处理方面也可能涉及汇编。C语言和汇编语言,在C语言中嵌入汇编指令以在汇编程序和C程序之间交换变量,在汇编程序和C程序之间相互调用,1在C语言中嵌入汇编指令,在C语言中嵌入汇编指令包含大多数ARM和Thumb指令,但也有一些局限性,主要表现在以下几个方面:不能直接给PC寄存器赋值,B或BL指令应该用于
2、程序跳转。使用物理寄存器时,不要使用太复杂的C表达式来避免物理寄存器冲突。R12和R13可以被编译器用来存储中间编译结果。计算表达式值时,R0至R3、R12和R14可用于子程序调用。因此,为了避免直接使用这些物理寄存器,嵌入式汇编中使用的标记是_asm,用法如下:_asm指令;指令指令,void enable _ IRQ(void)int tmp;_asm MRS tmp,CPSR BIC tmp,tmp,#80 MSR CPSR_c,tmp,void disable _ IRQ(void)int tmp;_asm MRS tmp,CPSR ORR tmp,tmp,#80 MSR CPSR_c
3、,tmp,80=0 x50=0b1010000,#包括void my_strcpy(const char *src,char * dest)char ch;_asm loop: ldrbch,src,#1 strbch,dest,#1 cmpch,# 0 bneloop,int main() char *a=算了,继续前进!char b64my_strcpy(a,b);printf(原始: %s,a);printf(copyed:%s,b);返回0;在程序中定义一个变量,在编译时给变量分配一个存储单元,并根据变量的类型确定存储单元的大小。例如:整数2字节,实数4字节。内存中的每个字节都有一个数
4、字,这就是“地址”。对于每个变量,它在内存中有一个存储位置,这是变量的地址,对变量值的访问是通过这个地址进行的。这个地址在C语言中被形象地称为“指针”。指针:变量的地址。指针变量:存储地址的变量。指针变量必须在用于指向特定类型的变量之前定义。指针变量的地址必须定义为“指针类型”。定义的一般形式:基类型*指针变量名;基本类型:用于指定指针变量可以指向的变量类型。将决定指针移动和操作的量。组成:存储类型数据类型*:指示变量是指针类型。注:1 .指针变量名是p1,p2,不是* P1,* P2。指针变量只能指向定义期间指定类型的变量。3.定义指针变量后,变量值是不确定的,必须在应用前赋值。2.由C定义
5、的全局变量在汇编中使用。汇编全局变量访问方法:通过地址访问C,使用INPORT/EXTERN伪操作引用全局变量,使用LDR伪指令读取全局变量,使用STR指令存储全局变量,将示例:globvar的地址加载到R1,将地址中包含的值加载到R0并加上2。结果保存在globvar中。保留8个区域全局,代码,只读导出ASM子程序导入全局变量;引入全局变量globvar ASM子程序ldrr1,=globvar ldrr0,r1addr0,r0,# 2strr0,r1movpc,lrend,2在汇编中使用c定义的全局变量,#包括int gVar _ 1=12外部双重(无效);int main()printf
6、(GVAr _ 1的原始值为: %d,GVAr _ 1);asmDouble();printf(GVAr _ 1的修改值为: %d,GVAr _ 1);返回0;AREA asmfile,CODE,READONLY EXport as Double IMPORTgVar _ 1 as Double ldr r0,=gVar_1 ldrr1,r0 movr2,#2 mulr3,r1,r2 strr3,r0 movpc,lr END,2。在C语言中访问编译后的程序数据。访问方法:用EXPORT/GLOBAL伪操作在C语言中声明全局标签,在C语言中定义相应的数据类型指针变量,将指针变量指定为程序集中的
7、全局标签,并使用该指针访问程序集中的数据。3.将程序集和C相互调用。1.用c语言调用汇编文件中的函数。主要有两个任务。其次,导出程序集中的函数名,并将其用作汇编代码段的标识符,最后用movpc和lr返回它。示例:将一个字符串分配给另一个字符串,包括# extern void strcopy(char * d,const char * s);Int main()常量字符*srcstr=源字符串;Char dststr=目标字符串;Printf(“在复制:n之前”);printf(“% sn % sn”,srcstr,dstr);Strcopy(srcstr,dstr);Printf(“复制:n后
8、”);printf(“% sn % sn”,srcstr,dstr);返回(0);保留8个区域搜索,代码,只读导出strcopy ldrbr2,R1,# 1 strrbr2,r0,# 1 cmpr2,0bne strcopy movpc,lrend,调用assembly中的c函数,调用assembly中的c函数,在assemBLy中导入相应的c函数名称,使用bl指令调用导出ASM文件区域ASM文件,代码,只读导入cfun条目movr0,# 11movr1,# 22movr2,# 33blc fun end/* cfile。由asmfile */intcFun调用(int a,int b,int c)返回a b c;int g(int a,int b,int c,int d,int e,int f)printf(“e=% dn”,e);printf(“f=% dn”,f);返回(a b c d e f);汇编程序调用c程序g()来计算6个整数I,2 * i,2*i,3*i,4*i,5*i,6*i,5 * I和6 * I的和,假设r0中的内容是I导出f区f,代码,只读导入g加R1,R0和R0;R1存储第二个参数2 *我添加r 2,R1和R0;R2存储第三个参数3 *我加上r 3、R2和R0;R3存储第四个参数4 *我加上r 4,R3和R0;R
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 穿经工冲突解决能力考核试卷含答案
- 轴承零件制造工安全文明水平考核试卷含答案
- 科研助理工作技能评优考核试卷含答案
- 中药炮炙工岗中安全规程考核试卷含答案
- 戏鞋工安全防护评优考核试卷含答案
- 鱼糜制作工岗前责任意识考核试卷含答案
- 生物农药生产工操作知识模拟考核试卷含答案
- 信号设备制造钳工创新方法知识考核试卷含答案
- 2026年山东医疗卫生事业单位招聘(医学影像技术)备考试题库资料含答案
- 2026年事业单位社会科学专技B类综合应用能力高分模拟试卷
- 老年人白内障课件
- 酒店总经理转正述职报告
- 2026中国移动校园招聘备考考试题库附答案解析
- 2025年陪诊师考试题库(附答案)
- 三一研发项目管理办法
- 运营商反诈知识培训课件
- 北大印章管理办法
- 前列腺癌护理个案查房
- 患者自行拔出尿管护理不良事件
- 高三化学一轮复习-配合物 课件
- 2024江苏南京证券校园招聘129人高频500题难、易错点模拟试题附带答案详解
评论
0/150
提交评论