作者:陸向陽
2005年的Arduino使用的是8位元MCU微控制器,運算力弱,同時間只能做一件事,稱為單工。但近年來新推出的Arduino開發板多已改用Cortex-M系列核心的處理器,已非當年的吳下阿蒙,在運算力大大提升下,若持續同時間只做一件事其實是很浪費的,因此Arduino官方開始嘗試為Arduino加入多工機制。
Arduino嘗試引入多工執行能力
其實現行的Arduino程式也能實現多工,作法是快速的循環執行loop()函式來更新所有狀態變數,同時呼叫millis()函式來確保多工的時間正確性,但這樣做會大量增加程式碼,導致程式不好除錯、不好維護。而且,上述作法是以單一核心快速執行來實現多工,並無法支援多核,隨著多核晶片日益普及,現行作法也逐漸不合時宜。
所以,新的提案作法是提出與使用「多工排程器函式庫」來實現協調式多工,如此可以把程式拆分成多個循環函式來執行,這樣可以讓程式碼簡潔,除錯、維護也就能容易些。
不過,也因為是協調式多工,一旦有某個程式撰寫不佳,執行時霸佔了系統主控權不放,其他工作也就會被拖延或停擺。另外,新多工提案也還在初步嘗試階段,依然無法支援多核,且未來若支援多核也有一些隱憂,例如多個執行緒(thread)存取同一個變數時會有問題。
還有一點是,因為是採行疲於循環(busy-loop)的多工執行,會使程式無法休息,但一般而言我們希望程式能盡量休息、休眠,只有受到事件(event)觸發或有數據傳入時才喚醒運作,處理完事件與數據後則儘快回到休眠狀態,以便達到省電運作,但此一多工作法難以省電。
歸結而言,Arduino官方也還在嘗試更好的多工方式,希望能發展出一套標準的應用程式介面(API),往後只要大家善用這套API就能輕鬆實現多工程式且能輕鬆除錯、維護。目前Arduino已經將相關資料與程式碼放到GitHub上 ,希望邀請各路創客一同參與討論 ,並一起實現更理想的多工函式庫、應用程式介面。
Arduino推出官方版USB纜線
最近Arduino推出了官方版USB纜線,這舉動或許大家的第一個念頭是:多此一舉。畢竟USB纜線是再尋常不過的東西,用哪一家、哪一條還不是都一樣?有必要用官方版的嗎?
而且,官方版的USB纜線並不便宜,一條要價8.4歐元,或是9.8美元,若以1:27匯率而言也要約265元新台幣,比一般市售的貴,而夜市更是常有一條99元的在銷售。
不過,多數人心裏也有數,有的USB纜線不太耐用,用個幾個月或一年上下,或者是比較扭曲的纏繞使用,很快就會接觸不良、時靈光時不靈光的,丟也不是,不丟又用的很不便,有著濃厚的消耗性意味。
特別是對創客(Maker)而言,使用USB線路多是為了供電給開發板,有時是透過USB進行程式燒錄(將程式從電腦傳向開發板),如果線路有問題,必然會有很重的失望與沮喪,畢竟每次的燒錄與送電,都希望作品能如預想般的發揮運作,若線路這種小東西出了亂子真的是會讓人跳腳,特別是身邊沒有可用的替換線路時。
或許基於上述理由Arduino決議推出官方版USB線路,線路約1公尺長,兩端都是USB Type-C公的接頭,但也隨附一個轉接器(adapter),可以將Type-C接頭轉換成傳統的Type-A接頭,以便適用在比較舊的系統上,舊系統通常沒有USB Type-C連接埠。
另外,為了加強對扭曲拉扯的耐受性,線路外有一層尼龍材料編織成的外覆,這點跟其他也訴求耐用性的USB線路相同。
最後,既然是官方出的,上頭自然會印有Arduino字樣,或許可以滿足一下一點「虛榮」,類似有人會指名購買義大利原廠的Arduino Uno R3開發板,但有的人覺得協力業者(Third Party)的相容開發板也是不錯。
延伸閱讀:
傳統手法實現的多工程式範例:https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay
使用多工排程器函式庫的撰寫範例,同時控制多組LED亮滅的程式:https://docs.arduino.cc/tutorials/generic/multiple-blinks