2012年4月28日 星期六

簡單多工3版補強

主要是補充巨集。因為結構簡化,使用巨集就可以了。
巨集中的SKIP_CYCLE_TIME_US,請自己填入量測值,現在的4.14是Bee目前用的值,在不同應用值皆不同。
Time Constant是用在 Task_Set_Skip_Next中,可以用    Task_Set_Skip_Next(SKIP_US(25), NextFunction);    使工作延時約25us,但受限於掃描率的時間單位。只是不用自己去算次數,閱讀上也方便些。


void Sleep_Next(void (*p_func)(void));
void WakeUp(unsigned char n);
void Task_Set_Next(void (*p_func)(void));
void Task_Delay_Ms_Next(unsigned int n, void (*p_func)(void));
void Task_Set_Skip_Next(unsigned int n, void (*p_func)(void));


//  Task State
#define  TASK_RUNNING 0
#define  TASK_SKIP  1
#define  TASK_DELAY  2
#define  TASK_WAIT  3


// O.S. Macro
#define     SET_TASK(id,p_func)     {TaskFunc[id]=p_func;}
#define     SET_STATE(id,state)     {Task_State[id]=state;}
#define     SET_DELAY(id,n)         {Task_Delay_Count[id]=n;}


// Time Constant
#define     SKIP_CYCLE_TIME_US      (4.14)
#define     SKIP_TIME_CONSTANT      (1.0/SKIP_CYCLE_TIME_US)
#define     SKIP_US(x)              ((int)((x)*SKIP_TIME_CONSTANT))


32位元MCU新時代

Bee換工作後,參與了一個不錯的團隊。Bee主要工作是架設RTOS及連接硬體裝置。
或是依硬體設定產生所要的信號。

其中有一組人員是搞機器學習。Bee所設計的程式在機器上會收取資料。
機器學習就是將這些機器上的IO及Sensor資料在PC上學習。
有時PC要跑上數小時,再將學習結果轉化為簡單矩陣回存到MCU。
MCU依據現在IO及Sensor的數值,再乘上學習矩陣,很快就得到決策結果。

Bee在未接觸機器學習前,對於人工智慧是停留在遊戲等級,是以規則庫為主的系統。
但機器學習的反應速度,實在是出奇的快,規則庫絶非對手。
不過原先的機器學習是在PC上發展出來的,一但MCU進入32位元。
浮點運算力足夠應付,就開始使用這些新的演算法產生新產品。

32位元MCU直接將MCU帶入新時代。一個以數位信號處理及機器學習的新時代。


2012年4月14日 星期六

STM32 DMA應用

在Cortex-M3上所有的週邊皆有DMA,第一次接觸還覺得很怪。因為以往的單晶片並無此類裝置。

最奇怪的,是ADC不用DMA還不行。主因是ADC支援multi-channel,但卻只有一個data register。

若是啟動Scan功能,會一次多個channel掃入,就好像是有多個ADC,只是時間上是分開的。
但結果全部只在一個data register上。
所以問題來了,一但Scan一個channel結束,沒有取走資料,下一個channel會蓋過。

DMA的功能來了,它就是將資料依各channel分開將結果傳到RAM的位置上。
這個功能很方便,可以將RAM當成是ADC的結果register。還可以利用DMA的半滿旗標,做成double buffer。

其他週邊,如通信也有,若是已知的傳輸內容,可以設定DMA一次做完再通知。
然後就用在UART上看看,設定bund rate為1.5Mhz,就照計算上的速率在傳,傳輸利用率是100%。

Bee在一個24Mhz的單晶片上,利用DMA就實現了us級的信號時間控制。
在幾年前Bee遇到這樣的狀況會利用FPGA/CPLD去做。
但有DMA,FPGA就可以省下來了。
而且ADC也可以設定在訊號產生時做取樣,做到接近FPGA的時間控制,而且有12位元解析度。

重點是,單晶片本身的價格不高,已可以做到精確的時間上做取樣的工作。
所以單晶片在ARM Cortex-M系列的加持下,進入了新的應用方式。
接下來,只剩下工程師要如何發揮的問題了。