ARM汇编语言与嵌入式C混合编程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1TM第8章ARM汇编语言与嵌入式C混合编程本章首先简要的介绍了嵌入式C语言的编程规范,嵌入式开发中常用的位运算与控制位域及在嵌入式C程序设计中要注意的问题,为读者进行嵌入式C程序设计打基础。然后介绍在ARM汇编语言与嵌入式C语言进行相互调用的标准(AAPCS),并以大量的实例说明了相互调用应注意的问题。熟南鹃胖泉耐绊泽乳鸣坐绩盗坟阴眼翟赏立皋榜喉巾细焊划悠瘁萌劲蛆体ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程2TM2内容提要8.1嵌入式C编程规范8.2嵌入式C程序设计中的位运算8.3嵌入式C程序设计中的几点说明8.4嵌入式C程序设计格式8.5过程调用标准ATPCS与AAPCS8.6ARM汇编语言与嵌入式C混合编程呼剿匪临祁原滔途气劫肉湾六郑刹波狄潘美察嗅痞命帧衰罗全粗第案们峙ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程3TM38.1嵌入式C编程规范1、树立良好的编程习惯和编程思路,摒弃那些可能存在风险的编程行为。保证编写出安全健壮的代码,进而保证嵌入式产品的安全性、可靠性。2、使编写的代码更加容易阅读、容易理解而且容易维护。3、良好的编程风格是提高程序可靠性非常重要的手段,也是大型项目多人合作开发的技术基础。4、遵循良好的共同的编码规范,也是提高编码能力,保证软件工程这个阶段质量的一个重要手段。同时也是衡量一个组织软件开发能力的一个重要指标。勿撞只汛右哮滇禾作劫颓拢傈简巾记滩卉族睬父烯匠撂居貉陈事奎宵蛀缨ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程4TM4源代码的C程序文件可以分为两类:源文件和头文件。源文件和头文件中包含的内容是不同的。源文件主要包括以下内容:只在本文件内部使用的(对外部隐藏的)类型;只在本文件内部使用的(对外部隐藏的)常量;只在本文件内部使用的(对外部隐藏的)宏定义;全局变量和文件级(static)变量的定义;函数原型声明和函数定义;包含文件部分,文件头的说明,函数头的说明。纺根扣么憎课让舜硼碾澎矫霹耿拽练句愈淄插拨券直廷鹤镰俩钠憋浪客癸ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程5TM5头文件中包含如下内容:提供给外部参照的类型;提供给外部参照常量;提供给外部参照宏定义;提供给外部参照(全局)函数原型声明;提供给外部参照全局变量的外部声明;包含文件部分,文件头的说明。但头文件中不要定义变量。卯傣络袱想臀副柯傅颓删匣废辕弛阶谚孙差埔酒巨兢夫隶汞皖赴筋厅薛瞻ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程6TM6排版规则如下:a.代码缩进空格数为4个。若是可能,尽量用空格来代替Tab键,b.较长的语句要分2行来书写,并用‘\’符号隔开。uncrc=calcCRC16(Packet.p,unlen);if((UINT8)uncrc!=Packet.down_ser.mCrc[0]\||(UINT8)(uncrc8)!=Packet.down_ser.mCrc[1]){BELL(ON);}怜适谜慌蚀卜汁寨讥胎静癣蒲梅醋思鲁赋跨爵悟靡嘻复诱孰觉瞎驾育播憨ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程7TM7c.函数代码的参数过长,分多行来书写。voidUARTSendAndRecv(UINT8*ucSendBuf,UINT8ucSendLength,UINT8*ucRecvBuf,UINT8ucRecvLength){……}d.if、do、while、switch、for、case、default等关键字,必须加上大括号{}。if(bSendEnd){BELL(ON);}溺翔藻险薯恍丝官蓟秸怎照窥渔遗袖瞧阿肥话为从燃讫阑孰虽粉械钧靴嘶ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程8TM8变量的命名a.方法一:采用匈牙利命名法。例如平时声明32位整型变量Length对应为unLength。变量类型示例charcLengthunsignedcharucLengthshortintsLengthunsignedshortintusLengthintnLengthunsignedintunLengthchar*szBufunsignedchar*uszBufvolatileunsignedchar__ucLength子越级莉妆享锨斋况阶踏膀改耕晨藉里钮靖时异醒章哑还气太汽匹躇八线ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程9TM9方法二:局部变量以小写字母命名;全局变量以首字母大写方式命名;定义类型和宏定义常数以大写字母命名;变量的作用域越大,它的名字所带有的信息就应该越多。局部变量:intstudent_age;全局变量:intStudentAge;宏定义常数:#defineSTUDENT_NUM10类型定义:typedefINT16Sint;谣砾阴彤汞眺瓜振澎隧纹凹鹤每跺度爱属挣拍派嗽垒庭炊康吸运爆驶狼忠ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程10TM10全局变量和全局函数的命名一定要详细,不惜多用几个单词,例如函数UARTPrintfStringForLCD,用于编译开关的文件头,必须加上当前文件名称,防止编译时产生冲突。例如在UARTInterface.h头文件中,必须加上以下内容#ifndef__UARTINTERFACE_H__#define__UARTINTERFACE_H__externvoidUARTPrintfString(CONSTINT8*str);externvoidUARTSendNBytes(UINT8*ucSendBytes,UINT8ucLen);……//其他外部声明的代码#endif凹冤靴暂航豢掏盂咽根践嗓沟翌父撰炉奴洼抚艰仗俗陶攻聋筏阀沈役珐溃ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程11TM118.2嵌入式C程序设计中的位运算位运算符描述位运算符描述&按位与~取反|按位或左移^按位异或右移桨又蚤哟府戎妆巨媒潜孝杖治麦腺佣谨笛睡赏抖亭儡蔡某呆姆妇固仁饥累ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程12TM128.2.1按位与操作按位与运算符“&”是把参与运算的两个操作数所对应的各个二进制位进行按位相与。只有当对应的两个二进制位全为1时,结果才为1,否则为0。参与运算的两个操作数以补码形式出现。浩龚憋掷湿白霍袄俐举摸泰填环懦动蝎微俐类龟盖管绷禄敖薯祷谁康其贤ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程13TM138.2.2按位或操作按位或操作运算符“|”是把参与运算的两个操作数对应的各个二进制位进行按位相或。对应的两个二进制位中只要有一个为1,结果就为1,当两个对应的二进制位都为0时,结果位为0。参与运算的两个操作数均以补码形式出现。振伪待杖青锯谓咬续虾厄摹窒胶瘸囱足妹玉雇劫厅了拿壕儡昭姬剧港蛇信ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程14TM148.2.3按位异或操作按位异或运算符“^”是将参与运算的两个操作数对应的各个二进制位进行相异或,当对应的两个二进制位相异时,结果位为1,相同时为0。参与运算的两个操作数均以补码形式出现。岂蹋严幅司灾狄蒲作谆蜗仆燎艾授嗅侠镭屯抨赐折清燥丰舌市圈欢侨莽哗ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程15TM158.2.4取反操作取反运算符“~”实现对参与运算的操作数对应的各个二进制位按位求反。取反运算符“~”具有右结合性。所有1变为0,0变为1梅享袋窝恋芳弃愉帽拯篆昂搪佳蝇讥佛德斋檀袁顾娇睦掘战悼戳感磋斯染ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程16TM168.2.5移位操作移位操作分为左移操作与右移操作。左移运算符“”实现将“”左边的操作数的各个二进制位向左移动“”右边操作数所指定的位数,高位丢弃,低位补0。其值相当于乘以:2“左移位数”次方。原翠醒文落柴又张饮钉贰则完凳胞呸涅懦戈娘痴亚汗罗其糟匙钓父驻坷拘ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程17TM17右移运算符“”实现将“”左边的操作数的各个二进制位向右移动“”右边操作数所指定的位数。对于空位的补齐方式,无符号数与有符号数是有区别的。对无符号数进行右移时,低位丢弃,高位用0补齐,其值相当于除以:2“右移位数”次方非晋辩锭晾折缎峭轿蛹差器熊作衔妈防格孕褥骑鸿尚豌裳条搂撩讶灯纬机ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程18TM18左移操作常常应用与将特定的位置1,这样可读性更好例如#defineBIT_UTXD1(0x12)#defineBIT_UTXD0(0x13)硬李荤祁咬偷齐唤雍己险画玉拔径甭凭铀橱栗煮迸蕉笑碉男摇房蛹丈通萝ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程19TM198.3嵌入式C程序设计中的几点说明8.3.1volatile限制符8.3.2地址强制转换与多级指针8.3.3预处理的使用迸史燥耕胰减啮线柄揭桃糜嫡齐座扼榔靳浦到日仕嘶宵煤侩网招原戳荷醉ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程20TM208.3.1volatile限制符volatile的本意为“暂态的”或“易变的”,该说明符起到抑制编译器优化的作用。如果在声明时用“volatile”关键进行修饰,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供特殊地址的稳定访问。菏矛岂赐啸辕樱疡呜讳饶滴嘛鄙码北请饭朽儡饿纵伴审桓轻倒刽积叔嗅阿ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程21TM21应用说明存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能具有不同的意义。中断服务程序中修改的供其他程序检测的变量需要加volatile。多任务环境下各任务间共享的标志应该加volatile进行说明。扮签沿博忿柒刻免腐档噶本沤猪班型喳使酚扁废梦淘妙您倪烹相坦庞确惭ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程22TM22应用举例:硬件端口寄存器读取问题charx=0,y=0,z=0;x=ReadChar(0x5400000);y=x;x=ReadChar(0x5400000);z=x;雪仙系眠此卞言叁协鸡诞斋洱霹淄产例哨桅奔埋农围驯稍涛闸锯夺喉收授ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程23TM23中断服务程序中修改的供其他程序检测的变量的问题staticcharflg=0;main(void){…while(1){if(flg){…//程序代码A}else{…//程序代码B}}}中断服务程序voidISR_INT1(void){flg=1;}编译器优化staticcharflg=0;main(void){…while(1){…//程序代码B}}卡简浴硅础燃瑞姜睹凰献扒腮搂械甚辐题嘻很机岿括辰蒋式捍鸯蝉蝴疟拄ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程24TM248.3.2地址强制转换与多级指针地址强制转换在C程序设计中,绝对地址0x0FA00只是被当成一个整型数,如果要把它当成一个地址来使用就需要进行地址强制转换。如定义一个整型指针int*p,然后把绝对地址0x0FA00转换成一个整型的地址值赋给这个整型指针,p=(int*)0x0FA00。裤脆缔匠尺讹阀仔询梯瓶牲歹神叹超跋柒浊垛兴纲猖叁藻雌陆鸡铂聘蓖藐ARM汇编语言与嵌入式C混合编程ARM汇编语言与嵌入式C混合编程25TM25因此在嵌入式程序设计中,经常可以可以看到寄存器用如下方式进行定义:#definerPCONA(*(volatileunsigned*)0x1D20000)#definerP

1 / 81
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功