多核ECU运行流程
一、参考
二、如何对多核核心分别编程
- 对每个核心,都有一个对应的CPUn_main函数的C文件与之对应如下图所示:
三、每个核如何找到自己对应的main函数
- ECU上电后的启动流程如下图所示。上电之后其实也就三步:“运行ROM的启动函数——跳转到FLASH中的Startup函数——跳转到main函数”。所以Flash里的Startup函数其实才是最先执行,且是用户可以修改的函数,只是一般是被封装好的。
注意:bootlooader即在Startup函数基础上的修改。(boot启动函数----> boot main函数----->应用程序启动函数------>应用程序的main函数)
- 启动函数如下所示。函数在初始化核心的其他资源之后,在最后一行跳转到了自己的main函数“__non_return_call(core0_main)
四、编译器如何知道"_Core0_start(void)"是core0的启动函数 (以下以TC27x为例)
- 通过调用层次结构可知,_Core0_start(void) 实际上由 _START(void) 调用
- 而_START()的地址在linker file文件里面已经是固定好的,如下所示
- 追溯到boot工程中的main函数,由boot跳转至APP即跳转至_START()函数
五、多核之间的主从关系
- 虽然CPU之间多个核心可以自由开闭,但显然在某个时间点上至少需要有一个核在运行。以TC377为例,在官方提供的startup函数里面【绝大部分情况你都不会需要去改官方的startup函数,最多调一下flag】,只有core0是默认开启的,从这个角度上来讲,core0是主核心。
-展开core0_main函数的调用层次结构如下,_START()函数最终调用的为核0的主函数
- 由于核0默认开启,在函数 __StartUpSoftware_Phase6(void) 中,开启了核1,如下图所示
-同样展开core1_main主函数的调用层次结构如下
-在函数 __Core1_start(void) 中,开启了核2,如下图所示
- 所以以此类推,之后核2又会去启动核3……,可以确保核心按照0,1,2,3,4,5的顺序依次启动,不会发生随机性。