日本a√视频在线,久久青青亚洲国产,亚洲一区欧美二区,免费g片在线观看网站

        <style id="k3y6c"><u id="k3y6c"></u></style>
        <s id="k3y6c"></s>
        <mark id="k3y6c"></mark>
          
          

          <mark id="k3y6c"></mark>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > mr-library中的GPIO是怎么封裝的?完整拆解+實(shí)戰(zhàn)思路

          mr-library中的GPIO是怎么封裝的?完整拆解+實(shí)戰(zhàn)思路

          作者:嵌入式芯視野 時(shí)間:2025-07-08 來(lái)源:今日頭條 收藏

          MR 框架

          (1)宏定義部分:模式操作封裝

          #define PIN_MODE_SET(_pin, _number, _mode) 
             do {
                 MR_BIT_CLR((_pin)->pins[(_number) / 8], (0xf << (((_number) % 8) * 4)));
                 MR_BIT_SET((_pin)->pins[(_number) / 8], ((_mode) << (((_number) % 8) * 4)));
             } while (0)#define PIN_MODE_GET(_pin, _number)
             ((int)(((_pin)->pins[(_number) / 8] >> (((_number) % 8) * 4)) & 0xf))

          解讀:

          • 使用 pins[] 來(lái)壓縮存儲(chǔ)每個(gè) GPIO 引腳的模式值,每個(gè)引腳占用 4bit。

          • 相當(dāng)于 8 個(gè)引腳共用一個(gè) 32 位整型單元。

          • SET/GET 宏本質(zhì)上是位操作技巧,屬于輕量級(jí)狀態(tài)映射機(jī)制,避免使用結(jié)構(gòu)體數(shù)組。

          (2)內(nèi)部封裝接口:pin_set_mode() & pin_get_mode()

          int pin_set_mode(struct mr_pin *pin, int number, struct mr_pin_config config)
          • 校驗(yàn)引腳編號(hào)合法性;

          • 調(diào)用底層平臺(tái)實(shí)現(xiàn)的 configure() 函數(shù)進(jìn)行實(shí)際模式配置;

          • 再通過(guò) PIN_MODE_SET 記錄設(shè)置狀態(tài)。

          該函數(shù)不僅設(shè)置了底層硬件,還更新了上層狀態(tài)緩存,是對(duì) 狀態(tài)同步封裝 的經(jīng)典做法。

          int pin_get_mode(struct mr_pin *pin, int number, struct mr_pin_config *config)
          • 只讀取本地緩存的模式狀態(tài);

          • 并未從底層硬件重新讀取,高效但不完全精準(zhǔn),需確保狀態(tài)同步一致。

          • (3)設(shè)備接口實(shí)現(xiàn)部分

            int mr_pin_close(struct mr_dev *dev)
            • 當(dāng)關(guān)閉設(shè)備時(shí),自動(dòng)將所有使用過(guò)的引腳設(shè)置為 NONE;

            • 避免引腳懸空或占用;

            • 條件編譯宏 MR_USING_PIN_AUTO_DISABLE 控制是否啟用自動(dòng) disable 功能;

            • 使用 PIN_MODE_GET 查狀態(tài)再?zèng)Q定是否關(guān)閉該引腳。

            這是一個(gè)安全性加強(qiáng)設(shè)計(jì),有助于系統(tǒng)資源釋放。

            ssize_t mr_pin_write(struct mr_dev *dev, const void *buf, size_t count)
          • 與 read 對(duì)稱(chēng):寫(xiě)入指定引腳的電平值;

          • 仍基于 dev->position 表示當(dāng)前操作的引腳編號(hào);

          • 每個(gè)字節(jié)寫(xiě)入一個(gè)值。

          • int mr_pin_ioctl(struct mr_dev *dev, int cmd, void *args)
          • 是控制命令接口,支持動(dòng)態(tài)配置與查詢模式:

            • MR_IOC_PIN_SET_MODE:設(shè)置某個(gè)引腳模式;

            • MR_IOC_PIN_GET_MODE:讀取某個(gè)引腳當(dāng)前模式;

          • 本質(zhì)是平臺(tái)中對(duì) GPIO 控制功能的“高級(jí)指令接口”;

          • 具備通用擴(kuò)展能力,未來(lái)可以支持如設(shè)置上拉、開(kāi)漏、中斷等新指令。

          • ssize_t mr_pin_isr(struct mr_dev *dev, int event, void *args)
          • 響應(yīng)中斷事件(如外部中斷 EXTI);

          • 當(dāng)前僅實(shí)現(xiàn)了 MR_ISR_PIN_EXTI_INT,返回中斷引腳號(hào);

          • 可作為平臺(tái)中斷通知機(jī)制與上層事件處理系統(tǒng)之間的橋梁。

          • (4)注冊(cè)接口:mr_pin_register

            int mr_pin_register(struct mr_pin *pin, const char *path, struct mr_drv *drv)
            • 該函數(shù)將 pin 注冊(cè)到系統(tǒng)設(shè)備樹(shù)中;

            • 使用的是 mr_dev_register(通用設(shè)備注冊(cè)函數(shù));

            • 傳入統(tǒng)一的設(shè)備操作結(jié)構(gòu)體 ops;

            • 注冊(cè)成功后還會(huì)調(diào)用 _mr_fast_pin_init(),進(jìn)行引腳快速訪問(wèn)初始化。

            這是真正把引腳納入設(shè)備系統(tǒng)管理的入口函數(shù)。

            (5)整體架構(gòu)總結(jié)圖示(邏輯調(diào)用流程)

            +---------------------------+|         應(yīng)用層            |
            |   (調(diào)用 pin 讀寫(xiě)函數(shù))     |
            +------------+-------------+
                        |
                        v
            +---------------------------+|    mr_dev 操作接口        |
            | mr_pin_read/write/ioctl   |
            +------------+-------------+
                        |
                        v
            +---------------------------+|    struct mr_pin_ops      |
            | -> read / write / config  |
            | (平臺(tái)相關(guān)的底層操作)      |
            +------------+-------------+
                        |
                        v
            +---------------------------+|   硬件寄存器操作(HAL)   |
            +---------------------------+
          • 總結(jié)亮點(diǎn)設(shè)計(jì)

          • 特性

            實(shí)現(xiàn)方式說(shuō)明

            模式管理高效

            pins[] 使用位操作壓縮記錄所有引腳模式,快速讀寫(xiě)

            安全性設(shè)計(jì)

            配置合法性檢查、自動(dòng) disable、assert 保護(hù)

            與設(shè)備框架深度整合

            實(shí)現(xiàn)設(shè)備標(biāo)準(zhǔn)接口 read/write/ioctl/close

            抽象 + 多態(tài)

            所有操作通過(guò) mr_pin_ops 實(shí)現(xiàn)平臺(tái)無(wú)關(guān)

            支持多引腳統(tǒng)一管理

            通過(guò) dev->position 定位目標(biāo)引腳,實(shí)現(xiàn)統(tǒng)一操作

            可擴(kuò)展 IOCTL 命令

            SET_MODE/GET_MODE 只是開(kāi)始,可擴(kuò)展為完整控制指令集

            開(kāi)源代碼:
            https://gitee.com/MacRsh/mr-library/tree/master


          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉