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中使用Matlab自动代码生成,CPU2中使用SYS/bios操作系统(我使用了两个组件Clock与Hwi,我通过点呼吸灯的方式来观察组件是否正常运行),在编写完成后发现了如下问题:
1)在debug模式中,我先运行CPU1再运行CPU2,整个系统能够正常运行,(观察呼吸灯能够正常运行),但再该种情况下如果我重新上电,则回出现CPU1能正常运行,CPU2仅能完成初始化,无法进入Hwi,Clock任务内部。
2)在debug模式下,我先运行CPU2再运行CPU1则回报错,CPU2的初始化都无法完成。
我对SYS/BIOS的初始化过程理解不深,也没有过多的资料说明,还望能够详细说明。
所用到的组件版本:
CCS12.1
SYSbios:6.83.0.18
XDCtools:3.62.1.16
库函数:
controlsuite:v190F2873XD
但再该种情况下如果我重新上电,则回出现CPU1能正常运行,CPU2仅能完成初始化,无法进入Hwi,Clock任务内部。
cpu2正在完成什么样的初始化?能否运行到main()?能否运行到BIOS_start()?能否告诉我在哪里卡住了?
我在Debug模式下先运行CPU1在运行CPU2一切正常,但是上电重启后CPU2就运行异常了,我在MAIN函数的最后BIOSstart之前点灯,是可以亮起的(在重启后也能亮起)。
另外,我最近又做了实验,发现如果注释掉CPU1中的IPC模块则下电之后依然能够正常运行,所以我怀疑是IPC通讯与sys/bios存在某些不兼容,我的IPC通讯主要用到的库函数是IPC_lite,请问该库函数的应用会和SYSbios的启动发生冲突吗?
我今天又查阅了一下相关资料,我个人认为问题出现在CPU2的启动上,因为我使用仿真器debug不会出现问题,这很有可能是仿真器启动造成的。但断电重启时Boot from Flash,产生了问题(我在CPU1内未写IPCBootCPU2函数)。我想具体了解一下SYS/bios的CPU2的boot的代码程序,缺乏相关资料,如果能找到相关资料,我将感激不尽。
据我所知,SYS/BIOS 包含的唯一 IPC 代码是添加到 SYS/BIOS CPU1 init 函数的函数调用。您可以参考下下面这段代码:
Void Boot_bootCPU2(Void) { /* wait for C28 boot ROM to indicate ready ... */ while ((REG(C2TOC1IPCBOOTSTS_REG) & 0xF) != C2TOC1_BOOT_SYSTEM_READY) { } while ((REG(C1TOC2IPCFLG_REG) & (INTR_SET1 | INTR_SET2)) != 0) { } /* specify the boot mode */ REG(C1TOC2IPCBOOTMODE_REG) = C1TOC2_BOOTMODE_BOOT_FROM_FLASH; /* write IPC command code to execute boot mode */ REG(C1TOC2IPCCOM_REG) = C1TOC2_EXECUTE_BOOTMODE_CMD; /* generate interrupt to C28 */ REG(C1TOC2IPCSET_REG) |= (INTR_SET1 | INTR_SET2); }
如果常规应用程序代码已经处理这些步骤,那么您可以取消选中“Initiate boot of the CPU2 processor”。 CPU1 SYSBIOS cfg 文件中的设置。
此外我还会遇到这样的问题,在debug模式下,我单独运行CPU2(我的sys/bios在CPU2内,CPU1为裸机),会产生如下报错。
,但是我先运行CPU1再运行CPU2则不会有此问题。
interrupt 19 是一个非法的trap,你可以对CPU2代码进行单步调试进行确认,但我的猜测是CPU2在CPU1还没有授予它访问共享资源的权限之前尝试去运行。例如,在 CPU1 授予 CPU2 访问该函数所在 RAM 的权限之前,CPU2 可能会尝试调用 ramfunc 函数。
我今天又做了几次实验,发现只要注释掉IPCchannel0,则程序完全可以正常运行,结合之前的现象,我怀疑是CPU2(sys/bios)在boot引导程序里对IPCchannel0对应的程序进行了非法操作,导致传递失败,请问您能找到CPU2(sys/bios)boot的引导程序的相关介绍么
正如您所猜测的那样,我注释掉了所有的Delay_us(该函数要复制到RAM里进行)则没有问题了,感谢您的解答,请问IPC模块和sys/bios之间使用会产生冲突吗,我发现只要懂用IPC0,则程序在运行过程中不会出现任何问题。
参考下工程师的回复:
Like I mentioned earlier, SYS/BIOS only uses IPC during the routine that gets added when you use the "Initiate boot of the CPU2 processor" option. In your case CPU1 isn't running SYS/BIOS and CPU2 shouldn't be using this option, so there shouldn't be any conflict.
我又仔细阅读了程序本身,我个人认为我的程序不存在问题,同时我把CPU2中的SYS/bios程序变为裸机程序,这个问题奇迹般的消失了,我在考虑会不会是编译器或者汇编程序运行过程中存在某些隐形问题,请问您在过去的遇到过类似的现象吗,是否有什么解决思路,或者什么调试思路?
参考下工程师的回复:
I'm not aware of any known issue. I think you would need to do a more detailed debug to figure out the cause, like connecting to the device after a POR with your debug config/gel file configured to connect without causing a reset, so you can see the state of the device when it gets stuck.
I'm not sure if your post is in reference to a new project or supporting an existing SYS/BIOS project, but note that we are no longer recommending SYS/BIOS use for new projects. Customers who want to use an RTOS should use FreeRTOS or a third party option.