99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

程序小白
認證:優質創作者
所在專題目錄 查看專題
單片機應用與驅動開發之路:這時的你只需要扣動扳機。
RT-Thread驅動之路:stm32設備驅動開發之uart注冊①
RT-Thread驅動之路:stm32設備驅動開發之uart設備創建②
RT-Thread驅動之路:stm32設備驅動開發之uart操作方法③
RT-Thread驅動之路:stm32設備驅動開發之uart中斷處理④
RT-Thread驅動之路:stm32設備驅動開發之淺析注冊機制⑤
作者動態 更多
基于stm32采用PWM驅動伺服控制器學習筆記
05-13 15:25
基于STM32驅動TM1638學習筆記——軟件篇
04-19 12:42
基于TM1638驅動8位數碼管設計分享
02-24 11:26
RT-Thread驅動之路: Studio創建FAL分區⑤
01-02 08:30
RT-Thread驅動之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

RT-Thread驅動之路:stm32設備驅動開發之uart注冊①


      開篇分割線,驅動開發和應用是完全兩條路子,系統里面應用程序想要通過名稱或者句柄找到驅動的必要條件就是,驅動已經被注冊到了系統里了,那么我們的第一篇就聊聊他是如何被注冊到系統里面的,直接上圖看下其調用關系:

      首先我們看到系統初始化過程中,需要對板載硬件進行初始化,調用rt_hw_board_init,而內部使用大量的預編譯宏進行開關控制各個硬件部分是不是需要進行初始化,接下來看下函數rt_hw_usart_init:

int rt_hw_usart_init(void)
{
    rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart);
    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
    rt_err_t result = 0;

    stm32_uart_get_dma_config();

    for (int i = 0; i < obj_num; i++)
    {
        uart_obj[i].config = &uart_config[i];
        uart_obj[i].serial.ops    = &stm32_uart_ops;
        uart_obj[i].serial.config = config;
        /* register UART device */
        result = rt_hw_serial_register(&uart_obj[i].serial, uart_obj[i].config->name,
                                       RT_DEVICE_FLAG_RDWR
                                       | RT_DEVICE_FLAG_INT_RX
                                       | RT_DEVICE_FLAG_INT_TX
                                       | uart_obj[i].uart_dma_flag
                                       , NULL);
        RT_ASSERT(result == RT_EOK);
    }

    return result;
}

      這里我們先不分析代碼里面的大部分內容,而是迎來了系統為我們提供的第一個注冊函數rt_hw_serial_register,它是你理解注冊的第一步接下來我們看下這個函數的原形:

/*
 * serial register
 */
rt_err_t rt_hw_serial_register(rt_device_t device, const char* name, rt_uint32_t flag, struct serial_device *serial)
{
    RT_ASSERT(device != RT_NULL);

    device->type        = RT_Device_Class_Char;
    device->rx_indicate = RT_NULL;
    device->tx_complete = RT_NULL;
    device->init        = rt_serial_init;
    device->open        = rt_serial_open;
    device->close       = rt_serial_close;
    device->read        = rt_serial_read;
    device->write       = rt_serial_write;
    device->control     = rt_serial_control;
    device->user_data   = serial;

    /* register a character device */
    return rt_device_register(device, name, RT_DEVICE_FLAG_RDWR | flag);
}

      我們注意下它的輸入參數,這非常重要,第一個就是一個對象實體(當然C語言中就是一個結構體變量),第二個參數我們得給這個對象起個名字,這樣方便我們的應用更好的找到我們的對象,第三個參數是對象的人設(舉個例子它可以進行那些操作的合集,比如或者讀or寫),四個參數則是這個對象的私有數據(user_data,也就是我和別人不一樣的點),這個函數的主要任務就是,定義設備的類型:RT_Device_Class_Char,并且設備的動作賦真實可操作的值:初始化/打開/關閉/讀/寫/控制操作。

      最后的最后它需要調用系統提供的rt_device_register完成最終的注冊,原型如下:

      最后的最后我們倒序的方式回憶一下,設備注冊都做了什么:

rt_device_register:設備對象dev  與設備name 建立聯系,并賦值掙得操作flag類型。

rt_hw_serial_register:設備對象dev的操作方法具體賦值,私有數據賦值和類型賦值,豐富dev對象,然后調用rt_device_register。

rt_hw_usart_init:傳入真實的設備操作方法,比如我們用的是stm32芯片,這里就需要將真實的硬件驅動操作方法,串口配置參數傳入到serial結構體中,下一章我們會基于這個API講講設備驅動的詳細實現細節。

聲明:本內容為作者獨立觀點,不代表電子星球立場。未經允許不得轉載。授權事宜與稿件投訴,請聯系:editor@netbroad.com
覺得內容不錯的朋友,別忘了一鍵三連哦!
贊 3
收藏 5
關注 149
成為作者 賺取收益
全部留言
0/200
成為第一個和作者交流的人吧
主站蜘蛛池模板: 邻居少妇张开腿让我爽了在线观看 | omofun动漫在线观看 | 99精品成人无码A片观看 | 日韩一级黄色大片 | 姑娘第7集在线观看 | 18禁黄网站免费 | 久久久久久久免费视频 | 天天舔日日操 | a级大片在线观看 | 日韩高清免费观看 | 晚上偷偷与邻居做爰了小说 | 国产在线精品拍揄自揄免费 | 亚洲人成黄69影院 | 久久亚洲国产精品五月天婷 | 欧洲亚洲一区二区三区 | 手机成人在线观看 | 国产一区二区视频免费 | 中文字幕一区二区在线视频 | 国产成人精品免费视频大全办公室 | 在线免费av网站 | 国产精品三级在线观看无码 | 少妇精品亚洲一区二区成人 | 国产精品自产拍在线观看55亚洲 | 色噜噜噜噜噜噜亚洲精品 | 91精品久久久久久久久中文字幕 | 狂猛欧美激情性xxxx在线观看 | 久久精品免费 | 精品在线观看一区二区 | 亚洲麻豆av| 久久精品国产99精品最新 | 99免费精品视频 | 橘梨纱av一区二区三区在线观看 | 国产香蕉97碰碰视频VA碰碰看 | 狠狠操一区二区三区 | 久久只精品国产 | 国产精品视频麻豆 | 在线观看av网站永久 | 欲望之岛在线免费观看 | 精品视频无码一区二区三区 | 福利国产 | 久久艳片|