《宸特C语言实验案例.pdf》由会员分享,可在线阅读,更多相关《宸特C语言实验案例.pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验三 基于 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 语言简介与使用规则 三、ARM C 语言简介与使用规则 1.ARM 使用 C 语言编程是大势所趋 1.ARM 使用 C 语言编程是大势所趋 在
2、应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大,并且不宜移植。由于 ARM 的程序执行速度较高,存储器的存储速度和存储量也很高,因此,C 语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。因此,C 语言的在 ARM 编程中具有重要地位。2.ARM C 语言程序的基本规则 2.ARM C 语言程序的基本规则 在 ARM 程序的开发中,需要大量读写硬件寄存器,并且尽量缩短程序的执行时间的代码一般使用汇编语言来编写,比如 ARM 的启动代码,ARM 的操作系统的移植代码等,除此之外,绝大多数代码可
3、以使用 C 语言来完成。C 语言使用的是标准的 C 语言,ARM 的开发环境实际上就是嵌入了一个 C 语言的集成开发环境,只不过这个开发环境和 ARM 的硬件紧密相关。在使用 C 语言时,要用到和汇编语言的混合编程。当汇编代码较为简洁,则可使用直接内嵌汇编的方法,否则,使用将汇编文件以文件的形式加入项目当中,通过ATPCS 的规定与 C 程序相互调用与访问。ATPCS,就是 ARM、Thumb 的过程调用标准(ARM/Thumb Procedure Call Standard),它规定了一些子程序间调用的基本规则。如寄存器的使用规则,堆栈的使用规则,参数的传递规则等。在 C 程序和 ARM 的
4、汇编程序之间相互调用必须遵守 ATPCS。而使用 ADS 的 C 语言编译器编译的 C 语言子程序满足用户指定的 ATPCS 的规则。但是,对于汇编语言来说,完全要依赖用户保证各个子程序遵循 ATPCS 的规则。具体来说,汇编语言的子程序应满足下面 3 个条件:在子程序编写时,必须遵守相应的 ATPCS 规则;堆栈的使用要遵守相应的 ATPCS 规则;在汇编编译器中使用-atpcs 选项。基本的 ATPCS 规定,请详见相关技术文档。汇编程序调用 C 程序 汇编程序调用 C 程序 汇编程序的设置要遵循 ATPCS 规则,保证程序调用时参数正确传递。在汇编程序中使用 IMPORT 伪指令声明将要
5、调用的 C 程序函数。在调用 C 程序时,要正确设置入口参数,然后使用 BL 调用。C 程序调用汇编程序 C 程序调用汇编程序 汇编程序的设置要遵循 ATPCS 规则,保证程序调用时参数正确传递。在汇编程序中使用 EXPORT 伪指令声明本子程序,使其他程序可以调用此子程序。在 C 语言中使用 extern 关键字声明外部函数(声明要调用的汇编子程序)。在 C 语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动程序,跳到 C 语言下的主程序,然后,执行 C 程序,在 C 环境下读写硬件的寄存器,一般是通过宏调用,在每个项目文件的 Startup44b0/INC 目录下都有一个
6、44b.h的头文件,那里面定义了所有关于 44B0 的硬件寄存器的宏,对宏的读写,就能操作 44B0 的硬件。具体的编程规则同标准 C 语言。3.简单的小例子 3.简单的小例子 下面是一个简单的小例子 IMPORT Main AREA Init,CODE,READONLY;ENTRY LDR R0,=0 x01d00000 LDR R1,=0 x245 STR R1,R0 ;把 0 x245 放到地址 0X01D00000 BL Main ;跳转到 Main()函数处的 C/C+程序 END ;标识汇编程序结束 以上是一个简单的程序,先寄存器初始化,然后跳转到 Main()函数标识的 C/C+
7、代码处,执行主要任务,此处的 Main 是声明的 C 语言中的 Main()函数。对宏的预定义,在 44b.h 中已定义,如:#define rPCONA (*(volatile unsigned*)0 x1d20000)#define rPDATA (*(volatile unsigned*)0 x1d20004)#define rPCONB (*(volatile unsigned*)0 x1d20008)#define rPDATB (*(volatile unsigned*)0 x1d2000c)#define rPCONC (*(volatile unsigned*)0 x1d200
8、10)#define rPDATC (*(volatile unsigned*)0 x1d20014)#define rPUPC (*(volatile unsigned*)0 x1d20018)在程序中实现,for(;)if(flag=0)for(i=0;i100000;i+);/延时 rPCONB=0 x7cf;rPCONB=0 x7cf;rPDATB=0 x7ef;rPDATB=0 x7ef;for(i=0;i100000;i+);/延时 flag=1;else for(i=0;i100000;i+);/延时 rPCONB=0 x7cf;rPCONB=0 x7cf;rPDATB=0 x7
9、df;rPDATB=0 x7df;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;i10;i+)nTemp=randomunmber();randomi=nTmep;return(0);2.init.s GBLA _start AREA Word,CODE
10、,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_Handler Abort_handler B Abort_Handler NOP /*Reserved vectors*/IRQ_Handler B IRQ_Handler FIQ_Handler B FIQ_
11、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 0 x55555555 DCD 0 x55555555 END 2、用汇编语言实现 1 到 100 累加的函数,用 C 言语编写主程序,在主程序中调用所编写的汇编函数。
限制150内