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.
刚接手一个程序,现象是:每次仿真器下载程序之后,程序没有运行起来;但断电再上电之后,正确运行。
于是我就在线仿真查看,为什么下载程序后运行不起来?
有了如下发现:
我在cpu1的初始化语句中执行IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH),这个函数里面有句话:
经测试程序在红色框中死循环,函数原型为蓝色框中,也就是说IPC_BOOTSTS一直是0,不是C2_BOOTROM_READY(这个宏定义官方值为2)
现在卡死原因知道了,查阅手册说:
也就是IPC_BOOTSTS是由cpu2定义的,我就查cpu2的初始化语句,发现在cpu2初始化时IPC_BOOTSTS被初始化为0,除此之外再无任何其他对IPC_BOOTSTS的操作
我有如下疑问:
(1)我可以在cpu2初始化时将IPC_BOOTSTS赋为2,从而避免cpu1在while中死循环,程序也跑起来了,但这样总觉得显得有点“为了解决问题而进行的临时措施的意味”。
我想知道,IPCBootCPU2的本意是由cpu1控制cpu2的boot,但如果我通过gpio已经单独控制了cpu2的boot,是否就必须 在cpu2初始化时将IPC_BOOTSTS赋为2从而避免死循环呢?
(2)我想知道本身的程序,也就是cpu2初始化时IPC_BOOTSTS被初始化为0时,为何断电再上电,程序能正常跑起来呢?为什么进入while死循环的条件达成却没有进入死循环呢?而下载程序后死循环了?
(3)C2_BOOTROM_READY,这个宏定义官方值为2,这个2是从何而来的呢?为什么不是1,3?
谢谢。
1. CPU2是不能单独boot的吧,必须由CPU1在CPU1 BOOT的靠后的阶段将CPU2带出reset状态后才开始boot。CPU2在初始化时将相关的状态位,置为对应的状态,才能通知CPU1,表明CPU2成功boot。
2. 是否只有在烧录的这一下,程序不能正常运行,之后就都能正常运行了?
3. 只是这么设计而已。
2. 是否只有在烧录的这一下,程序不能正常运行,之后就都能正常运行了?
不是这样的,我仿真器下载程序之后,先点击cpu1的运行,再点击cpu2的运行,此时发现程序进入到while(bootstatus!=C2_BOOTROM_BOOTSTS_SYSTEM_READY)循环,哪怕此后断开仿真器,也不行。直至断电再上电后,程序正常运行(可通过我板子上led和电机是否运转判断)
(1)为什么会进入while(bootstatus!=C2_BOOTROM_BOOTSTS_SYSTEM_READY)循环?也就是bootstatus返回不了2?
(2)为什么断电再上电后就正常了?(显然此时bootstatus返回了2)
补充一下:我现在没有在ram里,使用的是2837xD_FLASH_CLA_lnk_cpu1/2.cmd
在这个里面分别加载cpu1和cpu2的out文件
2. 是否只有在烧录的这一下,程序不能正常运行,之后就都能正常运行了?
不是这样的
我看完你的描述以后,我的理解就是,咱俩说的其实是一个意思,即烧录完以后不能正常工作,必须要重新上电之后才可以正常工作,且之后也都能正常工作。
这是正常的。当烧录的时候,器件是处于上电状态的,这个时候一些boot的流程实际上已经是跑完了。在有些情况下之前的配置和现在的配置不同,有些情况下是器件已经过了判断或者配置的阶段,所以程序会在一些地方卡死,比如状态的判断。而重新上电很自然地就可以解决这些问题。