參考文檔地址:https://www.cnblogs.com/strongwong/p/8657639.html
關於nrf52832上電啓動分析:
啓動所需要做的事:
堆棧的初始化、初始化中斷向量表、在進入main之前初始化時鐘
啓動過程中用的.s文件
arm_startup_nrf52.s
定義堆棧,堆棧的數據都時在RAW中
然後定義RESET區域
然後是定位中斷向量表:
第一條指令對應的堆棧,從第二條指令開始進入Reset Handler
在Reset_Handler中會先經SystemInit函數導入,可以理解成初始化時鐘
對於SystemInit的理解:爲啥需要在main之前初始化時鐘,以前看過最標準的理解是,CPU啓動工作的這段時間,內存、外設等設備還沒有啓動,需要CPU分配時鐘來啓動外設,然後分配堆棧空間,並且將存在到flash的數據copy到RAW然後在跳入到main中。
仔細觀察SystemInit函數,發現沒有變量,操作的都是寄存器,個人理解,局部變量就需要分配堆棧地址,而堆棧又是在內存,無法實現。
之後在初始化庫函數,然後最終進入main函數
然後是具體的分析.hex文件
.hex文件和.s文件是一一對應
從圖中可以看到0x00000000的位置是RAW的0x2002080也就數棧的位置
函數地址
Reset_Handler 0x00000004
NMI_Handler 0x00000008
.........
和向量表中的位置是一一對應