[Note]Microcontroller的排程方式

[Note]Microcontroller的排程方式

這篇為我看完Microchip Technology 20024 FRM4 - Interrupt and Task Scheduling - No RTOS Required後所作的筆記。

Race condition與Synchronization

Race condition的觀念在恐龍書已經說很多了,所以就不提了。而Synchronization部份,Microcontroller常用interupt disabling和spin lock來做處理,而用到sempahore的部份也是有。另外值得注意的一點是,由於MCU同時有許多peripheral component(Timer,ADC,SPI,UART…)再運作,這些元件也會改變SFR(special function register)的值,所以建算你的程式是但執行序,仍可能會有race consition發生,例如:在PIC的 16 bit timer中,他是分成兩個register控制timer的值(TMR1L,TMR1H),也就是說你要更動timer的值時,需要大於兩個cycle,才可辦到,但是如果在存取值的時候你的timer仍在運作,則可能發生,不合理的狀況。比方說你想要讀取TMR1的值(TMR1H + TMR1L),原本TMR1H = 0x00,TMR1L = 0xFF,第一部份,你讀到了TMR1H的值為0x00,但在第二部份時你要讀TMR1L的時候,因為timer仍在計時,經過一個cycle,TMR1L的值已經加1並進位到TMR1H,所以TMR1L的值現在為0x00,你讀到的值就是0x00,在這個case中,你預期你會得到(0x00,0xFF),但你實際上拿到(0x00,0x00),這是在MCU常有的情況。避免的方法為暫停timer然後再去取值。

Review interrupt

在MCU中硬體發生的中斷會已硬體的context switch實做,也就是她會將當前的core register複製一份到shadow register儲存,保留狀態,當離開ISR後,CPU會將shadow register載回core register中。

在interupt中,對於跨ISR與main line的變數,可以考慮使用Volatile修飾字(一個資源有多個process使用時,透過這個修飾字可以告訴編譯器,不要對這個值做值域判斷優化),以免編譯器編出你無法預期的行為。

interrupt在context switch時會有所謂的interrupt latency(在IVT中尋找對應的interrupt vector+context switch+當前指令的完成(例如說MUL)),這是MCU的效能指標之一,不過對於多層的interrupt,在第二層以後失去了硬體context swtich的優化,所以速度會慢很多。

Jitter injection為main line在被中斷後所暫停執行的時間,通常要盡量讓Jitter 愈小愈好。

interupt priority:MCU中的interrupt有priority,規範誰可以中斷誰,例如說PIC18F系列有兩個level,dsPIC30F系列有八個level,此外MCU中透過interrupt 在IVT的順序,有所謂的natural order priority,來處理相同level intertupt同時發生的問題。另外,ISR裡可以包裹多個interrupt handler,這部份一樣是透過IVT先後和priority還有發生時間決定進入點。(其他:可重入程序)。

一些ISR設計的注意細節:

1.盡量ISR短,減少jitter

2.避免無限的等待

3.盡量避免ISR與mainline使用相同的全域變數(有的話記的要加volatile)

Review scheduler(非Real time)與相關技術

有cooperative與preemptive兩大類,恐龍書有詳盡描述。此外還有兼容兩種特性的(hybird)。

常見排程方式與技術有:

1.sequential

任務是循序執行的,好處是簡單明瞭,非常好預期行為。缺點是容易多做一些不必要的任務,還有每個任務的latency變異大。

2.Round Robin

恐龍書有提到,就跳過了。

3.basic priority與advanced priority

透過簡單邏輯判斷該執行哪些任務,壞處是要維護判斷的變數狀態正確性,還有避免starvation,而且當判斷模式複雜時難除錯。

4.staged

透過將任務拆解成多個stage然後使用FSM的方式管理任務執行順序,缺點是增加許多資源管理state。

5.scheduled(這裡指時間上)

透過規劃何時該做什麼達成scheduled,好處是簡單好讀,執行時間可預期,好擴展。缺點是需要Timer來排行程,還有有需要維護Ticker。

comments powered by Disqus