打印
[ZLG-ARM]

IAP的中断问题

[复制链接]
3553|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ybqchj|  楼主 | 2009-8-21 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
做远程升级的时候 ,应用程序已经写到了内部FLASH中,指针跳转到指定的应用扇区中运行应用程序,如果应用程序中没有用到中断,程序运行正常,如果应用程序中加了串口接收中断,当串口有数据接收时,无法进入中断,程序也死了~~网上看了很多,提到中断向量的重映射,具体的要怎么实现这个中断向量的重映射~~~大家帮帮忙

相关帖子

沙发
mohanwei| | 2009-8-21 15:47 | 只看该作者
在应用程序的启动代码里,找到设置中断向量的那行,改掉就行了。

使用特权

评论回复
板凳
ybqchj|  楼主 | 2009-8-21 17:03 | 只看该作者
怎么改?

使用特权

评论回复
地板
synics| | 2009-8-23 16:18 | 只看该作者
最近做过51_IAP和ARM_IAP升级,感觉到他们的相同点和不同点,特记录如下:
共同点:
做好IAP的关键都是中断向量的映射(REMAP)问题
一般都分为bootloader区和用户区
不同点:
单片机的中断向量位置是固定的,位于0x0000的底部。
ARM的中断向量也一般是在0x0000的底部,但有的ARM可以中断向量的映射机制,可以将RAM或其他地址的FLASH映射到0x0000底部
单片机没有中断向量管理机制。一般0x0000-0x0002是一个3个字节的LJMP指令(该指令跳转到用户程序,注意不一定是main函数,可能是包括一些堆栈,寄存器初始化的汇编的初始化部分,然后跳转到main函数),后面是各种具体中断的跳转函数的入口地址,例如串口,I2C等等。
ARM有中断管理机制。(cortex-M3内核又不一样)
在ARM体系中,异常中断向量表的大小为32字节,其中每个异常中断占据4个字节大小,保留了4个字节空间
0x00 复位
0x04 未定义的指令
0x08 软件中断
0x0C 指令预取终止
0x10 数据访问终止
0x14 保留 未使用
0x18 IRQ模式   这个就是我们常用各种中断(串口,i2c等)的一个总中断入口,后面再根据中断其他寄存器进行判断处理
0x1C FIQ模式
中断向量从0x0000000--0x00000001C共4*8=32个字节,还应包括后面到0x00000040之前的代码都应该映射,因为后面包括具体跳转的地址。(所以要映射从0x0000000----0x000003F共64个字节,自己看汇编觉得)
对于下载的程序,必须要在KEIL设置好Ro_Base地址,然后将生成好的bin文件下载到R0_Base地址处。原因是绝对地址不同造成,也就是说对某个bin文件并不是想下载到哪个地方都可以运行。
值得注意:
1.MC51设置R0_Base, 只表示用户代码的存放区,R0_Base这个地址并不存放中断向量表,也不是main的入口地址
2.ARM设置R0_Base, R0_Base开始处就是中断向量表
MC51设置Ro_Base位置在于BL51 Locate--》Code Range
ARM设置ro_base位置在于target-->IROM
做过升级的例子:
(1)C8051F02*将用户的中断向量复制到0x0003之后,同时0x000-0x0002保留bootloader跳转地址,另外找个地方保存用户跳转地址,用于从bootloader区跳转到用户区。值得注意:bootloader区由于其他中断向量表被用户中断向量表占用,bootloader代码中不能出现中断函数。
(2) STR912 内部有bank0,bank1的映射功能,即可将bank0映射到0x0000,亦可将bank1映射到0x0000,这样就可以将一个bank作为bootloader ,另一个作为用户程序
(3) 2410  中断向量表位于底部,没有重映射机制。采用将中断向量二次映射的方法,将中断向量映射到指定的RAM区,然后在RAM写入用户的中断向量表。
(4) ADU7020 中断向量表位于底部,有重新映射机制,REMAP寄存器,可以将中断向量映射到FLASH或RAM选择,可以将用户的中断向量拷贝到RAM区,然后选择将中断向量映射到RAM,然后跳转
(5) STM32 支持中断向量表映射。cortex-M3核有专门的向量偏移寄存器,该寄存器决定:
     1. 向量表是位于FLASH还是RAM,向量表的基址
     2. 向量表的偏移量
注:
  一个优秀的IAP升级程序,必须做好升级中出现故障等异常的处理。保证系统不会崩溃
(1) 接收到升级命令,准备升级
(2) 接收升级数据完成,每个包最好有包序号和校验
(3) 整个数据接收完,进行总的校验
(4) 试运行刚升级的版本,发送读取版本信息或其他指令测试当前版本是否工作正常,如果不正常,外界通过对外专门的RESET引脚,恢复到原版本
(5) 接收到版本确认命令,将升级版本作为当前运行版本,并将原版本进行保存

使用特权

评论回复
5
synics| | 2009-8-23 16:18 | 只看该作者
另外:
(1)要保证升级过程中任何时候掉电,下次上电后,系统能正常工作。例如新的程序正在搬运到运行区时候掉电,下次上电要实现自动搬运
(2)正常情况下,系统一般有bootloader区跳转到用户区。如果用户区程序有问题的话,就玩OVER了,因此一定要在跳转之前加一定延时,可以响应升级命令
(3)执行bootloader区和用户区跳转指令,由于只是PC指针的跳转,寄存器并未恢复到出厂值,因此对bootloader和用户区代码中的寄存器初始化要小心。
说到底最重要的还是bootloader程序一定要写好,这个毕竟是出厂前固化在FLASH中
给手机升级,主板升级,其中强调的就是不能中途掉电,否则就要。。。这个应该就是没做好升级处理吧

使用特权

评论回复
6
roger_lj| | 2009-9-10 09:39 | 只看该作者
你要把"应用程序"对应的中断向量表定位到RAM中,
1, RAM最开始的64字节预留给"应用程序"存放中断向量表
2, "应用程序"的main()一开始就要复制64字节的向量表到RAM指定位置
3, 设置MEMMAP为RAM模式
参考: AN10835 Secondary bootloader for code updates using IAP
http://www.standardics.nxp.com/s ... ers/zip/an10835.zip

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

56

帖子

0

粉丝