首页 百科知识 语言实验程序

语言实验程序

时间:2023-10-27 百科知识 版权反馈
【摘要】:(2)软件:μVision IDE for ARM集成开发环境,Windows 98/2000/NT/XP.当正常的程序执行流程暂时挂起时,称之为异常,例如处理一个外部的中断请求.在处理异常之前,必须保存当前的处理器状态,以便从异常程序返回时可以继续执行当前的程序.ARM异常向量表如下:由上可见,Reset入口,即为整个程序的实际入口点.因此,我们在编写代码的时候,第一条语句是在0x0000000

5.4 C语言实验程序

5.4.1实验目的

(1)掌握建立基本完整的ARM工程,包含启动代码、连接属性的配置等.

(2)了解ARM9的启动过程,学会使用MDK编写简单的C语言程序和汇编启动代码并进行调试.

(3)掌握如何指定代码入口地址与入口点.

(4)掌握通过memory、register、watch、Local等窗口分析判断结果.

5.4.2 实验设备

(1)硬件:PC.

(2)软件:μVision IDE for ARM集成开发环境,Windows 98/2000/NT/XP.

5.4.3 实验内容

用C语言编写延时函数,使用嵌入汇编.

5.4.4 实验原理

(1)ARM异常向量表.

当正常的程序执行流程暂时挂起时,称之为异常,例如处理一个外部的中断请求.在处理异常之前,必须保存当前的处理器状态,以便从异常程序返回时可以继续执行当前的程序.ARM异常向量表如下:

表5-1 ARM异常向量表

img181

续表

img182

处理器允许多个异常同时发生,这时,处理器会按照固定的顺序进行处理,参照下面的异常优先级.

高优先级:

1——Reset

2——Data abort

3——FIQ

4——IRQ

5——Prefetch abort

低优先级:

6——Undefined Instruction,Software interrupt

由上可见,Reset入口,即为整个程序的实际入口点.因此,我们在编写代码的时候,第一条语句是在0x00000000处开始执行的.一般地,我们使用下面的代码:

  area RESET,code,readonly

  entry

  b   Reset_Handler

Undefined_Handler

  b   Undefined_Handler

SWI_Handler

  b   SWI_Handler

Prefetch_Handler

  b   Prefetch_Handler

Abort_Handler

  b   Abort_Handler nop

IRQ_Handler

  b   IRQ_Handler

FIQ_Handler

  b   FIQ_Handler

Reset_Handler

  ldr  sp,=0x0C002000

  .

  .

  .

(2)分散加载文件.

Scatter file(分散加载描述文件)用于LARM链接器的输入参数,它指定映像文件内部各区域的download与运行时位置.LARM将会根据scatter file生成一些区域相关的符号,它们是全局的供用户建立运行环境时使用.通过这个文件可以指定程序的入口地址.在利用MDK进行实际应用程序开发时,常常需要使用分散加载描述文件,例如以下情况:

存在复杂的地址映射:例如代码和数据需要分开放在多个区域.

存在多种存储器类型:例如包含Flash、ROM、SDRAM、快速SRAM.需要根据代码与数据的特性把他们放在不同的存储器中,比如中断处理部分放在快速SRAM内部来提高响应速度,而把不常用到的代码放到速度比较慢的Flash内.

函数的地址固定定位:可以利用Scatter file实现把某个函数放在固定地址,而不管其应用程序是否已经改变或重新编译.

利用符号确定堆与堆栈:

内存映射的IO:采用Scatter file可以实现把某个数据段放在精确的地址处.

因此对于实际的嵌入式系统来说Scatter file是必不可少的,因为嵌入式系统通常采用了ROM、RAM和内存映射的IO.关于Scatter file的相关知识非常多,详细内容可以参考MDK所带的帮助,下面给出一个简单实例.

img183

这个分散加载描述文件对应的分散加载映像如图5-15所示,文件中各项内容的含义分别是:

img184

img185

图5-15 分散加载映像图

(3)内嵌汇编语言.

编译C时,可以通过_asm汇编程序说明符调用内嵌汇编程序.说明符后面跟随有一列包含在大括号中的汇编程序指令.例如:

img186

如果两条指令在同一行中,必须用分号将其分隔.如果一条指令占用多行,必须用反斜线符号(\)指定续行.可在内嵌汇编语言块内的任意位置处使用C注释.可在任何可以使用C语句的地方使用_asm语句.

5.4.5 实验操作步骤

(1)参考5.1.5小节实验的操作步骤建立一个新的工程,命名为CTest2,注意在建立工程的过程中添加设备数据库中S3C2410芯片自带的启动代码,也可手动添加启动代码startup.s.

(2)参考5.1.5小节实验的步骤和实验参考程序编辑输入源代码,编辑完毕后,保存文件为CCode.c.

(3)在Project workspace工作区中右击target1→Source Group 1,在弹出菜单中选择" Add file to Group'Source Group 1'",在随后弹出的文件选择对话框中,选择刚才建立的源文件CCode.c.

(4)在Option for Target对话框Linker页Scatter File对话框中添加分散加载描述文件CTest2.sct.

(5)选择菜单项Project→Build target或快捷键F7,生成目标代码.

(6)选择菜单项Debug→Start/Stop Debug Session或快捷键Ctrl+F5,即可进入调试模式.这里使用的是μVision3IDE中的软件仿真器.

(7)选择菜单项Debug→Run或F5,即可运行代码.

(8)打开memory、register、watch、Local窗口,单步执行,并通过memory/register/watch/variable窗口分析判断结果.注意观察程序如何跳转进主程序_main,在call stack窗口观察当前执行函数之间的调用.在watch框中输入要观察变量I的值,并记录下来.特别注意在local窗口观察变量I的变化并记录下来.

(9)结合实验内容和相关资料,观察程序运行.

(10)理解和掌握实验后,完成实验练习题.

5.4.6 实验参考程序

(1)CCode.c的源代码.

img187

img188

(2)Startup.s的源代码.

img189

img190

img191

(3)CTest2.sct的源代码.

img192

调试命令脚本文件可使用5.1节的.

5.4.7 练习题

1.改进C语言使用实验一中的练习题,在C语言文件中定义全局及局部变量,并在编译链接时使用链接脚本文件,使用Tools菜单下的Disassemble all产生objdump文件,从该文件中观察代码及变量在目标输出代码中的存放情况.

2.在以上实验例程C语言文件中,加入嵌入汇编语言,使用汇编指令实现读写某存储单元的值,初步掌握嵌入汇编语言的使用.

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈