例如,有個設備是IIC通訊,需要IO模擬IIC,可以定義hal_iic_init(),hal_iic_start(),然后設備驅動呼叫這些介面,如果這樣,驅動層在HAL層之上,應用層不會呼叫HAL層,只會呼叫驅動層。
可如果設備是片上外設,比如ADC,如果定義hal_adc_init(),這時應用層直接呼叫HAL層,還是把ADC初始化放在驅動層,可如果放在驅動層,它就是一個初始化函式,感覺沒什么意義。
uj5u.com熱心網友回復:
就在此記錄一下對軟體分層的思考吧。采用面向物件的思想,不管是片上外設還是其他設備,每一個都看作是獨立的設備,比如片上ADC1,ADC2這是兩個設備,每個設備都有自己的驅動程式,因為這里以設備為中心,故將驅動層改為設備層,有的設備需要片上外設支持,比如IO操作,所以設備層里有個HAL層,對于片上外設,就沒有HAL層。
強調一下,這里HAL層屬于設備層,是設備驅動程式的一部分,移植的時候,修改HAL層即可。
uj5u.com熱心網友回復:
軟體框架設計中,又遇到個問題:設備層和應用層如何資料互動?uj5u.com熱心網友回復:
雖然資料來源于設備,但需要什么樣的資料,如何處理資料卻取決于應用層,不同的應用可能需要不同的資料,所以將所有的資料定義放在應用層。資料互動以函式回傳值方式或者形參的方式進行,形參可以是值傳遞或地址傳遞,具體選擇哪一種,實踐中再考慮。
主要原則:只在應用層定義資料。
uj5u.com熱心網友回復:
嵌入式系統的軟體分層是有針對性的,基于裸機的編程和調度器(freertos,ucos等)還有專用的VxWorks、linux、wince的分層不會完全一致一般來說,像控制軟體大部分無界面,沒有太多移植性要求,不要過度封裝,例如將電壓采集拆分成adc操作和輸出電壓計算兩部分。
也許你會說,可以有片上ADC和SPI/IIC的ADC,但此時可以直接重寫電壓采集對應的檔案。因為通常嵌入式系統軟體規模不大,否則干脆像VxWorks或linux等系統直接寫個驅動程式,還能實作動態加載。
uj5u.com熱心網友回復:
首先感謝樓上的評論,希望大家多多提點意見,個人總有想不到的地方,眾人拾柴火焰高。樓上說分層基于作業系統,這符合傳統的作業系統原理,因為最基本的原則,作業系統管理硬體,提供介面。不過我這里不打算以作業系統為核心,而是打算以設備為核心,原因有二,一是因為嵌入式主要還是要和各種硬體打交道,二是設備相對獨立,天生可裁剪。而作業系統的功能,只保留任務調度和管理,而且是以服務的方式提供,還有信號量、訊息佇列、定時器等,以及各類軟體功能,比如FIFO、CRC、PID等都以獨立的服務方式提供。
關于重寫這一點,說說我的真實經驗吧,因為就像樓上說的,基本上不同的專案,程式我都是重新寫過,說實話,是不大,寫起來也不難。可這樣每個程式都各具特色,就算相同的功能,實作也不一樣,當然復制粘貼的除外,如果真的重寫,今年和去年的想法還是會有點區別的。這也是我想設計一個程式框架的主要原因,因為如果都用一個框架,就算想法變了,可以算作框架的升級,這是一個持續的程序,不像在每個程式里的變動,雜亂無法延續。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/9297.html
標籤:單片機/工控
上一篇:歐姆龍電機如何獲取當前的角度
下一篇:25WQ128修改界面問題
