以前上手单片机都是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

浅析多核ECU运行流程相关推荐

  1. java花开程序_java代码的运行流程

    1. 运行流程的概览图 2.  具体流程 2.1 java源文件编译为class字节码 java代码是运行在Java虚拟机上的.但是java是一门面向对象的高级语言,它不仅语法非常复杂,抽象程度也非常 ...

  2. JVM 运行流程、类加载、垃圾回收

    一.JVM 简介 1.JVM JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机. 虚拟机是指通过软件模拟的具有完整硬件功能的.运行在一个完全隔离的环境中的完整计算机 ...

  3. 2021年大数据Hadoop(二十七):YARN运行流程

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Yarn运行流程 本系列历史文章 2021年大数据Hado ...

  4. HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程

    在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系 ...

  5. python爬虫流程-Python爬虫程序架构和运行流程原理解析

    1 前言 Python开发网络爬虫获取网页数据的基本流程为: 发起请求 通过URL向服务器发起request请求,请求可以包含额外的header信息. 获取响应内容 服务器正常响应,将会收到一个res ...

  6. WordPress 运行流程分析

    2019独角兽企业重金招聘Python工程师标准>>> WordPress 的运行流程如下图所示: 整个wp的程序结构比较特别,也不象一些普通的面向过程,也不是MVC,总之就是他自己 ...

  7. Python爬虫:scrapy 的运行流程和各模块的作用

    scrapy的运行流程 爬虫 -> 起始URL封装Request -> 爬虫中间件 -> 引擎 -> 调度器(Scheduler): 缓存请求, 请求去重 调度器 -> ...

  8. MyBatis的架构和其运行流程

    0x00:MyBatis 架构组成 MyBatis 整体的架构组成为:数据源配置文件.SQL 映射配置文件.会话工厂.会话.执行器以及底层封装对象组成. 0x01:数据源配置文件 对于持久层框架,连接 ...

  9. 一个对象的内存图及运行流程和3个对象的内存图的运行流程

    内存图运行流程(大致流程) 1.执行main方法 2.对象创建 3.创建一个新的对象,值为空 4.生成地址,并将空值输出 5.栈中地址就指向新对象的地址 6.方法区的地址值 7.堆中对象存有方法区的地 ...

最新文章

  1. 影响声音定位的几个因素
  2. opentracing
  3. 系统权限oracle,oracle系统权限
  4. mysql left join 查询_MySQL联表查询基本操作之left-join常见的坑
  5. 同步和异步有何异同,什么场景使用
  6. 5种Python使用定时调度任务的方式
  7. Codeforces7C 扩展欧几里得
  8. Java求矩形面积和圆形面积的异常处理实例
  9. 【FlexSim2019】自学笔记:2019版本中传送带属性设置 | Use transport | 如何建立S连接 | 操作员 叉车 传送带
  10. ESP8266学习笔记(7)——JSON接口使用
  11. APP推送系统工作原理
  12. 【书单推荐】西方思想史上占有重要地位的100部思想名著
  13. 布同:3D网游开发整体流程简述
  14. 记录一篇w10下最新tensorflow2.3的安装包括anaconda,cuda,cudnn安装,配置环境
  15. python版本正式对外发布的年份是_python正式对外宣布的年份_后端开发
  16. vue项目中使用地址选择插件v-distpicker,省市区三级联动选择
  17. JAVA面向对象程序设计-FeiGe快递系统-继承III
  18. VS2015 安装.NET Core
  19. ORA-01017:用户名/口令无效,登录被拒绝(ORA-01017: invalid username/password; logon denied)
  20. 人工智能需要的数学基础

热门文章

  1. Wear OS 简介
  2. SQL注入教程——(三)简单的注入尝试
  3. FR107对应 RS1M
  4. EOLINKER 请求mock 数据
  5. 学习使用 mockjs
  6. 数字电路基础-COMS电路静态、动态功耗,低功耗设计、PVT(Process、Voltage、Temperature工艺、电压、温度)、PPA(Power、Porformence、Area功耗、性能、
  7. 旅游行业会员营销制胜关键:培育客户忠诚度
  8. 数据结构与算法——算法时间复杂度
  9. 常见路由协议组播地址
  10. swift判断手机越狱代码和文件常用路径