性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 4
    回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

單片機(jī)軟件進(jìn)階——分層設(shè)計(jì)與面向?qū)ο蟆?/h1>

      好久沒(méi)更帖子了,寫(xiě)這篇帖子有點(diǎn)底氣不足,畢竟沒(méi)有太深厚的內(nèi)力(功底),算是借鑒心法總綱出來(lái)拋磚引玉吧,希望給道友們打開(kāi)一片新的世界。

      第一個(gè)疑惑點(diǎn):?jiǎn)纹瑱C(jī)大部分情況下都是使用C語(yǔ)言進(jìn)行開(kāi)發(fā),雖然IDE也支持C++,但是真正要用到C++的幾乎微乎其微,提起面向?qū)ο螅X子里第一個(gè)詞可能就是:C++。其實(shí)告訴你一個(gè)小秘密,linux操作系統(tǒng)絕大部分都是用C語(yǔ)言開(kāi)發(fā)的,同樣應(yīng)用了大量的面向?qū)ο蟮脑O(shè)計(jì),也就是說(shuō),C語(yǔ)言的威力可能超乎我們的想象。

      本篇帖子是以RT-thread中設(shè)備IO驅(qū)動(dòng)框架的實(shí)現(xiàn)為例子(心法總綱)來(lái)聊一聊單片機(jī)的中分層技術(shù)和面向?qū)ο螅?/p>

上圖是設(shè)備管理層的構(gòu)架圖(分層思想一目了然),面向?qū)ο蟮念惻c繼承應(yīng)用最多,這里我們只關(guān)注設(shè)備驅(qū)動(dòng)框架層以下的三層,因?yàn)橛玫降氖莗in設(shè)備,比較特殊,她并沒(méi)有應(yīng)用I/O設(shè)備管理層。

其實(shí)設(shè)備驅(qū)動(dòng)的核心就是抽象出了一個(gè)設(shè)備對(duì)象,一切都圍繞著設(shè)備驅(qū)動(dòng)對(duì)象展開(kāi),pin設(shè)備抽象類(結(jié)構(gòu)體實(shí)現(xiàn))如下:

Pin設(shè)備對(duì)象的定義如下:static struct rt_device_pin _hw_pin;

這里定義了一個(gè)設(shè)備實(shí)例,但是沒(méi)有對(duì)實(shí)例對(duì)象初始化,還無(wú)法具體的操作,因?yàn)槠鋬?nèi)部結(jié)構(gòu)體成員為空。

接下來(lái)需要進(jìn)行關(guān)鍵的一步,就是設(shè)備實(shí)例的初始化。

以下函數(shù)中進(jìn)行hw_pin設(shè)備實(shí)例的初始化:

int rt_hw_pin_init(void)
{
#if defined(__HAL_RCC_GPIOA_CLK_ENABLE)
    __HAL_RCC_GPIOA_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOB_CLK_ENABLE)
    __HAL_RCC_GPIOB_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOC_CLK_ENABLE)
    __HAL_RCC_GPIOC_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOD_CLK_ENABLE)
    __HAL_RCC_GPIOD_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOE_CLK_ENABLE)
    __HAL_RCC_GPIOE_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOF_CLK_ENABLE)
    __HAL_RCC_GPIOF_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOG_CLK_ENABLE)
    #ifdef SOC_SERIES_STM32L4
        HAL_PWREx_EnableVddIO2();
    #endif
    __HAL_RCC_GPIOG_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOH_CLK_ENABLE)
    __HAL_RCC_GPIOH_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOI_CLK_ENABLE)
    __HAL_RCC_GPIOI_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOJ_CLK_ENABLE)
    __HAL_RCC_GPIOJ_CLK_ENABLE();
#endif

#if defined(__HAL_RCC_GPIOK_CLK_ENABLE)
    __HAL_RCC_GPIOK_CLK_ENABLE();
#endif

    return rt_device_pin_register("pin", &_stm32_pin_ops, RT_NULL);
}

關(guān)鍵的在于調(diào)用rt_device_pin_register函數(shù),這個(gè)函數(shù)來(lái)自于設(shè)備驅(qū)動(dòng)框架層,其中hw_pin對(duì)象也來(lái)自于設(shè)備驅(qū)動(dòng)框架層。

輸入?yún)?shù)有注冊(cè)設(shè)備名稱”pin”,設(shè)備操作函數(shù)結(jié)構(gòu)體指針_stm32_pin_ops,這兩個(gè)參數(shù),通過(guò)上層注冊(cè)函數(shù)將hw_pin對(duì)象與底層的設(shè)備的操作函數(shù)建立聯(lián)系。

關(guān)于_stm32_pin_ops的結(jié)構(gòu)體(其實(shí)C語(yǔ)言中的結(jié)構(gòu)體,在面向?qū)ο笾锌梢钥醋魇穷?,結(jié)構(gòu)體與實(shí)例,對(duì)應(yīng)于類與對(duì)象的概念)原型如下:

接下來(lái)看一下rt_device_pin_register函數(shù):

_hw_pin的parent成員是device類型對(duì)象,pin設(shè)備并沒(méi)有用到設(shè)備管理層API ,而是直接用的設(shè)備驅(qū)動(dòng)框架層提供的API函數(shù):

主要有以下幾個(gè):

void rt_pin_mode(rt_base_t pin, rt_base_t mode);  //設(shè)置引腳模式

void rt_pin_write(rt_base_t pin, rt_base_t value);   //引腳電平輸出設(shè)置

int  rt_pin_read(rt_base_t pin); //引腳電平輸入讀取

設(shè)備對(duì)象注冊(cè)函數(shù)rt_device_register(&_hw_pin.parent,name,RT_DEVICE_FLAG_RDWR);完成了對(duì)象管理器相關(guān)的注冊(cè)(實(shí)際是鏈表相關(guān)的操作):

執(zhí)行之后,當(dāng)系統(tǒng)運(yùn)行起來(lái)以后,我們可以在shell命令窗口輸入list_device命令,查看系統(tǒng)當(dāng)前所有的設(shè)備,會(huì)發(fā)現(xiàn)我們的設(shè)備成功注冊(cè):

到這里,扔出來(lái)的磚就結(jié)束了,其實(shí)很想能夠?qū)⒆约合氡磉_(dá)的東西傳遞給大家,但是讀完寫(xiě)的帖子又總覺(jué)得差強(qiáng)人意,如果筒子們對(duì)嵌入式軟件感興趣,一定要嘗試著去玩玩RTT,她會(huì)帶給你很多意想不到的收獲,底子扎實(shí)的又有機(jī)會(huì)的可以直接晉級(jí)嵌入式linux領(lǐng)域(其實(shí)多數(shù)RTOS都是linux的皮毛,學(xué)術(shù)角度,當(dāng)然各有所長(zhǎng)),她不止能帶給你高大上的趕腳:

全部回復(fù)(0)
正序查看
倒序查看
現(xiàn)在還沒(méi)有回復(fù)呢,說(shuō)說(shuō)你的想法
發(fā)