硬件和軟件的開發(fā)過程似乎有些相似:發(fā)布了需求規(guī)范;精心設(shè)計(jì);結(jié)果使用一種特殊的語言進(jìn)行編碼(用于硬件的HDL和用于軟件的編程語言)。但是相似之處到此為止。
啟動(dòng)硬件生產(chǎn)時(shí),硬件設(shè)計(jì)會(huì)在某些時(shí)候凍結(jié)。在此之后進(jìn)行更改通常會(huì)很麻煩且昂貴。另一方面,軟件永遠(yuǎn)不會(huì)完成。調(diào)整和完善將持續(xù)到最后一刻。調(diào)整代碼并進(jìn)行重建非常容易。這既是優(yōu)點(diǎn)也是缺點(diǎn)。
由于軟件可以延展性強(qiáng),因此有機(jī)會(huì)進(jìn)行廣泛的測(cè)試并修復(fù)仍然存在的錯(cuò)誤。靈活性的不利之處在于,人們傾向于在最后時(shí)刻進(jìn)行增強(qiáng)和完善。“蠕動(dòng)的優(yōu)雅”是真正的危險(xiǎn)。這些挑戰(zhàn)都是與軟件相關(guān)的,但情況越來越糟……
如果在凍結(jié)設(shè)計(jì)后檢測(cè)到硬件錯(cuò)誤怎么辦?
硬件問題通常昂貴且處理不便。一個(gè)非常常見的解決方案是“將其修復(fù)在軟件中”。這樣的修復(fù)可能是微不足道的,軟件工程師應(yīng)該很高興能夠?yàn)樗麄兊挠布刑峁椭5牵谄渌闆r下,對(duì)代碼的調(diào)整可能會(huì)完全損害軟件設(shè)計(jì)。
設(shè)計(jì)中的錯(cuò)誤與“怪異”之間存在一定程度的模糊性,“怪異”對(duì)于硬件開發(fā)人員來說并不奇怪,但需要包含在軟件中。我們可以用一些示例來說明軟件需要在哪些地方容納硬件的怪異之處。
翻轉(zhuǎn)位
嵌入式系統(tǒng)中最簡(jiǎn)單的輸入設(shè)備是開關(guān)或按鈕。憑直覺,可以預(yù)期處于“關(guān)閉”位置的開關(guān)(或未按下的按鈕)將顯示為0值,并在打開(或按下按鈕)時(shí)轉(zhuǎn)換為1。但是,在幾乎所有情況下,情況都是相反的:關(guān)閉開關(guān)顯示為1并轉(zhuǎn)換為0。這是因?yàn)樗?jiǎn)化了硬件設(shè)計(jì),可以將輸入引腳“上拉”為邏輯1并將其接地(下拉為0)。 )表示輸入。當(dāng)然,一旦開發(fā)人員對(duì)此有所了解,在軟件中的容納就變得微不足道了。
彈跳
關(guān)于開關(guān)或按鈕的另一個(gè)自然期望是,它將僅在兩種邏輯狀態(tài)之間轉(zhuǎn)換。但是,機(jī)械開關(guān)的行為通常不是很理想-觸點(diǎn)閉合,然后彈跳開一次或多次,然后降落到閉合位置。此行為的結(jié)果是,預(yù)期的從1到0的過渡可能會(huì)快速連續(xù)地重復(fù)幾次,未經(jīng)檢查,可能會(huì)被錯(cuò)誤地解釋。想象一下按下一個(gè)按鈕會(huì)增加一個(gè)設(shè)置,但通常會(huì)將其增加2或3而不是1!
這可以固定在硬件中,但這要付出復(fù)雜性和材料清單的代價(jià)。多年來,“修復(fù)軟件”是最佳的選擇,并且已經(jīng)設(shè)計(jì)了許多“反跳”算法。
一切都與時(shí)機(jī)有關(guān)
一些復(fù)雜的外圍硬件可能會(huì)響應(yīng)軟件寫入寄存器的命令。硬件通過執(zhí)行一系列動(dòng)作來響應(yīng)命令的情況并不少見,在此期間它不會(huì)響應(yīng)其他命令。這不是故障,因?yàn)橛布O(shè)計(jì)人員希望設(shè)備以此方式運(yùn)行。但是,從軟件開發(fā)人員的角度來看,這似乎是不合邏輯的。
這給軟件帶來了挑戰(zhàn)。需要包括安全措施,以便在發(fā)出命令時(shí),必須經(jīng)過一段適當(dāng)?shù)臅r(shí)間才能編寫另一條命令。在簡(jiǎn)單的應(yīng)用中,某種延遲循環(huán)可能就足夠了。在更復(fù)雜的軟件中,可能無法在空閑循環(huán)中占用CPU,因?yàn)檫€有其他處理要做。在這種情況下,需要更復(fù)雜的計(jì)時(shí)機(jī)制。
大端或小端
有多種方式可以表示一個(gè)單詞(甚至一個(gè)字節(jié))內(nèi)的數(shù)據(jù)。一個(gè)簡(jiǎn)單的例子是單詞中字節(jié)的順序。他們可能是最不重要的第一或最重要的。兩種方法都不對(duì),而且不同的CPU歷來都是小端或大端的。因此,幾乎不可避免的是,鏈接在一起的兩個(gè)子系統(tǒng)可能對(duì)數(shù)據(jù)表示有不同的想法。
這是在軟件中修復(fù)的另一種候選方法,僅字節(jié)交換或循環(huán)。挑戰(zhàn)在于將接口的使用本地化到執(zhí)行轉(zhuǎn)換的軟件的一小部分。
增加功能
除了規(guī)避硬件中的錯(cuò)誤和怪異之外,以節(jié)省成本為名,或者因?yàn)樵摴δ茉陂_發(fā)過程的后期就被夢(mèng)想了,可以在硬件中有效實(shí)施的功能可以卸載到軟件中并不少見。
這是微處理器控制的替代品,用于伺服液壓系統(tǒng)上的大型硬接線控制面板。當(dāng)時(shí),在微處理器中擁有如此巨大的計(jì)算能力的想法令人鼓舞,當(dāng)然,開發(fā)人員對(duì)此感到迷戀。硬件設(shè)計(jì)已經(jīng)完成,并在非常好的時(shí)間內(nèi)凍結(jié),使生產(chǎn)能夠按計(jì)劃進(jìn)行。在新功能的想法泛濫之前,軟件開發(fā)一直進(jìn)展順利。該軟件被迫屈服(即,其實(shí)時(shí)行為受到損害),因此必須進(jìn)行重大設(shè)計(jì)審查。
隱藏硬件問題:驅(qū)動(dòng)程序
長(zhǎng)期以來,人們已經(jīng)認(rèn)識(shí)到,訪問和控制硬件對(duì)于沒有經(jīng)驗(yàn)的或缺乏經(jīng)驗(yàn)的嵌入式軟件開發(fā)人員可能是一個(gè)特殊的挑戰(zhàn)。結(jié)果,出現(xiàn)了設(shè)備驅(qū)動(dòng)程序的概念。驅(qū)動(dòng)程序只是一個(gè)很小的軟件,它封裝了使用某些硬件的笨拙并提供了與應(yīng)用程序代碼的合理接口。
它是在驅(qū)動(dòng)程序中容納了硬件設(shè)計(jì)的怪癖,理想情況下,應(yīng)該在其中進(jìn)行調(diào)整以解決意外的功能或非功能。
責(zé)任編輯:Ct
評(píng)論
查看更多