加嵌入式C语言概述.ppt_第1页
加嵌入式C语言概述.ppt_第2页
加嵌入式C语言概述.ppt_第3页
加嵌入式C语言概述.ppt_第4页
加嵌入式C语言概述.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式C语言概述,引入,变量定义的时机,for(loop=1;loop外部异步RAMFLASH/ROM,5活用位操作,/*方法1*/inti,j;i=879/16;j=562%32;/*方法2*/inti,j;i=8794;j=562-(56255);,#defineINT_I2_MASK0 x0040wTemp=inword(INT_MASK);outword(INT_MASK,wTemp,其它常见问题,汉字和图形的显示菜单的处理动画的处理键盘的处理时间的处理,IIARM中C和汇编混合编程,1.汇编举例2.ARM程序组织3.在C语言中内嵌汇编5在C中调用汇编的函数4.在汇编中使用C定义的全局变量6.在汇编中调用C的函数,AREAinit,CODE,READONLYCODE32Mode_USREQU0 x10;CPSR中各种处理器模式对应的控制位I_BitEQU0 x80;CPSR中的中断禁止位F_BitEQU0 x40USR_StackEQU0 x00203000;定义RAM的最高地址,无重映射ENTRYBInitReset;0 x00ResethandlerundefvecBundefvec;0 x04UndefinedInstructionswivecBswivec;0 x08SoftwareInterruptpabtvecBpabtvec;0 x0CPrefetchAbortdabtvecBdabtvec;0 x10DataAbortrsvdvecBrsvdvec;0 x14reservedirqvecBirqvec;0 x18IRQfiqvecBfiqvec;0 x1cFIQ,InitResetMSRCPSR_c,#Mode_USR|I_Bit|F_Bit;改成用户模式且禁止IRQ和FIQ中断LDRSP,=USR_StackBLX_main;跳转到_main执行,它,例2,3.在C语言中内嵌汇编,内嵌汇编使用的标记是_asm或者asm关键字,用法如下:_asminstruction;instructioninstructionasm(“instruction;instruction”);,内嵌汇编注意点,a.不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令b.在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突c.R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0到R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器d.一般不要直接指定物理寄存器,而让编译器进行分配,#includevoidmy_strcpy(constchar*src,char*dest)charch;_asmloop:ldrbch,src,#1strbch,dest,#1cmpch,#0bneloopintmain()char*a=forgetitandmoveon!;charb64;my_strcpy(a,b);printf(original:%s,a);printf(copyed:%s,b);return0;,内嵌汇编举例,C和汇编之间的值传递是用C的指针来实现的,因为指针对应的是地址,所以汇编中也可以访问。,4在汇编中使用C定义的全局变量,/*cfile.c*定义全局变量,并作为主调程序*/#includeintgVar_1=12;externasmDouble(void);intmain()printf(originalvalueofgVar_1is:%d,gVar_1);asmDouble();printf(modifiedvalueofgVar_1is:%d,gVar_1);return0;,;calledbymain(inC),todoubleaninteger,aglobalvardefinedinCisused.AREAasmfile,CODE,READONLYEXPORTasmDoubleIMPORTgVar_1asmDoubleldrr0,=gVar_1ldrr1,r0movr2,#2mulr3,r1,r2strr3,r0movpc,lrEND,5在C中调用汇编的函数,一是在C中声明函数原型,并加extern关键字;二是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识,最后用movpc,lr返回。然后,就可以在C中使用该函数了,例:在C中调用汇编的函数,/*cfile.c*inC,callanasmfunction,asm_strcpy*Sep9,2004*/#includeexternvoidasm_strcpy(constchar*src,char*dest);intmain()constchar*s=seasonsinthesun;chard32;asm_strcpy(s,d);printf(source:%s,s);printf(destination:%s,d);return0;,;asmfunctionimplementationAREAasmfile,CODE,READONLYEXPORTasm_strcpyasm_strcpyloopldrbr4,r0,#1;addressincrementafterreadcmpr4,#0beqoverstrbr4,r1,#1bloopovermovpc,lrEND,ATPCS(ARMThumbProcedureCallStandard),C和汇编之间的参数传递是通过ATPCS(ARMThumbProcedureCallStandard)的规定来进行的。简单的说就是如果函数有不多于四个参数,对应的用R0-R3来进行传递,多于4个时借助栈,函数的返回值通过R0来返回。,ATPCS是基于arm指令集和thumb指令集过程调用的规范。,ATPCS寄存器的使用规则,寄存器的使用必须满足下面的规则:1.子程序间通过寄存器R0R3来传递参数,这时,寄存器R0R3可以记作A1-A4。被调用的子程序在返回前无需恢复寄存器R0-R3的内容。2.在子程序中,使用寄存器R4R11来保存局部变量这时,寄存器R4-R11可以记作V1-V8。如果在子程序中使用到了寄存器V1-V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4-R7来保存局部变量。3.寄存器R12用作子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。在子程序间的连接代码段中常有这种使用规则。4.寄存器R13用作数据栈指针,记作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。5.寄存器R14称为连接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。6.寄存器R15是程序计数器,记作pc。它不能用作其他用途。,6在汇编中调用C的函数,在汇编中调用C的函数,需要在汇编中IMPORT对应的C函数名,然后将C的代码放在一个独立的C文件中进行编译,剩下的工作由连接器来处理。,例:在汇编中调用C的函数,;thedetailsofparameterstransfercomesfromATPCS;iftherearemorethan4args,stackwillbeusedEXPORTasmfileAREAasmfile,CODE,READONLYIMPORTcFunENTRYmovr0,#11m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论