《基于ARM的C语言程序设计》由会员分享,可在线阅读,更多相关《基于ARM的C语言程序设计(7页珍藏版)》请在金锄头文库上搜索。
1、本文格式为Word版,下载可任意编辑基于ARM的C语言程序设计 测验三 基于ARM的C语言程序设计 一、测验目的 1.了解ARM C语言的根本框架,学会使用ARM的C语言编程 二、测验设备 1. EL-ARM-830教学测验箱,PentiumII以上的PC机,仿真器电缆。 2. PC操作系统WIN98或WIN2000或WINXP,ARM SDT2.5或ADS1.2集成开发环境, 仿真器驱动程序 三、ARM C语言简介与使用规矩 1. ARM使用C语言编程是大势所趋 在应用系统的程序设计中,若全体的编程任务均由汇编语言来完成,其工作量巨大,并且不宜移植。由于ARM的程序执行速度较高,存储器的存储
2、速度和存储量也很高,因此,C语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植特别便当,程序的重复使用率提高,程序架构明显易懂,管理较为轻易等等。因此,C语言的在ARM编程中具有重要地位。 2. ARM C语言程序的根本规矩 在ARM程序的开发中,需要大量读写硬件寄放器,并且尽量缩短程序的执行时间的代码一般使用汇编语言来编写,譬如ARM的启动代码,ARM的操作系统的移植代码等,除此之外,绝大多数代码可以使用C语言来完成。 C语言使用的是标准的C语言,ARM的开发环境实际上就是嵌入了一个C语言的集成开发环境,只不过这个开发环境和ARM的硬件精细相关。 在使用C语言时,要用到和汇编语言
3、的混合编程。当汇编代码较为干脆,那么可使用直接内嵌汇编的方法,否那么,使用将汇编文件以文件的形式参与工程当中,通过ATPCS的规定与C程序相互调用与访问。 ATPCS,就是ARM、Thumb的过程调用标准(ARM/Thumb Procedure Call Standard),它规定了一些子程序间调用的根本规矩。如寄放器的使用规矩,堆栈的使用规矩,参数的传递规矩等。 在C程序和ARM的汇编程序之间相互调用务必遵守ATPCS。而使用ADS的C语言编译器编译的C语言子程序得志用户指定的ATPCS的规矩。但是,对于汇编语言来说,完全要凭借用户保证各个子程序遵循ATPCS的规矩。概括来说,汇编语言的子程
4、序应得志下面3个条件: 在子程序编写时,务必遵守相应的ATPCS规矩; 12 堆栈的使用要遵守相应的ATPCS规矩; 在汇编编译器中使用-atpcs选项。 根本的ATPCS规定,请详见相关技术文档。 汇编程序调用C程序 汇编程序的设置要遵循ATPCS规矩,保证程序调用时参数正确传递。 在汇编程序中使用IMPORT伪指令声明将要调用的C程序函数。 在调用C程序时,要正确设置入口参数,然后使用BL调用。 C程序调用汇编程序 汇编程序的设置要遵循ATPCS规矩,保证程序调用时参数正确传递。 在汇编程序中使用EXPORT伪指令声明本子程序,使其他程序可以调用此子程序。 在C语言中使用extern关键字
5、声明外部函数(声明要调用的汇编子程序)。 在C语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到C语言下的主程序,然后,执行C程序,在C环境下读写硬件的寄放器,一般是通过宏调用,在每个工程文件的Startup44b0/INC目次下都有一个44b.h的头文件,那里面定义了全体关于44B0的硬件寄放器的宏,对宏的读写,就能操作44B0的硬件。 概括的编程规矩同标准C语言。 3. 简朴的小例子 下面是一个简朴的小例子 IMPORT Main AREA Init ,CODE, READONLY; ENTRY LDR R0, =0x01d00000 LDR R1, =0x245
6、 STR R1 , R0 ;把0x245放到地址0X01D00000 BL Main ;跳转到Main()函数处的C/C+程序 END ;标识汇编程序终止 以上是一个简朴的程序,先寄放器初始化,然后跳转到Main()函数标识的C/C+代码处,执行主要任务,此处的 Main是声明的C语言中的Main()函数。 对宏的预定义,在44b.h中已定义,如: #define rPCONA (*(volatile unsigned *)0x1d20000) #define rPDATA (*(volatile unsigned *)0x1d20004) 13 #define rPCONB (*(volat
7、ile unsigned *)0x1d20008) #define rPDATB (*(volatile unsigned *)0x1d2000c) #define rPCONC (*(volatile unsigned *)0x1d20220) #define rPDATC (*(volatile unsigned *)0x1d20224) #define rPUPC (*(volatile unsigned *)0x1d20228) 在程序中实现, for(;) if(flag=0) for(i=0;i100000;i+); /延时 rPCONB = 0x7cf; rPDATB = 0x7
8、ef; for(i=0;i100000;i+); /延时 flag = 1; else for(i=0;i100000;i+); /延时 rPCONB = 0x7cf; rPDATB = 0x7df; for(i=0;i100000;i+); /延时 flag = 0; 完成对GPIO的B口的操作。 四、测验内容 1、理解以下程序,新建工程,参与下面的程序,并查看测验结果。 A、randtest.c extern unsigned int randomnumber(void); int maim() int i, nTemp; unsigned int random10; for(i=0;i1
9、0;i+) nTemp=randomunmber(); randomi=nTmep; return(0); 14 2. init.s GBLA _start AREA Word, CODE , READONLY ENTRY #-Setup interrupt / exception vectors #-Setup interrupt / exception vectors B Reset_Handler Undefined_Handler B Undefined_Handler SWI_Handler B SWI_Handler Prefetch_Handler B Prefetch_Hand
10、ler Abort_handler B Abort_Handler NOP /*Reserved vectors */ IRQ_Handler B IRQ_Handler FIQ_Handler B FIQ_Handler Reset_Handler LDR SP,=0X00002000 extern main LDR r0,=main MOV lr,pc BX r0 Stop B Stop END 3.random.s GBLA randomnumber randomnumber LDR ip,seedpointer LDMIA ip,a1,a2 TST a2,a2,LST#1 MOVS a3,a1,RRX ADC a2,a2,a2 EOR a3,a3,a1,LSL#12 EOR a1,a3,a3,LSR#20 STMIA ip,a1,a2 MOV pc,lr seedpointer DCD seed AREA seed,DATA,READWRITE seed DCD 0x55555555 DCD 0x55555555 END 15 2、用汇编语言实现1到100累加的函数,用C言语编写主程序,在主程序中调用所编写的汇编函数。 16 7