新聞中心

EEPW首頁 > 牛人業話 > 瑞彩祥云

瑞彩祥云

作者:山坡羊時間:2019-08-28來源:電子産品世界收藏

楔子

本文引用地址:/article/201908/404193.htm

嵌入式系統是硬件搭台、软件唱戏,就像你可以在同一个舞台上演出不同的剧目一样,嵌入式设备的硬件做好后,只要硬件上支持,你可以根据不同的功能要求烧写不同的代码。

在嵌入式軟件的開發階段,需要經過多次更新叠代,軟件版本可以以“裏程碑”的形式,通過版本標號(x.y)對各個軟件版本進行標識和區分。而且,一般情況下,不同的軟件版本中可能會隱藏不同表現形式的缺陷,爲了提高軟件的可靠性和完善性能,需要查找缺陷或者定位缺陷的引入時間,這個時候就需要對不同版本的軟件進行並行測試,以定位缺陷的原因和具體位置。

相比而言,硬件版本相对固定,分不出大哥和二哥,从而无法通过辨认硬件電路特征判断当前被测试的软件的版本,进而无法进一步分析。如果软件本身包含版本信息,通过一种手段从软件中获得版本信息,便可以解决上述问题。

顯然,這裏有一個不言自明的需求:獲取當前的代碼版本信息。對于存在多個代碼版本的嵌入式硬件而言,這是一個“剛需”。

1

曾幾何時,讀取軟件版本只是中高端嵌入式設備的專利,責任越大,能力越大,中高端如它,總有讀取軟件版本信息並呈現出來的方法。

低端設備忝列鄙視鏈的末端,它要麽只有一種軟件實現的版本,從而根本不存在獲取代碼版本信息的需求,要麽雖然有幾個版本,但是“有心殺賊,無力回天”,只能把代碼版本信息隱藏在卑微的塵埃裏。

但是,在很多情況下,低端設備也有獲取代碼版本信息的訴求。

灑家需要做一款信號轉換器,其中,要把電機轉速信息(單位是rpm,轉/分鍾)轉換成車速信息(單位爲km/h),根據公式,車速信息由變速箱的減速比、車輪直徑和電機轉速計算得來。

这个信號轉換器非常之简单,没有任何通信端口,故而无法通过通信的方式、以配置的手段将不同的减速比和车轮直径下載到信號轉換器中,让信號轉換器根据不同的配置计算车速。

为了实现信號轉換器的通用性,让它可以适应不同的速比和轮径,洒家采取的笨办法是在同一个硬件上設計几种不同的软件版本,分别对应不同的减速比和车轮直径,这样一来,在相应的代码中求同存异,就可以复用硬件资源并提高产品的开发效率。

這種思路固然是好,可是問題是,在日常的生産、庫存管理中,如何從一群已經燒錄了代碼又長得一模一樣的信號轉換器中,辨認出它到底支持哪種速比和輪徑呢?

于是,獲取代碼版本信息以就變得十分必要而且迫切了。

2

可是,沒有任何通信端口,沒有任何顯示界面,還想要獲取代碼版本信息,其可得乎?于是,灑家向周邊的同仁征詢意見。

左邊的張工譏我癡人說夢,右邊的李工說我異想天開,前邊的徐工笑我癡心妄想,後面的趙工卻神秘兮兮地豎起一根手指,在我眼前晃來晃去,口中念念有詞:波羅波羅蜜,醒起!

嘩啦啦四周潑下幾盆涼水來,眨眼間澆了我一個透心涼。在這鬧鬧哄哄的冷嘲熱諷中,灑家倒橫下一條心來:世界千奇百怪,衆生千差萬別,但是佛曰,衆生平等。代碼版本就像是人類的身份信息,怎麽就答不得別人的一句-“尊兄台甫?”

獲取代碼版本的基本操作就是“你來問,我來答”,需要和外部世界進行交互。說到交互,自然需要借助信號轉換器當前的接口。接口接口,顧名思義,設備內部連接外部的端口。

如前所述,這個信號轉換器是一個很簡單的産品,連接器上的端口都是一些普通的模擬輸入輸出端口、數字輸入輸出口、脈沖輸入和PWM輸出端口。

看官們也許已經模模糊糊地想到了,可以從未使用的端子上下手,一個輸進去,就是“你來問”,一個輸出來,就是“我來答”。按鍵形式輸入,LED形式輸出,操作起來方便,顯示方式也直觀。

灑家一開始也是這麽想的,而且想得更爲細致。

可以在信號轉換器的外接线缆上用夹线针把其中两根线的信號取出来,另一边一个接按键,一个接LED。同时,当然要在信號轉換器的硬件上添加两处電路,一处实现按键采集,一个实现LED输出驱动,这些電路都很简单,自不待言。

想好解決方案後,灑家起身環顧,把張李諸工叫過來,鼓著腮幫子、噴著唾沫星子和他們講起了我的方案。當其時也,灑家突然心下一凜,想起了一個關鍵的問題:端口夠用否?

我趕緊數了數信號轉換器連接器上還未曾使用過的端子,倒黴催的,沒有用過的端口居然只剩下一路了!待我把目光投向MCU的IO上時,更加心驚地發現,除了用過的IO口和仿真編程口,可用的IO口也只有一個了!

3

一支穿雲箭,千軍萬馬來相見。斧頭幫的混混可以把牛皮吹破了天,可我現在只能對著板子大眼瞪著小眼。

說出去的話,潑出去的水。大話已經出口,再難收回,怎麽辦?

只剩一根線,既要輸入,又得輸出,既可檢測出按鍵狀態,還要輸出得了LED的驅動,除了複用別無他途。而且,除了接口端子上要實現複用之外,MCU的IO那裏也必須一腳兩用。

大概而言,MCU IO长时间处于输入状态,检测到按键按下后便切换为输出模式,通过LED按照一定的规律显示完代码版本信息之后,便再次切换回输入状态。

具體怎麽實現就頗有些燒腦了。灑家調整好呼吸,正襟危坐,如入禅定,一點一滴地思索著。

MCU的IO分時切換輸入和輸出方向,初始方向設置爲輸入。周期性地讀取IO狀態,檢測按鍵的按下和彈起狀態。

檢測到有效的按鍵按下時,等待按鍵彈起引發的IO狀態切換。當彈起時將IO口的方向設置爲輸出,然後以脈沖的方式驅動LED。

爲了區分版本號中的大版本(又稱“基線版本”)和小版本(又稱“更新版本”),需要以不同的頻率輸出相應數量的方波脈沖,以方便觀察者判斷大版本和小版本號。

比如,當版本號爲2.4時,基線版本/大版本號爲2,更新版本/小版本號爲4。可以讓LED以頻率爲2Hz、占空比爲50%的PWM形式輸出2個周期方波,間歇2秒後,再以頻率爲1Hz、占空比爲50%的PWM形式輸出4個周期的方波脈沖。

更一般的,版本號是a.b時,LED的閃爍方式爲a個2Hz頻率方波+間歇2秒+b個1Hz頻率方波。

當LED的顯示完成後,需要再次將IO腳設置爲輸入方向,以等待下一次按鍵形式的問詢。通過在按鍵按下並彈起後統計2s間歇時間前後的LED閃爍次數,便可以得到基線版本和更新版本號。

4

相信經過上面的描述,各位看官已經大致了解了如何用一個IO口一個外接端子獲取代碼版本信息。但是,從硬件上怎麽實現還有些摸不著頭腦。

帮人帮到底,送佛送到西,洒家也不藏私,把電路图贴上来。

平時,IO口處于輸入狀態,按鍵處于彈起狀態,IO口處電平爲低,LED處于熄滅狀態。當按下按鍵,R1上處短接VCC,IO口處電壓爲高,而LED被反向截止,故而繼續處于熄滅狀態。對LED而言,只要IO口是輸入方向,無論按鍵按下還是彈起都是熄滅狀態。

當將IO設置爲輸出方向時,在按鍵處于彈起狀態的條件下,IO電平爲高時,LED導通點亮,IO電平爲低時,LED截止熄滅。

如此一來,通過在單個IO管腳上實現按鍵檢測與LED驅動的複用,以最少的資源實現了便實現了軟件版本的獲取,該方案在資源極其受限的低端嵌入式設備領域上肯定具有廣泛的適用性。

後記

我和同事們通報了這種方案後,諸工依然不置可否,但灑家卻按捺不住地志得意滿。這種方式簡單高效,易于實現,正所謂:瑞彩祥云。



關鍵詞:

評論


相關推薦

技術專區

關閉