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;

[28]PENDSVSETRW
PendSV set-pending bit.
Write:
0 = no effect
1 = changes PendSV exception state to pending.
Read:
0 = PendSV exception is not pending
1 = PendSV exception is pending.
Writing 1 to this bit is the only way to set the PendSV exception state to pending.

透過 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 出來.  






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.

Figure 16. Use ISB after enabling interrupts to permit immediate recognition of a pending interrupt

A suitable architectural coding is:
Figure 17 shows the resulting behavior.

Figure 17. Architectural interrupt behavior between CSPIE and CPSID



執行結果 :




留言

熱門文章