RTOS - Jserv IoT 作業系統 - 前置學習 - vector table - hard fault handler
收錄於 : 關於Ameba的一百篇
前篇: Ameba assembly-2
剛好 Jserv 要來打造一套 cortex-M3 上的 IoT 作業系統.
這邊 RTOS 介紹來跟著這個進度前進.
--- Jserv 的 議程介紹
從無到有打造 IoT 作業系統
https://www.facebook.com/events/645044348986795/
"[Event] 6 月 27 日晚間,Jserv與他愉快的小夥伴 首度在台北透過 YouTube進行網路直播,主題是「從無到有打造 IoT 作業系統核心」,將以 ARM Cortex-M3 為例,探討具體而微的作業系統核心的設計與實做,從 Hello World 等級的程式開始,逐步演化為原始程式碼 400
行內、支援多執行緒、搶佔式 (preemptive) 多工作業系統核心。
有興趣的朋友,記得先閱讀相關材料:https://embedded2016.hackpad.com/-IoT--VzsIQuEJcbo"
** 直播網址: https://www.youtube.com/c/ GUTS4tech/live **
無論人們對 Internet of Things (IoT) 抱持再大的幻想,IoT 本質上仍是嵌入式系統,自然高效率又富有彈性的作業系統 就是箇中重要議題。本次直播將以 ARM Cortex-M3 為例,探討具體而微的作業系統核心的設計與實做,從 Hello World 等級的程式開始,逐步演化為原始程式碼 400 行內、支援多執行緒、搶佔式 (preemptive) 多工作業系統核心。
注意須知:
(a) 本議程後續會持續更新,建議預習各項材料:
http://hackfoldr.org/ oscar/
(b) 聽眾需要 ARM 背景知識,直播過程中只會作重點提示
無論人們對 Internet of Things (IoT) 抱持再大的幻想,IoT 本質上仍是嵌入式系統,自然高效率又富有彈性的作業系統
注意須知:
(a) 本議程後續會持續更新,建議預習各項材料:
http://hackfoldr.org/
(b) 聽眾需要 ARM 背景知識,直播過程中只會作重點提示
---
如果這篇只有上面敘述, 大概就變成廣告文了, 這篇來介紹一下 vector table 好了.
上述筆記內提到的參考文件也有介紹 - http://wiki.csie.ncku.edu.tw/embedded/arm-exceptions.pdf
上述筆記內提到的參考文件也有介紹 - http://wiki.csie.ncku.edu.tw/embedded/arm-exceptions.pdf
之前 在 main function 有稍微介紹了一下, 這篇再補充一下.
- 有 general registers (R0~R12) 和 special registers
--
processor mode and privileged levels
operation mode : thread mode / handler mode
access level : privileged mode / non-privileged mode
access mode : 分成有權限和沒權限 狀態. 這邊權限指:
- CPS , MSR/MRS
- system timer, NVIC, system control block
- MPU : memory access
handler mode : 是 interrupt / system exception 系統自動進入, 此時是在 privileged mode .
reset 時 一開始是在 thread mode,
--
vector table : 一開始是指在 0x0000 0000 位置
可以 透過 vector table offset register (VTOR) 來做改變
system control block : VTOR register 位置 是在 0xE000ED08
4.3. System control block
The System control block (SCB) provides system implementation information, and system control. This includes configuration, control, and reporting of the system exceptions. The system control block registers are:
Table 4.12. Summary of the system control block registers
---
我們可以寫一段 簡單的 程式, 看 VTOR 設定
// the setup function runs once when you press reset or power the board
void setup() {
uint32_t address;
// initialize digital pin 13 as an output.
Serial.begin(38400);
address = *(uint32_t*)(0xE000ED08);
Serial.print("VTOR address : ");
Serial.print(address, HEX);
while(1);
}
// the loop function runs over and over again forever
void loop() {
}
--
結果 在 Ameba 上顯示 0x1000 0000, 這是 Ameba RAM 一開始的位置.
vector table 長相如下 : 在前一篇 RTOS, 我們在 variant.cpp 置換 SVC / PendSV / SysTick 成 RTOS 用的.
在這篇, 我們簡單介紹一下 Hard Fault
Hard Fault 在向量表中位於 0xC 這個位置.
可以把它印出來,
void setup() {
volatile uint32_t *ptr;
...
ptr = (uint32_t*)(0x1000000C);
address = *ptr;
Serial.print("Hard fault function : ");
Serial.println(address, HEX);
...
}
可以發現位置是在 0x0000 010D. 屬於 ROM function code. 看不到
--
來寫一個 hard fault 處理程式, 並把函式位置填入 中斷向量表, 換成我們寫的處理程式
void test_hardfault(void)
{
Serial.print("My hard fault");
while(1);
}
void setup() {
...
ptr = (uint32_t*)(0x1000000C);
*ptr = (uint32_t)(&test_hardfault);
...
}
執行結果 :
Hard fault function : 10004ED
置換成功.
PS: 如果把 while(1) 去掉, 會發現一直進去, 這是因為我們 hard fault function 還沒寫清除 status
--
我們來製造一個 除0 產生的 hard fault.
b = 0;
a = 3/b;
Serial.println(a);
執行結果 : 印出 0, 奇怪怎麼沒有 hard fault.
The bit assignments are:
程式加入 :
value = *(uint32_t*)(0xE000ED14);
Serial.print("CCR : ");
Serial.println(value, HEX);
值為 200 : 表示目前系統只有設定 stack alignment / 8-byte alignment
我們把 divide 0 trap 設定進去 : bit4
ptr = (uint32_t*)(0xE000ED14);
*ptr = *ptr | 0x10;
執行結果 :
印出 My hard fault
達成
PS: hard fault handler 製作 , 也是門學問,
這篇有介紹如何設定成 gdb 中斷, 和利用 ITM
https://blog.feabhas.com/2013/02/developing-a-generic-hard-fault-handler-for-arm-cortex-m3cortex-m4/
相關 register 介紹可以參考 ARM 這份文件
http://www.keil.com/appnotes/files/apnt209.pdf
留言
張貼留言