嵌入式系统第9章.pptVIP

  • 9
  • 0
  • 约7.27千字
  • 约 46页
  • 2017-11-01 发布于湖北
  • 举报
嵌入式系统第9章

9.1 ATPCS概述 9.1.1 寄存器的使用规则 9.1.2 数据栈的使用规则 根据堆栈指针指向位置的不同 和增长方向的不同可以分为以下4种数据栈 : FD (Full Descending) 满递减 ED (Empty Descending)空递减 FA (Full Ascending) 满递增 EA (Empty Ascending) 空递增 ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。即按ATPCS规则,对数据栈的压栈或弹栈必须是偶数个字。 汇编程序中使用PRESERVE8伪操作告诉链接器。 9.1.3 参数的传递规则 参数个数可变的子程序参数传递规则: 当参数不超过4个时,可以使用寄存器R0 ~ R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数 参数个数固定的子程序参数传递规则: 第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递。 子程序结果返回规则 结果为一个32位的整数时,可以通过寄存器R0返回; 结果为一个64位整数时,可以通过寄存器R0和R1返回; 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或者s0来返回; 结果为一个复合型的浮点数(如复数)时,可以通过寄存器f0~fN或者d0~dN来返回。 参数传递—例子 9.2 使用内嵌汇编器 在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指令集。 内嵌汇编器是指包含在C编译器中的汇编器。使用内嵌汇编器后,就可以在C源程序中直接使用大部分ARM指令和Thumb指令,从而实现一些C语言不能直接完成的一些操作。如访问协处理器和程序状态寄存器PSR等。 9.2.1 内嵌汇编的语法格式 __asm(“指令[;指令]”); armcc C汇编器使用关键字“__asm”。如果有多条汇编指令需要嵌入,可以用“{}”将它们归为一条语句。 如: __asm { 指令[;指令] … [指令] } 需要特别注意的是__asm是两个下划线。 在汇编指令段中可以使用C语言的注释语句。 代码实例9-1 ex4-1.c 可以是寄存器、常量或C表达式。它们可以是char、short或者int类型,而且是作为无符号数进行操作 。 如果需要带符号数,则用户需要自己处理与符号有关的操作。 常量前的符号“#”可以省略 9.2.3 内嵌汇编指令应用举例 代码实例9-2 ex4_2.c 2. 使能和禁止中断 3. 点积计算 9.3 从汇编代码中访问C全局变量 汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT伪操作引入全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。 对于不同类型的变量,需要采用不同选项的LDR和STR指令,如下所示: 汇编程序访问全局C变量—例子 9.4 ARM汇编程序与C程序的相互调用 另外一种在C程序中使用汇编的方法是C程序和ARM汇编程序的相互调用。 9.4.1 ARM汇编程序调用C程序 当程序整体结构中汇编程序为主程序时,C程序中不能有main函数,只能有被调用的函数,并且函数中必须有返回语句return。相当于C程序库。 作为调用者的汇编程序则必须有ENTRY伪操作,表示汇编程序为主程序入口。 汇编程序中需要用IMPORT伪操作声明C程序中需要调用的函数名。 在汇编程序中要用BL指令调用C函数。 函数参数传递严格遵守ATPCS规则。 代码实例9-6 ex4_6.c 代码实例9-9 ex4_9.c 9.4.2 C程序调用ARM汇编程序 在C程序调用该汇编程序之前需要在C语言程序中使用extern关键词来声明该汇编程序。 在C语言程序中调用汇编程序—例子 代码实例9-10 ex4_10.c 嵌入式软件时态 分析时 对应事物:概念模型、用例、需求分析等 设计时 对应事物:物理模型、设计模式、接口及模块等 预编译时 编译预处理 编译时 内存的分配 运行时 内存使用,动态分配等 软件编译时内存的使用 静态内存(RAM区) 全局变量、全局数据结构、静态局部变量 只读(代码)区(可以是ROM区,也可以是RAM区) 程序代码、由DCD定义的常数、常数表 软件运行时内存的使用 静态内存(RAM区) 全局变量、全局数据结构、静态局部变量 自由内存(CPU内部寄存器+栈(RAM

文档评论(0)

1亿VIP精品文档

相关文档