浅析多核ECU运行流程

以前上手单片机都是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的启动函数,编译器怎知道的?

good question,看图:

从上图可见,同样是在 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

  • 19
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
nohup和screen是在Linux系统中常用的运行后台任务的工具,它们在功能和使用方式上有一些区别。 首先,nohup是一个可以运行命令或脚本的命令。使用nohup命令可以让命令在后台运行,并且不会受到终端退出的影响。使用nohup的示例如下: ``` nohup command & ``` 其中,command是要运行的命令或脚本,&表示在后台运行。例如,要在后台运行一个名为task.sh的脚本,可以使用以下命令: ``` nohup ./task.sh & ``` nohup命令会将命令的输出信息重定向到nohup.out文件中,可以通过查看该文件来获取命令的输出。 相比之下,screen是一个用于多路复用命令行界面的工具。使用screen可以在一个终端窗口中同时运行多个会话,并且可以在不同的会话之间切换。使用screen的示例如下: ``` screen -S session_name ``` 其中,session_name是会话的名称,可以根据需要指定。进入会话后,可以在其中运行命令或脚本。 要在screen会话中运行后台任务,可以先进入会话,然后使用nohup命令来运行命令或脚本。例如,要在一个名为my_session的会话中运行任务,可以按照以下步骤进行: 1. 进入my_session会话:`screen -r my_session` 2. 运行需要后台运行的命令或脚本:`nohup command &` nohup命令将任务放在后台运行,并且不受终端退出的影响。可以通过查看nohup.out文件来获取命令的输出。 总结来说,nohup适用于简单的后台任务,它可以让命令在后台运行并且不受终端退出的影响。而screen适用于需要同时运行多个会话,并且能够在会话之间切换的情况下使用nohup来运行后台任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值