最近在给公司的ADAS DCU做内存分配(Memory Allocation),在这儿记录一下相关知识点,也算是给中文社区做贡献了。
目录:
1. ECU启动流程
2. 存储空间解析
3. TC397单片机的Memory Map和一些备注
1. ECU启动流程
图总比文字直观:
如上图所示,上电以后其实就三步: "运行ROM的启动函数 -- 跳转到FLASH里的Startup函数 -- 跳转到我们熟悉的main函数" 。 所以FLASH里的Startup函数其实才是最先执行,且用户可以修改的函数。只是它一般都被封装好了,所以才没有接触到。
如果你想写BootLoader,就在Startup函数的基础上改就ok了。
2. 存储空间解析
以下将对上面那张图的PFLASH,DFLASH等名词进行解释:
重要且有用的:
2.1 掉电后数据不会消失的FLASH,EEPROM
PFLASH: Program Flash用来存程序,价格便宜,配的容量也大,我用的这款足有16M
DFLASH: Data Flash用来存用户数据,虽然叫Flash其实它是EEPROM,成本比FLASH高,我这款才1M多
FLASH 和EEPROM的最大区别是FLASH按扇区(section)擦写,用来存储程序这种大但不太频繁更改的data,成本低。EEPROM则按字节(Byte)擦写,存储用户数据这种小的,零碎的,总是在变的data时,擦写速度快。
2.2 掉电后数据会消失的RAM
RAM:速度快,甚至会比Flash快50%以上。由于RAM空间有限,单片机运行的时候,程序存储在flash,但数据会存储在RAM,即CPU从flash中取指令,从RAM中抓数据。
重要但没啥用的:【直接转到第三章如果你赶时间】
扩展阅读:
a: 当然你也可以可以通过#pragma CODE_SECTION等将程序先从Flash拷到RAM里面,再在RAM里面运行,来提升运行速度。详见Running an Application from Internal Flash Memory 第四章“Copying Sections from Flash to RAM” [1]
b: 冯诺依曼,哈佛结构: [2]
2.3 链接文件(Linker File)
总的来说linker file用来定义数据和代码具体存放在哪一块。比如它会规定存储在Flash的启动函数_START()的存储地址和BootROM里面reset vector内预设的地址匹配,这样复位以后就总会从启动函数_START()开始执行
- 即reg.h 里面将寄存器的地址重命名,所以向寄存器写其实就等于向该地址赋值
- 而link file里面则是将函数和变量存在哪个地址做了规定
具体定义见下图:
这张图进一步解释了linker file在存储中的作用[3] :
3. TC397单片机的Memory Map和一些备注
先来一张从用户手册里拿来的单片机Memory Map:
可以看到:
1. 对这款6核ECU,core0到5都有自己的专属FLASH,大小为3M(core5是1M),读取它有专属的接口FPIn,速度快
2. 每个core内部都有16k的program cache和16k的data cache。 PSPR和DSPR稍大,看起来是2级缓存
3. 这6个core没有太大的区别,唯一就是core0和core1的DSPR(data scrachpad RAM)大一些。240KB,其他的core是96KB
4. 可以用的RAM还有LMU,DAM和4M的EMEM。但根据datasheet,DAM不支持ASIL B及以上的软件【becasue of hardware safety mechanism】
5. 对于第一条里提到的FLASH,对于同一块物理存储空间。它们可以在地址0x8000,0000通过总线进行cache access,也可以在地址0xA000,0000通过总线进行non-cache access, 这是比较有意思的
6. 因为是TC397 -ADAS,所以有额外的EMES,SPU,RIF,CIF以及扩展的HSM
Reference:
1. http://www.ti.com/lit/an/spra958l/spra958l.pdf
2. https://blog.csdn.net/jj163zhuangzi/article/details/47088843
3. http://downloads.ti.com/docs/esd/SLAU131U/introduction-to-sections-stdz0691509.html
4. http://m.elecfans.com/article/582174.html