lxgree2015 发表于 2015-4-11 19:51:28

多工程共存时候奇怪的程序跳转,想不通问题在哪里

本帖最后由 lxgree2015 于 2015-4-11 20:14 编辑

问题背景:最近几周在研究IAP应用,软件平台uCOS2.85 硬件平台LPC2378,思路来自于网上的一篇文章,主要是将flash划分为6个部分,0扇区是跳转程序,1-9扇区是bootloader程序,10-15扇区是用户程序低区,16-21扇区是用户程序高区,22扇区存放标识,剩余为预留空间。

IAP总体思路:上电后跳转程序读取22扇区的标识,根据内容选择跳转到低区还是高区,用户程序运行中收到上位机的更新命令,则跳转到bootloader处从上位机接收数据更新用户区程序,更新完后修改标识并跳转到相应处执行新程序。

问题描述:现在上电后可以根据标识跳转到低区或者高区,接收到更新指令后也可以跳转到bootloader,由于bootloader中做有接收超时机制(作用是当超过10S接收不到数据或者数据校验错误,那么就退出bootloader跳到跳转程序处),可现在发现当超时发生时,程序直接又跳到了bootloader处,想了好久想不明白,大家怎么看?

lxgree2015 发表于 2015-4-11 19:56:05

本帖最后由 lxgree2015 于 2015-4-11 20:14 编辑

按道理说,发生超时后,跳转到跳转程序也就是0x00000000地址处后,程序会重新跳转到用户程序,在那里它要重新等到接收到上位机更新指令后才能跳到bootloader,可现在为什么直接就回到了bootloader,如果问我为什么,因为我的bootloader做有GUI显示,这个内容和应用程序的显示是根本不一样的

落叶随风 发表于 2015-4-11 20:09:54

虽然楼主的思路比较高大上,但是
http://www.amobbs.com/thread-5607394-1-1.html
24.论坛的大字体、彩色字体,仅仅是作为段落标题使用。禁止整段整段的彩色字体或大字体,避免影响其它网友阅读,尤其是手机用户阅读。初次违反禁言一星期,再次违反封锁ID。

lxgree2015 发表于 2015-4-11 20:14:52

落叶随风 发表于 2015-4-11 20:09
虽然楼主的思路比较高大上,但是
http://www.amobbs.com/thread-5607394-1-1.html
24.论坛的大字体、彩色字 ...

感谢提醒!

huchunlei 发表于 2015-4-11 23:52:29

因为不清楚你的低区有没有使用 ucos,我之前编过类似的程序的经验是, 在 UCOS 的任务里面 执行跳转指令, 会不成功。

我当时的方案如下:

FLASH 分为3部分:(Bootloader、Flasher、App)

1、Bootloader:主要是实现根据标志位,判断并跳转程序至 另外2个部分,不使用 UCOS , 功能简单不需要IAP本段程序。
2、Flasher:用于对App程序区进行IAP升级,有超时判断功能。使用了UCOS系统
3、App:应用程序区,主程序。运行在此区的时候,允许更新 Flasher 区。使用了UCOS系统

标志位一共有 2个,一个是 表征当前 应该跳转到 那个区(标志A),另外一个是表征系统启动是否成功的标志(标志B)

另外,在中断里面的 HardFault 里面 写重启指令,也就是说 一旦发生 HardFault 系统则重启。

运行过程如下:
   系统启动--Bootloader--判断标志A--如果为0--写标志B为1--跳转到App--启动成功--App区代码写标志位为0--运行中
   系统启动--Bootloader--判断标志A--如果为0--写标志B为1--跳转到App--启动失败--进入HardFault中断引起重启(说明App程序已经损坏)--Bootloader--发现标志B为1(说明App未成功启动)--引导进入Flasher--等待数据传输(如果接收到数据则IAP App区,并重启)--如果未接收数据引起超时--标志位A写0,标志B写0--重启………………

上面仅写了2种组合举个例子,主要是说明2点:
1、实现 Flasher 跳转到 App 的原理是, 置标志位,然后重启,把切换引导的任务交给 Bootloader。
2、如果 IAP 升级 意外出错,造成程序不完整的话,运行时会发生自动重启,或者进入 HardFault中断,而HardFault中断里面 写了重启的代码, 这样系统就重启了。 同时,使用标志位可判断系统是否启动成功。

以上为我去年一个项目的一些经验,搞这么复杂,是因为设备是无人职守的,还有远程固件升级的功能, 出现问题时, 需要有一定自恢复能力。仅供参考。

lxgree2015 发表于 2015-4-13 22:11:54

huchunlei 发表于 2015-4-11 23:52
因为不清楚你的低区有没有使用 ucos,我之前编过类似的程序的经验是, 在 UCOS 的任务里面 执行跳转指令,...

非常感谢你的热心回答,你的经验给了我不少思路,谢谢。

我的问题已经找到了,原因在于跳转时候没有修改重映射模式{:lol:}

lxgree2015 发表于 2015-4-15 15:02:33

huchunlei 发表于 2015-4-11 23:52
因为不清楚你的低区有没有使用 ucos,我之前编过类似的程序的经验是, 在 UCOS 的任务里面 执行跳转指令,...

你好,还是那个IAP的问题,我的bootloader里使用了操作系统,我现在发现程序只要一执行IAP函数就引发复位,我在调试中也单步看了下,确实是执行IAP功能函数时,PC立马跳到0x00000000,太奇怪了,想问下当时你遇到过这个问题吗,或者引发PC复位都有什么可能呢?我程序中没有使用看门狗

lxgree2015 发表于 2015-4-15 21:56:21

问题找到了,太NC了,不说了,感谢大家!
页: [1]
查看完整版本: 多工程共存时候奇怪的程序跳转,想不通问题在哪里