日韩在线不卡免费视频一区,日韩欧美精品一区二区三区经典,日产精品码2码三码四码区,人妻无码一区二区三区免费,日本feerbbwdh少妇丰满

程序小白
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專(zhuān)題目錄 查看專(zhuān)題
單片機(jī)應(yīng)用與驅(qū)動(dòng)開(kāi)發(fā)之路:這時(shí)的你只需要扣動(dòng)扳機(jī)。
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之uart注冊(cè)①
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之uart設(shè)備創(chuàng)建②
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之uart操作方法③
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之uart中斷處理④
RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之淺析注冊(cè)機(jī)制⑤
作者動(dòng)態(tài) 更多
基于stm32采用PWM驅(qū)動(dòng)伺服控制器學(xué)習(xí)筆記
05-13 15:25
基于STM32驅(qū)動(dòng)TM1638學(xué)習(xí)筆記——軟件篇
04-19 12:42
基于TM1638驅(qū)動(dòng)8位數(shù)碼管設(shè)計(jì)分享
02-24 11:26
RT-Thread驅(qū)動(dòng)之路: Studio創(chuàng)建FAL分區(qū)⑤
01-02 08:30
RT-Thread驅(qū)動(dòng)之路: Studio 掛載通用SPI flash④
2024-12-23 13:41

RT-Thread驅(qū)動(dòng)之路:stm32設(shè)備驅(qū)動(dòng)開(kāi)發(fā)之uart注冊(cè)①


      開(kāi)篇分割線(xiàn),驅(qū)動(dòng)開(kāi)發(fā)和應(yīng)用是完全兩條路子,系統(tǒng)里面應(yīng)用程序想要通過(guò)名稱(chēng)或者句柄找到驅(qū)動(dòng)的必要條件就是,驅(qū)動(dòng)已經(jīng)被注冊(cè)到了系統(tǒng)里了,那么我們的第一篇就聊聊他是如何被注冊(cè)到系統(tǒng)里面的,直接上圖看下其調(diào)用關(guān)系:

      首先我們看到系統(tǒng)初始化過(guò)程中,需要對(duì)板載硬件進(jìn)行初始化,調(diào)用rt_hw_board_init,而內(nèi)部使用大量的預(yù)編譯宏進(jìn)行開(kāi)關(guān)控制各個(gè)硬件部分是不是需要進(jìn)行初始化,接下來(lái)看下函數(shù)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;
}

      這里我們先不分析代碼里面的大部分內(nèi)容,而是迎來(lái)了系統(tǒng)為我們提供的第一個(gè)注冊(cè)函數(shù)rt_hw_serial_register,它是你理解注冊(cè)的第一步接下來(lái)我們看下這個(gè)函數(shù)的原形:

/*
 * 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);
}

      我們注意下它的輸入?yún)?shù),這非常重要,第一個(gè)就是一個(gè)對(duì)象實(shí)體(當(dāng)然C語(yǔ)言中就是一個(gè)結(jié)構(gòu)體變量),第二個(gè)參數(shù)我們得給這個(gè)對(duì)象起個(gè)名字,這樣方便我們的應(yīng)用更好的找到我們的對(duì)象,第三個(gè)參數(shù)是對(duì)象的人設(shè)(舉個(gè)例子它可以進(jìn)行那些操作的合集,比如或者讀or寫(xiě)),四個(gè)參數(shù)則是這個(gè)對(duì)象的私有數(shù)據(jù)(user_data,也就是我和別人不一樣的點(diǎn)),這個(gè)函數(shù)的主要任務(wù)就是,定義設(shè)備的類(lèi)型:RT_Device_Class_Char,并且設(shè)備的動(dòng)作賦真實(shí)可操作的值:初始化/打開(kāi)/關(guān)閉/讀/寫(xiě)/控制操作。

      最后的最后它需要調(diào)用系統(tǒng)提供的rt_device_register完成最終的注冊(cè),原型如下:

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

rt_device_register:設(shè)備對(duì)象dev  與設(shè)備name 建立聯(lián)系,并賦值掙得操作flag類(lèi)型。

rt_hw_serial_register:設(shè)備對(duì)象dev的操作方法具體賦值,私有數(shù)據(jù)賦值和類(lèi)型賦值,豐富dev對(duì)象,然后調(diào)用rt_device_register。

rt_hw_usart_init:傳入真實(shí)的設(shè)備操作方法,比如我們用的是stm32芯片,這里就需要將真實(shí)的硬件驅(qū)動(dòng)操作方法,串口配置參數(shù)傳入到serial結(jié)構(gòu)體中,下一章我們會(huì)基于這個(gè)API講講設(shè)備驅(qū)動(dòng)的詳細(xì)實(shí)現(xiàn)細(xì)節(jié)。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺(jué)得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 3
收藏 5
關(guān)注 151
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧