void(*IAP)(unsigned int parameter[], un-signed int result[]);//定义函数指针变量IAP,//IAP指向的函数的参数为两个unsinged int数组 IAP=(void(*)())0x7fff_fff1//设置函数指针,因为是Thumb代码,地址最低位设定为1 unsigned int parameter_in;//通过设定parame-ter_in各成员的值,实现各种IAP功能 usingned int result_out; (*IAP)(parameter_in,result_out);//调用特定功能的函数,执行结果存入result_out中 //IAP的命令码、状态码和命令。
在ARM应用系统中软件一般采用C语言进行编程,为了能进行系统初始化,通常会用一段汇编文件作为启动代码,实现异常向量表的定义,堆栈初始化、系统变量初始化、中断系统初始化、I/O初始化、地址重映射等。ARM7的异常向量位于地址0x0000_0000开始的32 bit内,当异常发生时程序从异常向量表取指令进行跳转。异常向量表位于Flash的第一个4 kB空间,用户程序运行时遇到异常时,也会到0x0000_0000开始的32 bit异常向量表中取出相应的指令。按照前面的设计,ADS编译器会将用户代码异常向量表运行地址设为从0x0000_1000开始,为了能让用户程序实现正确的异常处理,驻留程序的启动汇编代码需要将相应的跳转设为0x0000_1000开始的真正的用户异常向量处,这样驻留代码不能使用中断功能,实际上驻留代码完全可以采用查询方式进行串口通信。驻留程序的启动汇编代码示例如下: AREA vectors,CODE,READONLY
ENTRY
CODE32 Reset LDR PC,ResetInit;复位跳到驻留代码初始化程序ResetInit B 0x000010004;跳到用户异常向量UndefinedAddr B 0x000010008;跳到用户异常向量SWI_Addr B 0x00001000c;跳到用户异常向量PrefetchAddr B 0x000010010;跳到用户异常向量DataAbortAddr NOP B 0x000010018;跳到用户异常向量IRQ_Addr B 0x00001001c;跳到用户异常向量FIQ_Addr ResetInit
3 注意事项
为了让用户代码运行地址从0x0000_1000开始,在ADS的ARM Linker选项卡将RO Base设为0x0000_1000。因为处理器要切换到Thumb指令执行IAP代码,需要将ARM C Compiler下的ARMThumb Interwoking选项勾上。另外IAP函数使用了RAM空间的高32 bit空间,因此用户程序不应该使用该空间,用户堆栈栈顶要设定为小于RAM顶端地址减32。