单片机断电后静态存储区里面还有数据吗_单片机启动流程和存储架构详解
最近在給公司的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)
- 即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
總結
以上是生活随笔為你收集整理的单片机断电后静态存储区里面还有数据吗_单片机启动流程和存储架构详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中random什么意思_py
- 下一篇: git checkout 单个文件_gi