网站大量收购闲置独家精品文档,联系QQ:2885784924

05-基于ARM的嵌入式程序设计.ppt

  1. 1、本文档共50页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主要内容: 一、ARM 汇编语言程序设计 1、两种常用 IDE 简介 2、ADS/SDT 下的伪操作 3、ARM 汇编语言伪指令 4、ARM 汇编语言的文件和语句 5、ARM 汇编语言编程的几个问题 6、ARM 汇编语言编程示例 二、C 与汇编语言混合编程 1、嵌入式 C 语言程序设计的几个问题 2、C 与汇编语言混合编程及示例 三、ARM 汇编语言编程示例 参数个数固定的子程序参数传递规则:   第一个整数参数,通过寄存器R0~R3来传递。其他参数通过数据栈传递。 参数个数可变的子程序参数传递规则:   当参数不超过4个时,可以使用寄存器R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数 子程序结果返回规则   结果为一个32位整数时,可以通过寄存器R0返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。 参数的传递规则   在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。   armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指令集。所以,同一个C程序中不能同时包含ARM指令和Thumb指令。   内嵌的汇编指令包括大部分的ARM指令和Thumb指令,但是不能直接引用C的变量定义,数据交换必须通过ATPCS进行。   嵌入式汇编在形式上表现为独立定义的函数体。 ② 内嵌汇编 内嵌汇编示例: # include stdio.h void astrcpy(char *p1,char *p2) { char tempch; __asm  {  loop:LDRB tempch,[p1],#1    STRB tempch,[p2],#1    CMP tempch,#0    BNE loop  } } void main() { …定义并初始化str1、str2, …定义字符串tempstr __asm  {  MOV R0,str1  MOV R1,str2  MOV R2,tempstr  BL astrcpy,(R0,R2)  BL astrcpy,(R1,R0)  BL astrcpy,(R2,R1)  } } ③ C和ARM汇编程序间相互调用 遵守ATPCS的前提下,注意export和extern的配合使用 示例:C程序调用汇编程序 #include stdio.h extern void strcpy(char *,char *) void main() {  char *src=“source”;  char *dst=“destination”;  strcpy(dst,src);  printf(“%s\n%s\n”,src,dst); } area Scopy,code,readonly export strcpy strcpy  LDRB R2,[R1],#1  STRB R2,[R0],#1  CMP R2,#0  BNE strcpy  MOV PC,LR end 示例:汇编程序调用C程序 int g(int a,int b,int c,int d,int e) {  return a+b+c+d+e; }   C程序用于计算五个数之和 汇编程序则把四个放入R0~R3, 最后一个放在数据栈内;   编译器判断出需要几个参数, 自动取得。 area f,code,readonly extern g  STR LR,[SP,#-4]!  ADD R1,R0,R0  ADD R2,R1,R0  ADD R3,R1,R2  STR R3,[SP,#-4]!  ADD R3,R1,R1  BL g  ADD SP,SP,#4  LDR PC,[SP],#4 end 1、求两个向量的点积 2、SWI 软件中断 3、IRQ 中断 4、异常中断向量表的搬运 例程 1:求两个向量的点积 #include stdio.h #define low32(a) (((unsigned *)a)[0]) #define high32(a) (((int *)a)[1]) ; 小端存储模式 void main() {  int a[10] = {1,2,3,4,5,6,7,8,9,10};  int b[10] = {10,9,8,7,6,5,4,3,2,1};  printf(“Dotprod is %ld \n”, dotprod(a,b,10)); } __int64 dotprod(int *a, int *b, unsigned n) {  __int64 sum=0;  do { sum += mlal(sum, *a++, *b++); } while

文档评论(0)

wendan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档