This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于Bootloader和App,我有话想说

Expert 1795 points

今天被Bootloader和App跳转的项目折腾疯了。

本来老早就实现了Bootloader和App项目,包括如何合并两个文件这种前沿技术都被我掌握了,这次因为要配合新用户的协议,打算换一种方式来处理。

昨天也是通宵,我天天通宵,搞到早上6点,终于实现了一个新的方案,中午醒来兴高采烈的告诉客户说,搞定了。要发文件给用户,必须整理一下,最后测试一遍,结果不行了,本来好好的,为什么睡一觉就不行了?换电脑引起的?换CCS版本引起的?

折腾了好一会,终于明白了,我在APP里面靠看门狗复位,在Bootloader里面判断看门狗复位标志WDFLAG,按手册说的,标志0,表示上电了,标志1,表示看门狗复位了。结果,如果用仿真看,那个标志位总是对的,但是断电重启就不对了,总是表示看门狗复位了。因为我搞到天亮,比较焦急,所以仿真OK了就OK了,没再断电试一次。

于是,开始研究怎么断电了就看门狗复位了,难道有什么东西在断电后重启会比较耗时,引起看门狗动作?

排除了一大堆代码,还是看门狗复位。最后急了,不启用看门狗了,但还是看门狗复位!!好了,这下不是我的错了,我到这里发帖来了。但是这种问题……。

于是,我又尝试新方案,从APP直接跳转到Bootloader。为了判断是断电重启还是从APP跳过来的,我想了一个方案,在CMD文件里开辟一个内存空间,在Bootloader和App里各定义一个变量,都放在这个空间,且刚好塞满。我也好奇,如果这么干,是不是能把变量的值传递过去呢。

最后发现,这个办法不可行。如果在两个地方各自定义一个变量且初始化为0,那么跳转后,这个变量都是0,如果不初始化,才能传递过来。但是如果不初始化,开机时不是0,而是随机值。

最后靠一些外设寄存器,实现了双方传递信息的需要。但是,更大的问题来了,这个估计是硬伤,从Bootloader跳转到app,一直用得好好的,但是再从app跳转回Bootloader,奇了怪了,所有针对指针的赋值都不起作用了,包括memset函数,全部不起作用!!这个问题……

好了,天又快亮了。