RTT內核對象——設備
RT-Thread有多種內核對象,其中設備device就是其中一種。
內核繼承關系圖如下:
設備繼承關系圖如下:
device對象對應的結構體如下:
其中,設備類型type有如下幾類:
設備的操作方法結構體:
I/O設備模型框架
RT-Thread 提供了一套簡單的 I/O 設備模型框架 :
應用程序通過 I/O 設備管理接口獲得正確的設備驅動,然后通過這個設備驅動與底層 I/O 硬件設備進行數據(或控制)交互。
I/O 設備管理層:實現了對設備驅動程序的封裝。 設備驅動程序的升級、更替不會對上層應用產生影響, 從而降低了代碼的耦合性、復雜性,提高了系統的可靠性。
設備驅動框架層: 對同類硬件設備驅動的抽象, 將不同廠家的同類硬件設備驅動中相同的部分抽取出來。
設備驅動層: 是一組驅使硬件設備工作的程序,實現訪問硬件設備的功能。 這一層是與硬件有關的,不同的芯片的同種外設驅動是不同的,STM32的GPIO驅動與NXP的GPIO驅動是不同的。這一層負責創建與注冊I/O設備,對於操作邏輯簡單的設備,可以不經過設備驅動框架層。
設備的兩種注冊方式
1、 對於操作邏輯簡單的設備,可以不經過設備驅動框架層,直接將設備注冊到 I/O 設備管理器中:
2、 對於另一些設備,如看門狗等,則會將創建的設備實例先注冊到對應的設備驅動框架中,再由設備驅動框架向 I/O 設備管理器進行注冊 :
I/O設備接口
1、創建及注冊I/O設備
設備創建:
設備注冊:
2、訪問I/O設備
應用程序通過 I/O 設備管理接口來訪問硬件設備,當設備驅動實現后,應用程序就可以訪問該硬件。
I/O 設備管理接口與 I/O 設備的操作方法的映射關系下圖所示:
查找設備:
初始化設備:
打開和關閉設備:
控制設備:
讀寫設備:
數據收發回調:
GPIO(PIN)設備模型
上面說的設備驅動層有兩種注冊設備的方式,對應的應用程序也有兩種訪問設備的方式。一種是通過設備操作接口訪問,另一種是通過通用的設備驅動來訪問。這里我們使用通用的GPIO設備驅動(對應源碼:pin.c
)來訪問GPIO設備。其中通用的設備驅動在RT-Thread代碼中作為一個組件,對應的路徑為:
rt-thread\components\drivers
這個文件夾下有很多驅動框架:
我們用的GPIO(PIN)設備驅動pin.c
存在於文件夾misc
下。
GPIO輸入輸出實驗(按鍵點燈):
創建一個pin線程:
按鍵按下LED被點亮,按鍵松開LED熄滅。
static void pin_thread_entry(void *parameter)
{
unsigned int count = 1;
/* 設置LED引腳為輸出模式 */
rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
/* 設置KEY0引腳為輸入模式 */
rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);
while (count > 0)
{
/* 讀取KEY0引腳狀態 */
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
rt_thread_mdelay(50);
if (rt_pin_read(PIN_KEY0) == PIN_LOW)
{
count++;
rt_kprintf("KEY0 pressed! LED ON! count = %d\n", count);
rt_pin_write(PIN_LED_R, PIN_LOW);
}
}
else
{
rt_pin_write(PIN_LED_R, PIN_HIGH);
}
rt_thread_mdelay(10);
}
}
int main(void)
{
/* 線程句柄定義 */
rt_thread_t tid;
/* 創建動態pin線程 :優先級 25 ,時間片 5個系統滴答,線程棧512字節 */
tid = rt_thread_create("pin_thread",
pin_thread_entry,
RT_NULL,
STACK_SIZE,
THREAD_PRIORITY,
TIMESLICE);
/* 創建成功則啟動動態線程 */
if (tid != RT_NULL)
{
rt_thread_startup(tid);
}
return 0;
}
下載程序,在終端輸入list_device命令:
可以看到device是pin,類型是Miscellaneous Device,說明我們正在使用通用的GPIO設備驅動。這個實驗中有三個文件值得關注,分別是
device.c:設備管理層
pin.c:設備驅動框架層
drv_gpio.c:設備驅動層
其中device.c
與pin.c
屬於RT-Thread的范疇,drv_gpio.c
與具體的硬件有關,這個文件里操控的就是與硬件有關的東西,如:
程序中用到的rt_pin_mode
及rt_pin_write
等都是PIN設備管理接口。PIN設備管理有如下幾個接口:
設置引腳模式:
RT-Thread 提供的引腳編號需要和芯片的引腳號區分開來,它們並不是同一個概念,引腳編號由 PIN設備驅動程序定義,和具體的芯片相關。
設置引腳電平:
讀取引腳電平:
綁定引腳中斷回調函數:
使能引腳中斷:
脫離引腳中斷回調函數:
以上就是本次的筆記,如有錯誤,歡迎指出。
我的個人博客:https://zhengnianli.github.io/
我的微信公眾號:嵌入式大雜燴