Toradex WinCE 庫演進(jìn):新的庫文件方法說明
1). 概述
Windows十多年之前,為了演示我們的 計(jì)算機(jī)模塊 ,或者稱為 系統(tǒng)模塊(SoM),我們編寫了一些WinCE 的代碼。例如 GPIO、I2C、模擬輸入等。當(dāng)時(shí)我們只是為了純粹的演示目的,并沒有關(guān)系諸如維護(hù)、不同模塊之間的兼容性等問題。然而,這些演示程序卻被大量 Windows Embedded Compact 用戶所采用。我們收到越來越多的技術(shù)支持和功能要求,于是我們開始將其集成到演示代碼中去。最終,我們有了今天的針對基于 PXA 和 Tegra® 系統(tǒng)模塊的庫文件包。通過這些庫文件可以可靠和方便地使用我們的模塊。但是,迭代維護(hù)和為新功能提供 API 卻沒有那么容易。
當(dāng)我們?yōu)槲覀兊哪K系列家族添加新的處理器(片上系統(tǒng)或者 SoC),我們決定停止擴(kuò)展舊的 API,而是采用一套全新的 API,我們可以把過去獲得的經(jīng)驗(yàn)都傾注其中。我們稱這套新的庫文件包為“Toradex CE Libraries”。該庫文件包的目標(biāo)和我們原來的一樣:使我們的用戶能夠方便地使用系統(tǒng)模塊的功能。
但是,我們?nèi)齻€(gè)非常重要的要求:
./ 可擴(kuò)展,并可兼容的 API
./ 允許通過注冊表配置庫文件
./ 易于維護(hù)
我們將在新的庫文件包中滿足三個(gè)所有的要求。
2). 可擴(kuò)展,并可兼容的API
為了保持我們的 API 滿足將來的需求,我們決定引入兩套調(diào)用 API。第一種是通常的做法,使用字符串或者整數(shù)將信息傳遞給庫。下面演示了如何將一個(gè)系統(tǒng)模塊的引腳設(shè)置為 GPIO 輸入,并調(diào)用 SetConfigString 函數(shù)激活下拉電阻:
-----------------------------
// Set pin to alternate function GPIO,Input with pull-down
success = Gpio_SetConfigString(hGpio, io1,NULL, L"altfn=ioAltFnGpio,dir=in,pull=down", StoreVolatile);
-----------------------------
另外一個(gè)例子是調(diào)用 SetConfigInt 函數(shù)將 I2C 控制器的速率設(shè)置為 400KHz:
-----------------------------
// Set I2C speed to 400KHz
success = I2c_SetConfigInt(i2c,L"BitRateHz", 400000, StoreVolatile);
-----------------------------
采用字符串的方法允許我們保持 API 的 100% 兼容,并且在將來可以添加現(xiàn)在系統(tǒng)模塊還沒有的更多功能。
第二套調(diào)用的 API 主要出于性能或者采用標(biāo)準(zhǔn)函數(shù)的原因。下面是一個(gè) GPIO 庫文件中修改一個(gè) GPIO 的函數(shù)例程。調(diào)用 SetConfigString 或者 Set ConfigInt 可以實(shí)現(xiàn)同樣的目的,出于性能考慮,我們提供了不需要字符串解析的函數(shù)。
-----------------------------
// Set it to Output, High
Gpio_ConfigureAsGpio(hGpio, io1);
Gpio_SetDir (hGpio, io1, ioOutput);
Gpio_SetLevel (hGpio, io1, ioHigh);
-----------------------------
我們看看采用標(biāo)準(zhǔn)函數(shù)讀取 I2C 的例程。因?yàn)樾阅芫壒?,我們決定不采用一般字符串的方法(例如上的 Get/SetConfig),但是由于讀 I2C(以及類似的函數(shù))已經(jīng)固定,無法針對將來的 SoC 做改變。
-----------------------------
returnValue = I2c_Read(i2c, (DWORD*) data,8);
-----------------------------
3). 允許通過注冊表配置庫文件
正如前面看到的,我們可以通過字符串和整數(shù)配置庫文件。例如也可以在注冊表中配置 SPI 庫使用特定 SPI 接口、片選信號、波特率等,在你的應(yīng)用啟動(dòng)的時(shí)候加載配置。如果你采用下面的方法加載庫:
-----------------------------
hSPI = Spi_Init(L"SPI2");
-----------------------------
庫文件會自動(dòng)從注冊表下面的位置加載配置:
-----------------------------
[HKEY_LOCAL_MACHINE\SOFTWARE\Toradex\SPI2]
BitRateHz=500000
DmaEnable=1
etc.
-----------------------------
你也許會想,這有什么好處。其中一個(gè)很好的優(yōu)勢是,可以針對不同設(shè)備只維護(hù)一個(gè)應(yīng)用。例如,你可以在基于 NXP®(或者可以寫為高通)i.MX6 處理器以及 NXP Vybrid 系統(tǒng)模塊上使用相同的應(yīng)用。模塊之間唯一的不同是引腳配置,現(xiàn)在這些可以保持在注冊表中。剩余的部分完全相同,因此允許你在不同的系統(tǒng)模塊上使用一個(gè)二進(jìn)制應(yīng)用,使得您的開發(fā)更加容易。
4). 易于維護(hù)
在本文的最后我想重點(diǎn)介紹“為維護(hù)而設(shè)計(jì)”方面。為了我們能夠簡單、安全地維護(hù),我們根據(jù)每一種 SoC 將庫文件分為單獨(dú)的源代碼文件。這確保我們能夠在修復(fù)漏洞或者增加 SoC 相關(guān)功能的時(shí)候,保持其他 SoC 部分的代碼不變。這降低了破壞現(xiàn)有代碼的風(fēng)險(xiǎn),因此也使得我們的軟件總體上更加穩(wěn)健。
5). 參考
您可以在我們的開發(fā)者中心 中找到所支持功能的列表以及下載庫文件、API說明等。
同樣歡迎您查看我們的library roadmap,我們公開了所以已知的問題和我們計(jì)劃解決的時(shí)間。
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測試