首页
/
每日頭條
/
科技
/
cortex-m3使用什麼架構
cortex-m3使用什麼架構
更新时间:2024-11-28 01:43:41

下面以startup_LPC17xx.s為例,簡單看一下CMSIS中的啟動代碼完成了哪些工作。

主要完成了三項工作:

  • 堆棧以及堆的初始化;
  • 定位中斷向量表;
  • 調用 Reset Handler。

1.1 堆棧以及堆的初始化

1.1.1 堆棧的初始化

程序清單 1.1 startup_LPC17xx.s 中的堆棧初始化代碼

Stack_Size EQU 0x00000200 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp

Stack_Size EQU 0x00000200,這個語句相當于 Stack_Size 這個标号(标号:鍊接器的術語,下文中提到的所有“标号”,指的都是鍊接器中的标号)等于 0x00000200,相當于 C 語言中的#define Stack_Size 0x00000200,也就是說此語句隻是一個聲明,并未分配地址。

AREA STACK, NOINIT, READWRITE, ALIGN=3,此語句定義了一個名叫 STACK 的代碼段,并指明 8 字節對齊(ALIGN=3)。

Stack_Mem SPACE Stack_Size,為 Stack_Mem 分配 Stack_Size 大小的一塊内存區域,注意這裡分配的是 RAM。

__initial_sp此标号有一層隐含的意思那就是在 M3 中堆棧是滿遞減堆棧,因為它指定了堆棧指針位于堆棧的高地址(在 Stack_Mem 之後),具體如下圖所示。

cortex-m3使用什麼架構(Cortex-M3内核進階之注解)1

圖 1.1 堆棧指針 SP 位置

上圖來自一個 LPC1700 工程的.map 文件。可以看出棧的起始地址為 0x10001f70,大小為512 字節(即 0x00000200 = Stack_Size)。而堆棧指針的位置在 0x10002170,其等于棧的起始地址 0x10001f70 0x00000200,說明 LPC1700 系列的 Cortex-M3 微控制器的堆棧為滿遞減堆棧。

1.1.2 堆的初始化

程序清單 1.2 startup_LPC17xx.s 中的堆初始化代碼

Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit

具體過程與棧的初始化相同。

1.2 中斷向量表的初始化

程序清單 1.3 中斷向量表的初始化代碼

PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors __Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler DCD 0 ; Reserved; DCD 0 ; Reserved DCD 0 ; Reserved DCD 0 ; Reserved

PRESERVE8 指定了以下的代碼位 8 字節對齊,這是 keil 編譯器的一個編程要求,對齊情況如下圖所示:

cortex-m3使用什麼架構(Cortex-M3内核進階之注解)2

圖 1.2 .list 文件中的 8 字節對齊示意圖

THUMB 指定了接下來的代碼為 THUMB 指令集。

AREA RESET, DATA, READONLY,此語句聲明 RESET 數據段。

EXPORT __Vectors,導出向量表标号,EXPORT 作用類似于 C 語言中的 extern。之後的代碼就是為向量表分配存儲區域。

1.3 調用 Reset Handler

程序清單 1.4 調用 Reset Handler 的代碼

; Reset Handler Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit ; IMPORT __main LDR R0, =SystemInit; BLX R0 ; LDR R0, =__main BX R0 ENDP

此段代碼隻完成了一個功能,引導程序進入__main。 __main 的具體行為在第三章中有具體的描述。

1.4 其他的代碼

程序清單 1.5 CRP 加密級别

IF :LNOT::DEF:NO_CRP AREA |.ARM.__at_0x02FC|, CODE, READONLY CRP_Key DCD 0xFFFFFFFF ENDIF

此段代碼指定了接下來的代碼存儲與 0x02FC 的地址,具體情況如下圖所示。這段代碼是 NXP 公司的 LPC1700 系列的 MCU 特有的一段代碼,其他公司的 Cortex-M3 MCU 的啟動程序是沒有這段代碼的。

這段代碼是指定 LPC1700 的 CRP 加密級别的代碼段,芯片上電後會自動讀取這一地址的值以确定加密方式,其中 CRP_Key = 0xffffffff 為不加密(0 級加密), CRP_Key = 0x12345678為 1 級加密, CRP_Key = 0x87654321 為 2 級加密, CRP_Key = 0x43218765 為 3 級加密(最高級加密), 3 級加密将會禁止所有的 ISP 指令,也就是說,芯片将不能讀寫、不能擦除。

程序清單1.6 具體的堆棧以及堆的初始化行為

; User Initial Stack & Heap IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem Stack_Size) LDR R2, = (Heap_Mem Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
冰箱長期斷電後正确啟動的方法
冰箱長期斷電後正确啟動的方法
冰箱長期斷電後正确啟動的方法冰箱長期斷電後正确啟動的方法我們有時候外出很久,所以也就把冰箱斷電了,那麼冰箱長期斷電後正确啟動的方法是什麼呢?長期停用該如何啟動冰箱長期停用後再次啟動時要作3次瞬時啟動。具體做法是:插上電源再拔下,過5分鐘重複一次,一共3次,然後方可通電工作。專家建議初次開機後若遇到不...
2024-11-28
冰箱冷凍室溫度
冰箱冷凍室溫度
冰箱是我們日常生活中經常用到的一種家用電器,同時主要是保存食物和一些對于食物的良好保存,對于冰箱冷凍室的溫度調節那也是非常講究的,溫度條件的一定要注意冰箱的溫度調節,不是随便可以進行調節的,而且的主要是選擇一些适合食物的溫度的,同時能防止食物的破壞以及變質。那麼冰箱冷凍室的溫度應該怎麼進行調控呢,在...
2024-11-28
冰箱如何保存食品?冰箱如何清理?
冰箱如何保存食品?冰箱如何清理?
冰箱如何保存食品?冰箱如何清理?冰箱如何保存食品?1、冰箱内溫度應保持在10℃以下。2、嬰幼兒食品應新鮮配制,不宜置冰箱中。3、剩餘食品在放置冰箱内保存前應充分再加熱煮透,殺滅微生物,降至室溫後再保存。4、為防止熟交叉及食物“串味”,應用保鮮袋或保鮮紙将食物包密實後置冰箱保存...
2024-11-28
電腦音響的具體分類有哪些?
電腦音響的具體分類有哪些?
電腦音響的具體分類有哪些?電腦音響的具體分類有哪些?電腦音箱根據箱體個數的不同,可以分為2.0音箱,2.1音箱,5.1音箱,甚至是7.1音箱。揚聲器有多種分類式:按其換能方式可分為電動式、電磁式、壓電式、數字式等多種;按振膜結構可美國GFT音箱分為單紙盆、複合紙盆、複合号筒、同軸等多種;按振膜開頭可...
2024-11-28
節能熱水器的保養方法
節能熱水器的保養方法
節能熱水器的保養方法節能熱水器的工作原理一台完整的節能熱水器包含2個主要部分:制造冷氣部分和加熱熱水部分。但其實這兩個部分又是緊密的聯系在一起的,密不可分,必須同時工作。即在加熱熱水的同時,給廚房制冷。或者說在給廚房制冷的同時也在加熱熱水。其内部結構主要由四個核心部件:壓縮機,冷凝器,膨脹閥,蒸發器...
2024-11-28
Copyright 2023-2024 - www.tftnews.com All Rights Reserved