打印

遇到一个诡异问题,呵呵

[复制链接]
3074|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yyql008|  楼主 | 2013-1-17 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  需要用CAN烧写程序.参照官方代码,写好了bootloader和应用程序.用下载程序后,跳入应用程序,不跑程序,好像进入一个无穷循环,怀疑是进入应用程序的hardfault.为此在应用程序中的hardfault服务例程中写了个CAN发送8个1的句子.用bootloader下载程序,切入并跑应用程序,果然CAN分析仪上收到8个1.真的进入了应用程序的hardfault.
但是用bootloader下载好程序后,重启单片机,是能正常跑应用程序的.后来在切入应用程序那句,下了断点,分别分析下载好程序跑到这句和重启单片机跑到这句,看看主要寄存器有什么不同,还是看不到什么不同.

之前用的应用程序时跑UCOS的,把应用程序改成裸写的,这样用bootloader下载程序后,不用重启单片机直接跑应用程序,能够正常跑应用程序,然后怀疑UCOS移植不对,继续折腾....发现UCOS移植没问题.


折腾几下,突然想到,是不是切入应用程序的之后,单片机进入了CAN接收中断,而此时,单片机的中断向量还未重新定义,这样导致虽然还在应用程序,但进入CAN中断后,进入的还是bootloader的的CAN中断,bootloader的CAN接收中断有自己的服务例程,用到一些全局变量,而这些全局变量会影响到应用程序(因为bootloader的ram和应用程序的ram复用的).这样bootloader的会修改应用程序的变量,如果应用程序正在进行一些重要的初始化(特别是应用程序的复位向量跳转后进入的重要初始化),就可能导致BUG.
这样在bootloader调转应用程序前一句,加上关闭总中断,果然,用bootloader下载好程序后,不用重启单片机,也能够正常跑应用程序了..
沙发
huangxz| | 2013-1-17 13:45 | 只看该作者
呵呵,楼主分享的比较好,这是bootloader启动应用程序经常会犯的错误,使用bootloader一定要注意在bootloader中使用的中断要及时清理掉(如定时器),在应用程序中要重新初始化。:lol

使用特权

评论回复
板凳
拿起书本| | 2013-1-23 15:06 | 只看该作者
进来学习一下,楼上正解。鼓励分享,顶起让更多需要的朋友看到

使用特权

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

本版积分规则

个人签名:我们必须知道,我们必将知道

18

主题

111

帖子

1

粉丝