RT-Thread有多種內核對象,其中設備device就是其中一種。git
內核繼承關係圖以下:github
設備繼承關係圖以下:微信
device對象對應的結構體以下:框架
其中,設備類型type有以下幾類:函數
設備的操做方法結構體:線程
RT-Thread 提供了一套簡單的 I/O 設備模型框架 :3d
應用程序經過 I/O 設備管理接口得到正確的設備驅動,而後經過這個設備驅動與底層 I/O 硬件設備進行數據(或控制)交互。code
I/O 設備管理層:實現了對設備驅動程序的封裝。 設備驅動程序的升級、更替不會對上層應用產生影響, 從而下降了代碼的耦合性、複雜性,提升了系統的可靠性。component
設備驅動框架層: 對同類硬件設備驅動的抽象, 將不一樣廠家的同類硬件設備驅動中相同的部分抽取出來。對象
設備驅動層: 是一組驅使硬件設備工做的程序,實現訪問硬件設備的功能。 這一層是與硬件有關的,不一樣的芯片的同種外設驅動是不一樣的,STM32的GPIO驅動與NXP的GPIO驅動是不一樣的。這一層負責建立與註冊I/O設備,對於操做邏輯簡單的設備,能夠不通過設備驅動框架層。
一、 對於操做邏輯簡單的設備,能夠不通過設備驅動框架層,直接將設備註冊到 I/O 設備管理器中:
二、 對於另外一些設備,如看門狗等,則會將建立的設備實例先註冊到對應的設備驅動框架中,再由設備驅動框架向 I/O 設備管理器進行註冊 :
一、建立及註冊I/O設備
設備建立:
設備註冊:
二、訪問I/O設備
應用程序經過 I/O 設備管理接口來訪問硬件設備,當設備驅動實現後,應用程序就能夠訪問該硬件。
I/O 設備管理接口與 I/O 設備的操做方法的映射關係下圖所示:
查找設備:
初始化設備:
打開和關閉設備:
控制設備:
讀寫設備:
數據收發回調:
上面說的設備驅動層有兩種註冊設備的方式,對應的應用程序也有兩種訪問設備的方式。一種是經過設備操做接口訪問,另外一種是經過通用的設備驅動來訪問。這裏咱們使用通用的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/
個人微信公衆號:嵌入式大雜燴