Wednesday, December 14, 2016

方便的網站:stackedit

**

方便的網站:stackedit

*在CMS風行一段時間之際,傳統的部落格文書編輯器已經顯得過時無用,調字體大小等這些基本功能用傳統文書編輯器還可以接受,但表格等則還需要動用html,這顯得十分麻煩,這時運用markdown方式撰寫文件的功能的網站如與後出筍般出現,包括hackmd:https://hackmd.io/專案的成功。而部落格方面,除了wordpress的markdown插件,logdown以markdown為訴求的網站平台外,如果使用傳統google所提供的blogger功能的話,首推stackedit:https://stackedit.io,他的功能十分強大,可以幫你管理你的文章還可以串連多個blog平台,包括blogger,wordpress,github,gist,tumblr等,而且畫面簡潔明亮,害我都跳槽了哈哈。

Written with StackEdit.

Wednesday, December 7, 2016

[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。






Tuesday, December 6, 2016

C99 fast data type

C99 fast data type

這個主題是我在看完Efficient C Tip #13 – use the modulus (%) operator with caution這篇文章發現的C99在stdint.h新規範的一些資料型態,所作的小小理解。

C99 fast data type,為一種針對硬體CPU架構所提出的資料型態。主要有這下列八種型態:
uint_fast8_t        
uint_fast16_t
uint_fast32_t
uint_fast64_t
int_fast8_t        
int_fast16_t
int_fast32_t
int_fast64_t
在C99 7.18.1.3是這樣做定義的:
1 Each of the following types designates an integer type that is usually fastest 219) to operate
with among all integer types that have at least the specified width.
2 The typedef name int_fastN_t designates the fastest signed integer type with a width
of at least N . The typedef name uint_fastN_t designates the fastest unsigned integer
type with a width of at least N .
也就是說,這些fast data type確保,你的型態至少為N bit以上(uint_fast8_t至少有8bit width),所以有可能你
宣告一個uint_fast8_t的型態,編出來可能是用16bit裝。
這個型態最重要的用意是aliginment(對齊),一般來說16bitCPU在處理16bit的資料運算有可能8bit的快,這是因為
對齊的因素,因此,這些fast data type在這個例子中直接將uint_fast8_t 定義為uint16_t,來方便CPU運算。

以下這是給16bit MCU的compiler microvhip XC16,在stdint.h中的定義
#ifndef uint_fast8_t                                                            
typedef unsigned int uint_fast8_t;                                              
#define uint_fast8_t uint_fast8_t                                               
#define UINT_FAST8_MAX (65535UL)                                                
#endif  
很明顯可以看到她將uint_fast8_t用unsigned int(16bit)來使用。

Efficient C Tip #13 – use the modulus (%) operator with caution中在16bit的MSP430,作者僅將型態改成,
fast data type,就得到了大幅的加速。在MCU等小型硬體中,在適當的地方使用C99 fast data type可以得到很好的效果。



精選文章

使用Ardunio Atmega2560 連接 nRF24L01+

使用Ardunio Atmega2560 連接 nRF24L01+ 關於library 目前主流有 https://github.com/maniacbug/RF24 與 https://github.com/TMRh20/RF24 這兩個。 其中TMRh20大大做...