以前上手单片机都是main函数开始,一条路走到黑。最近工作上接触到了英飞凌Aurix TC397这款6核ECU,实际操作起来还是挺不一样的。后又发现中文资料网上基本找不到【辣鸡英飞凌】。。。我来起个头好了。
PS:(以下着重描述与单核ECU的区别,基础性的知识在此恕不展开)
PPS:(为便于理解,本文将采用倒叙法)
目录:
1. How 如何对6个核心分别编程
2. Why 为什么6个核心能找到与自己对应的那个main函数
3. 6个核心的主从问题
1. How 如何对6个核心分别编程
先上图:
6核听起来可能比较让人头大,让我们先把锅烧热,啊呸,先来点感性的认识。上图可以较好的展示出在开发时工程的架构,对于每个核心n,都有一个core(n)_main函数和c文件与之对应,所以操作起来,和普通的单核ECU没啥区别【此句不严谨】
2. Why 为什么6个核心能找到与自己对应的那个main函数
看一下核心是怎么启动的,问题就解决了一半
图:
上图较好的描述了ECU的启动过程,每次上电之后,ECU都会首先运行厂家预留在ROM中的程序,之后根据图中的Reset vector跳转到启动函数(startup function),启动函数在完成一系列初始化功能后会引导程序指针到c语言的入口,也就是我们熟悉的main函数。
咱们接着看启动函数(startup function)长啥样:
见上图,左侧的6个c文件里就分别包含着6个核心的启动函数。再看看右边启动函数里面到底是啥,卧槽破案了,这不就是上面的那个core(n)_main函数吗,启动函数在初始化好核心的其他资源后,在最后一行跳转到了自己的main函数。
------------------------分割线,(不想加宽油的同学可以不加。我这说的都是啥??)赶时间的同学可以直接跳到第3节-----------------
凑近看一眼 Ifx_Ssw_jumpToFunction 这个函数:
你会发现它其实是一个封装好了的汇编指令,其实这也很好理解,之前c语言环境还没有配置好,当然这里用的大都是汇编了,这也是为什么启动函数往往叫 c startup函数的原因。
看到这里你可能仍然会有疑惑,为什么就是core3的启动函数,编译器怎知道的?
从上图可见,同样是在 Tc3这个c文件里。我们可以看到其实是由_START3()跳转过去的,而_START3()的地址,在linker file(链接文件)里面已经是固定好了的。详见下图:
再挖深一点,如果你去编译完成的.map文件里面,可以看到函数地址确实如linker file里面所定义的那样:
如上图所示,_START对应的是0xa0000000这个地址,和linker file里面的设定完全匹配
这时候我们再去芯片手册里瞄一眼:0xa0000000是FLASH的起始地址,这其实就是复位向量固定指向的地址
6个_START启动函数和6个核心的Program Flash一一对应 , that's it.
3. 6个核心的主从问题
虽然6个核心可以自由开闭,但显然在某一个时间点上至少需要有一个核心在运行。在官方提供的startup函数里面【绝大部分情况你都不会需要去改官方的startup函数,最多调一下flag】,只有core0是默认开启的,从这个角度上来讲,core0是主核心。
详见下图:
在Tc0.c这个文件的最后一行可以看出,startup是一定会跳转到__Core0_start也是就core0_main的启动函数里面。在上图这个例子里面,我设置启动了所有的6个核心,所以Ifx_Ssw_startCore()在这会去启动_START1,而之后1又会去启动core2,依次类推。目前看来这样的好处是可以确保核心按照0,1,2,3,4,5的顺序依次启动,不会发生随机性。
值得提到的一点是,在Tasking的aurix-multi-core-tricore-programming-essentials文档中,提到各个startup函数会通过一个系统变量来等待对方,实现各个核心同步/同时启动的效果,但是在2019年03月及以后英飞凌官方发布的iLLD底层驱动里面,我发现这个变量已经不再被使用了【也没有看到替代品】,目前(05/24/2019)还没有看到Tasking/英飞凌有发布相应的解释。
在最后,针对ROM再啰嗦一句,
当产品量产,你需要自己写BootLoader时,就需要接着和厂商预留在ROM里的函数打交道了。比如上图中 Flash API就提供了擦写Flash的功能,而IQ math则是TI提供的针对浮点运算的工具包。
看到这里的你,锅烧热了吗:P
Reference:
1. AURIXTC3XX_um_part1_V1.1.0.pdf
2. TC39XB_um_appx_V1.1.0.pdf
3. aurix-multi-core-tricore-programming-essentials.pdf
4. ctc_user_guide.pdf