欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    嵌入式系统教学课件:34arm处理器编程分析.ppt

    • 资源ID:5970505       资源大小:6.20MB        全文页数:43页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式系统教学课件:34arm处理器编程分析.ppt

    3.4 汇编语言与C/C+的混合编程,在C或C+代码中实现汇编语言的方法有内联汇编和内嵌汇编两种,使用它们可以在C/C+程序中实现C/C+语言不能完成的一些工作。,嵌入式C语言程序设计基础,C语言“预处理伪指令”在嵌入式程序设计中的应用嵌入式程序设计中的函数及函数库嵌入式程序设计中常用的C语言语句嵌入式程序设计中C语言的变量、数组、结构、联合,C语言“预处理伪指令”在嵌入式程序设计中的应用,“预处理命令”可以改进程序设计的环境,提高编程效率,一般以#号打头,可分为以下三种:,文件包含宏定义条件编译,文件包含,文件包含伪指令可将头文件包含到程序中,头文件中定义的内容包括符号常量、复合变量原型、用户定义的变量类型原型和函数的原型说明等。编译器编译预处理时用文件包含的正文内容替换到实际程序中。文件包含伪指令的格式:#include;标准头文件#include“头文件名.h”;自定义头文件#include 宏标识符,宏定义,宏定义伪指令分为:简单宏、参数宏、条件宏、预定义宏及宏释放。,简单宏:#define 宏标识符 宏体 参数宏:#define 宏标识符(形式参数表)宏体条件宏定义:#ifdef宏标识符#ifndef 宏标识符#undef宏标识符#define宏标识符 宏体#define宏标识符 宏体#else#else#undef宏标识符#define宏标识符 宏体#define宏标识符 宏体#endif#endif,条件编译,条件编译伪指令是写给编译器的,指示编译器在满足某一条件时仅编译源文件中与之相应的部分。其格式如右框中所示:,#if(条件表达式1)#elif(条件表达式2)#elif(条件表达式n)#else#endif,嵌入式C语言程序编写的简单构架,#include预编译指令 C语言代码,一般要用#include编译指令将所需要的头文件加到该程序中,这是很有必要的,尤其是对编写较大的程序代码时。随后是定义一些外部变量,并对程序中的函数进行声明。主函数main()的编写;在每一个C语言代码中,一定要有一个main()函数,在该函数中完成该程序文件所要完成的各个功能,一般是通过调用各个子函数来完成。也可以调用其他文件中的函数。完成相应功能的各个功能函数的编写。各个函数之间可以相互调用。,嵌入式程序设计中常用的C语言语句,C语言语句格式为:标号:语句;,C语言语句很多,常用到的有以下几种:条件语句 swith语句循环语句,嵌入式C语言程序设计技巧,变量定义参数传递 循环条件,变量定义,在变量声明的时候,最好把所有相同类型的变量放在一起定义,这样可以优化存储器布局。例:对于局部变量类型的定义,使用short或char来定义变量并不是总能节省存储空间。有时使用32位int或unsinged int局部变量更有效率一些,如图所示:变量定义中,为了精简程序,程序员总是竭力避免使用冗余变量。但有时使用冗余变量可以减少存储器访问的次数这可以提高系统性能。,参数传递,为了使单独编译的C语言程序和汇编程序能够互相调用,定义了统一的函数过程调用标准ATPCS。ATPCS定义了寄存器组中的R0R3作为参数传递和结果返回寄存器,如果参数数目超过四个,则使用堆栈进行传递。内部寄存器的访问速度是远远大于存储器的,所以要尽量使参数传递在寄存器里面进行,即应尽量把函数的参数控制在四个以下。,循环条件,计数循环是程序中十分常用的流程控制结构,一般有以下两种形式:for(loop=1;loop=limit;loop+)for(loop=limit;loop!=0;loop-)这两种循环形式在逻辑上并没有效率差异,但是映射到具体的体系结构中时,就产生了很大的不同,如下图所示:,C与汇编语言混合编程,ATPCS介绍内嵌汇编C和ARM汇编程序间相互调用,ATPCS介绍,ATPCS(ARM-Thumb Procedure Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。,寄存器的使用规则,ATPCS规则寄存器的使用规则,子程序之间通过寄存器r0r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0r3可记作A1A4。在子程序中,使用寄存器r4r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4r11可记作V1V8。寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。寄存器r15称为程序计数器,记作PC。,数据栈的使用规则,根据堆栈指针指向位置的不同 和增长方向的不同可以分为以下4种数据栈:FD(Full Descending)满递减 ED(Empty Descending)空递减 FA(Full Ascending)满递增 EA(Empty Ascending)空递增ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。,参数的传递规则,参数个数固定的子程序参数传递规则:第一个整数参数,通过寄存器R0R3来传递。其他参数通过数据栈传递。参数个数可变的子程序参数传递规则:当参数不超过4个时,可以使用寄存器R0R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数 子程序结果返回规则 结果为一个32位的整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。,C和ARM汇编程序间相互调用,在C和ARM汇编程序之间相互调用必须遵守ATPCS(ARM-Thumb Procedure Call Standard)规则。C和汇编之间的相互调用可以从以下这三方面来介绍:,汇编程序对C全局变量的访问在C语言程序中调用汇编程序在汇编程序中调用C语言程序,汇编程序访问全局C变量,汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT关键词引入全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。对于不同类型的变量,需要采用不同选项的LDR和STR指令,如下所示:,unsigned charLDRB/STRBunsigned shortLDRH/STRHunsigned intLDR/STRchar LDRSB/STRSBshort LDRSH/STRSH,子程序-访问C 程序的全局变量,AREA globals,CODE,READONLYENTRYEXPORT asmsubroutimeIMPORT glovbvar;声明外部变量glovbvarLDR R1,=glovbvar;装载变量地址LDR R0,R1;读出数据ADD R0,R0,#1;加1 操作STR R0,R1;保存变量值MOV PC,LREND,在C语言程序中调用汇编程序,为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在汇编程序中需要使用EXPORT伪操作来声明,使得本程序可以被其它程序调用。同时,在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。,例如在一个汇编源文件中定义了如下求和函数:EXPORT add;声明add子程序将被外部函数调用 add;求和子程序add ADD r0,r0,r1 MOV pc,lr 在一个C程序的main()函数中对add汇编子程序进行了调用:extern int add(int x,int y);/声明add为外部函数 void main()int a=1,b=2,c;c=add(a,b);/调用add子程序 当main()函数调用add汇编子程序时,变量a、b的值会给了r0和r1,返回结果由r0带回,并赋值给变量c。函数调用结束后,变量c的值变成3。,在汇编程序中调用C语言程序,为了保证程序调用时参数的正确传递,汇编程序的设计要遵守ATPCS。在汇编程序调用C程序之前需要在汇编语言程序中使用IMPORT伪操作来声明C程序。在汇编程序中通过BL指令来调用子程序。,例如在一个C源文件中定义了如下求和函数:int add(int x,int y)return(x+y);调用add()函数的汇编程序结构如下:IMPORT add;声明要调用的C函数MOV r0,1MOV r1,2BL add;调用C函数add当进行函数调用时,使用r0和r1实现参数传递,返回结果由r0带回。函数调用结束后,r0的值变成3。,内嵌汇编,在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。嵌入式汇编在形式上表现为独立定义的函数体。,内嵌汇编指令的语法格式,_asm(“指令;指令”);ARM C汇编器使用关键字“_asm。如果有多条汇编指令需要嵌入,可以用“”将它们归为一条语句。如:_asm指令;指令指令需要特别注意的是_asm是两个下划线。,内嵌的汇编指令的特点,操作数可以是寄存器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进行操作。内嵌的汇编指令中使用物理寄存器有一些限制。常量前的符号“#”可以省略 只有指令B可以使用C程序中的标号,指令BL不能使用C程序中的标号。不支持汇编语言中用于内存分配的伪操作。指令中如果包含常量操作数,该指令可能会被汇编器展开成几条指令。,内嵌汇编器与armasm汇编器的区别,内嵌汇编器不支持通过“”指示符或PC获取当前指令地址;不支持LDR Rn,=expression伪指令,而使用MOV Rn,expression指令向寄存器赋值;不支持标号表达式;不支持ADR和ADRL伪指令;不支持BX和BLX指令;不可以向PC赋值;使用0 x前缀替代“”表示十六进制数。,内嵌汇编注意事项,必须小心使用物理寄存器,如R0R3,LR和PC。不要使用寄存器寻址变量。使用内嵌汇编时,编译器自己会保存和恢复它可能用到的寄存器,用户无须保存和恢复寄存器。LDM和STM指令的寄存器列表只允许物理寄存器。汇编语言用“,”作为操作数分隔符,嵌入汇编程序举例,使能IRQ 中断:_inline void enable_IRQ(void)int tmp_asm/嵌入汇编代码MRS tmp,CPSR/读取CPSR 的值BIC tmp,tmp,#0 x80/将IRQ 中断禁止位I 清零,即允许IRQ 中断MSR CPSR_c,tmp/设置CPSR 的值,“_c”表示控制域即7:0位,嵌入汇编程序举例,禁止IRQ 中断:_inline void disable_IRQ(void)int tmp;_asmMRS tmp,CPSRORR tmp,tmp,#0 x80MSR CPSR_c,tmp,本节描述如何在C+代码中使用C头文件。从C+调用C头文件之前,C头文件必须包含在externC命令中。本节包含以下两部分内容:(1)在C+中使用系统的C头文件;(2)在C+中使用自定义的C头文件。,3.C+中使用C头文件,要包括标准的系统 C 头文件,如 stdio.h,不必进行任何特殊操作,由编译器自动包含标准 C 头文件。,1在C+中使用系统C头文件,要包含自己的C头文件,用户必须将#include命令包在extern C语句中。,2在C+中使用自定义的C头文件,汇编程序、C程序及C+程序相互调用时,要特别注意遵守相应的AAPCS。下面一些例子具体说明了在这些混合调用中应注意遵守的AAPCS规则。,3.混合编程调用举例,ARM汇编程序设计,/c程序g()返回5个整数的和int g(int a,int b,int c,int d,int e)return a+b+c+d+e;汇编程序调用c程序g()计算5个整数i,2*i,3*i,4*i,5*i的和EXPORT fAREA f,CODE,READONLYIMPORT g;使用伪操作数IMPORT声明c程序g()STR lr,sp,#-4!;保存返回地址ADD r1,r0,r0;假设进入程序f时,r0中的值为i,r1值设为2*iADD r2,r1,r0;r2的值设为3*iADD r3,r1,r2;r3的值设为5*iSTR r3,sp,#-4!;第五个参数5*i通过数据栈传递ADD r3,r1,r1;r4值设为4*iBL g;调用c程序g()ADD sp,sp,#4;调整数据栈指针,准备返回LDR pc,sp,#4;返回END,汇编程序中调用C(1),汇编源文件asmfile.s:AREA asmfile,CODE,READONLYIMPORT cFunENTRYmovr0,#0 movr1,#1movr2,#2blcFunENDC源文件cfile.c:int cFun(int a,int b,int c)return a+b+c;,C程序调用汇编程序C程序,#include extern void asm_strcpy(const char*src,char*dst)int main()const char*ts=“Hello world!”;char d32;asm_strcpy(ts,d);printf(“source:%s”,ts);printf(“destination:%s”,d);return 0;,C程序调用汇编程序汇编程序,AREA asmfile,CODE,READONLYENTRYEXPORT asm_strcpyloopldrbr4,r0,#1 cmpr4,#0beqoverstrbr4,r1,#1bloopOvermov pc,lrEND,基于ARM的C语言与汇编语言混合编程举例,下面给出了一个向串口不断发送0 x55的例子:该工程的启动代码使用汇编语言编写,向串口发送数据使用C语言实现,下面是启动代码的整体框架:IMPORT MainAREA Init,CODE,READONLY;ENTRYBL Main;跳转到Main()函数处的C/C+程序END;标识汇编程序结束,下面是使用C语言编写的主函数:#include.incconfig.h/将有关硬件定义的头文件包含进来unsigned char data;/定义全局变量void main(void)Target_Init();/对目标板的硬件初始化 Delay(10);/延时 data=0 x55;/给全局变量赋值 while(1)Uart_Printf(%x,data);/向串口送数 Delay(10);,

    注意事项

    本文(嵌入式系统教学课件:34arm处理器编程分析.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开