2013年2月21日 星期四
STM32系列開始支援SDRAM
顯然是要做影像處理的。
再不出Bee都開始考慮轉廠商了。
不過只有網頁型號,沒有多少資料。
這樣Bee就再等數月再看看了。
2013年2月10日 星期日
從PC看MCU發展
PC也是從8位元一路走到64位元。從使用狀況可以推得MCU使用變革。
最早的PC是從8位元的6502開始,當時資源少,組合語言當道。
再來進入8086的16位元PC,C語言開始使用。DOS是最早的作業系統,基本上是單工的時代。資料用電腦處理開始流行。
到了80386,多工作業系統開始使用。PC進入多元發展,主因是32位元已具有處理絶大部分資料的能力。
再來64位元時代開始,一開始還不知要如何用,因為作業系統不支援,應用程式無法發展。可是一但開始支援,大型資料程式就開始發展。
對應於MCU:
8位元MCU是基本型,以目前來看,價格可能是生存唯一的方法。在這個前題下,只能算是可程式化的智慧型裝置。
16位元MCU就是可以處理資料的基本型,有一段時間大約是DSP的領域。基本應用也是單工來得多。
32位元MCU成熟型。同PC一樣,多工的需求來了,也就是RTOS引入各家爭鳴的時代。如同Windows 3.1對OS2的時代一樣。在這個時代要不要使用多工作業系統也引發工程師之間的爭議。但時代的需求是擋不住的。
目前就是處在32位元MCU大量出現的時代。
64位元MCU,應是大量資料處理才會有應用。就觀察何時會開始。
但MCU和PC介面不同,只能由資料的使用量來推估使用領域的變化。
MCU程式設計技巧:示波器的使用
有使用到ADC功能時,示波器是不可缺少的儀器。
但Bee確實看過許多MCU工程師不會用,原因是由軟體轉來的工程師。
不幸的是,信號處理不是單純的軟體。一定要能看到信號才能寫合適的程式。
所以MCU工程師,示波器還是學會如何操作會好些。
除了一般看信號外,好一點的數位示波器可以儲存波型資料由EXCEL來抓取使用。
Bee在一個案例中,就是用數位示波器上所抓取來的資料在EXCEL中就設計出用來取出所要的信號的方法。連程式都還沒有寫就先找出方法,是可以強化程式適應力。
ADC程式設計有一項難處,就是RAM少,不可能將數秒的資料皆存下來,反應快的系統連要使用通信傳輸出來都會是困難。
所以使用數位示波器這一類的外部記錄器將變得很重要。
只要MCU提供一個啟動信號讓數位示波器開始啟動抓取資料,然後儲存下來做分析用,就算是沒有多少RAM的MCU也不用特別去做儲存。再以數位示波器的資料去設計出對應方法就行了。
MCU程式設計技巧:LA的使用
LA:邏輯分析儀
現在低價位USB LA已經很便宜了。
只要是寫MCU通信,都應會使用LA。
雖然Bee也看過有軟體人寫通信記錄器,但LA除了解通信格式外,另一個是有時間記錄。
有了時間記錄,才知道反應時間是否合理。
這個技巧並不是新的,在專業LA就有出現。
但因時代不同,已是人人可以容易取得的工具。
有了新的觀察工具,程式開發就方便多了。
MCU程式設計技巧:中斷及FIFO的使用
能否有效使用中斷,將是MCU程式是否進入專業領域的關鍵。並不是會使用就可以了,而是能否了解工作的時效性並做工作切割。
這也是Bee將中斷及FIFO放在一起的原因。
在一個具有回授性系統上做PID控制。
因為回授控制具有時間敏感度,故不允許時間上的失誤。
其做法是將命令生成做成FIFO,只要FIFO有空間,就填入新的命令。而中斷則只要負責PID回授的計算方程式,以確保用最短時間內做出反應。
類似的工作也出現在通信上面。
應用層程式總是希望通信可以將整個句子一次輸出。但MCU的世界並不是這樣,通信每出一個字都是要花時間的。可以的做法也是使用FIFO,將整個句子用FIFO存起來,再利用中斷接續中間的工作。
能有效的將工作切割、控制好中斷的時效性,那MCU程式設計就開始進入專業等級。
MCU程式設計技巧:Delay的使用
在有作業系統的系統上,Delay不是問題,只要呼叫對的函式就對了。
程式也很好寫,樣子大概就是以下程式:
void Task(void)
{
for(;;)
{
delay(1);
// do something
}
}
只要控制delay的參數,就可以控制執行頻率。
但在無作業系統的MCU上,這可是嚴重的問題。Bee也以如何處理這個問題來看工程師的MCU程式設計的專業程度。
在許多入門書可以看到delay是這樣寫的:
void delay(unsigned int n)
{
while(n--);
}
若是這樣用,就是MCU新鮮人。
因為做為產品,不會只有一項功能,老闆隨時都會加功能,一但功能修改,就會調不完。
有一個變形方法解決在不同MCU上執行的效率差,就是利用Watch Dog計時器去取代delay()中的參數。利用檢查參數值做為時間計數。
另一個問題是:一但在執行delay()其他工作就停擺。
這樣做出來的產品,往往有一個問題,只會做單工,不會處理多重工作。產品特性很挑時序,只能在對的時間送入對的信號,使產品不具適應性。
專業一點的作法,會使用一個Timer做為計時器去改變變數的值,做為計時的檢知。
int delay=DELAY_TIME;
void main(void)
{
while(1)
{
if(delay == 0)
{
// do something
delay=DELAY_TIME;
}
}
}
void Timer_Interrupt(void)
{
if(delay) delay--;
}
這樣做的效果不錯,只是程式有點不太好寫。但可以使不同工作之間較不相互干擾。不過每次加入新的計時器,又要去改寫中斷程式。
這樣做其產品對於多重工作具有近似的反應時間,唯一的問題是工程師要負擔中斷及其他資源管理,也就是無法多人一起開發程式。另外閱讀性稍差,交接需要多花時間去追蹤變數功能。
MCU程式設計技巧:除錯器之使用
JTAG的使用
這是基本技巧,但看到有人不用就寫了MCU數年,還真是驚訝。
雖然在具回授性系統上並不是很好用,但在程式邏輯除錯還是很好用。
不用的結果,就是找不到人可以教。
Bee待過二家公司,都是使用無JTAG及ICE的系統,人員訓練皆難以進行。
主因是程式技術也是由除錯來的,沒有好的觀察器,又如何知高階程式是如何運作。
另外一個問題是,程式發展久了,往往有些特異,就是程式如何運作連設計者也不知,是硬試出來的,更不用說下一個交接者要如何看懂了。
這種特異程式多了,系統往往有怪毛病,造成產品評價不好,也無人可解。
Simulator的使用
這是好的工具才會有的。但因為可用的地方不多,大部分人玩了一下大概不會再玩。
其實會使用還是可以好好使用。
Bee就用在Boot Loader的開發上。
Simulator是無法模擬在現實電路板上的狀況。
但可以自由載入記憶體資料為其特性,也就是可以裝載大量資料,然後看它如何運作。
故Bee就用在Boot Loader載入應用程式的二進制資料,看它的通信寫入是否正常。
因為Boot Loader也不會開太多裝置,所以只用Simulator就寫玩大半。
而且用Simulator也可以將自己的機器碼抓下來,正好做測試用資料。