RTOS - Threads
收錄於 : 關於Ameba的一百篇
續前篇 : RTOS-preemptive
接續 Jserv 的課程作業 :
mini-arm-os 的 hackpad
embedded-2016
embedded-2015
github 程式 - link
---
在這邊已經開始增加檔案了,
Arduino 可以開多個 tab, ino files.
其實他會把這些檔案集中到一個 .cpp 檔來編譯.
所以不用特別寫 extern 宣告 / 變數 define. 省下 header files,
不過也快到極限了. 下一個 CMSIS 來改做成 Arduino library - RTOS
---
ICSR - interrupt control and status register
*SCB_ICSR |= SCB_ICSR_PENDSVSET;
透過 PendSV exception, 一設定起來, 之後會發 PendSV exception
--
pendSV 可能會被其他 ISR 中斷
--
用 pendSV 的好處,
如果像前一篇用 svc, 當其他 IRQ 來時, 並無法插隊執行 (preemptive)
但如果使用 pendSV, 就會優先處理 ISR
用 Arduino 寫的程式 code - github
這邊可以開始看到有 assembly / C 混用的情況.
得注意 :
(1) r0 - r3 , sp, lr 很容易被程式使用, 如果程式中間有夾 C code, 可能 register 值會被改變
編出來後, 可對照 assembly code
(2) 這邊的 lastTask 宣告成 :
volatile static uint32_t lastTask;
如用原本的, 在這環境會卡住.. (得加印訊息在 pendsv_handler() 的 while loop 中.. )
---
Exception 發生時,
CPU 會自動 push 底下資料到 stack , 並把 EXC_RETURN 值放到 lr.
接著從 vector table 找相對應的 ISR 執行,
ISR 結束時, 會做 bx lr. 這時會做到 EXC_RETURN, 硬體就會自動把相關的值 pop 出來.
Exception 發生時,
CPU 會自動 push 底下資料到 stack , 並把 EXC_RETURN 值放到 lr.
接著從 vector table 找相對應的 ISR 執行,
ISR 結束時, 會做 bx lr. 這時會做到 EXC_RETURN, 硬體就會自動把相關的值 pop 出來.
Disable/Enable interrupt :
cpisd / cpise / isb : 可參考 ARM 文件
__enable_irq(); // CPSIE I : Enable interrupt __ISB(); // Allow pended interrupts to be recognized __disable_irq(); // CPSID I : Disable interrupt
Figure 16 shows the resulting behavior.
A suitable architectural coding is:
Figure 17 shows the resulting behavior.
執行結果 :
留言
張貼留言