1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        分享一個(gè)適用于MCU項(xiàng)目的代碼框架

        共 3000字,需瀏覽 6分鐘

         ·

        2022-08-04 07:01

            關(guān)注、星標(biāo)公眾號(hào),直達(dá)精彩內(nèi)容

        來源:https://github.com/notrynohigh/BabyOS


        一個(gè)好的代碼架構(gòu)直接影響項(xiàng)目的質(zhì)量,今天為大家分享的是一個(gè)管理功能模塊和外設(shè)驅(qū)動(dòng)的框架:BabyOS.


        BabyOS是什么?

        BabyOS適用于MCU項(xiàng)目,它是一套管理功能模塊和外設(shè)驅(qū)動(dòng)的框架。

        對(duì)項(xiàng)目而言,縮短開發(fā)周期。項(xiàng)目開發(fā)時(shí)選擇適用的功能模塊及驅(qū)動(dòng)。直接進(jìn)入功能代碼編寫的階段。


        對(duì)工程師而言,減少重復(fù)工作。調(diào)試過的功能模塊和驅(qū)動(dòng)代碼放入BabyOS中進(jìn)行管理,以后項(xiàng)目可以直接使用,去掉重復(fù)調(diào)試的工作。


        適用項(xiàng)目

        使用裸機(jī)開發(fā)的項(xiàng)目推薦基于BabyOS進(jìn)行。


        前世今生

        說一說編寫B(tài)abyOS原由

        ................

        目前使用MCU裸機(jī)開發(fā)的項(xiàng)目不會(huì)很龐大,大多有兩個(gè)要求:開發(fā)時(shí)間和產(chǎn)品功耗。99.874%產(chǎn)品是電池供電,功耗是重點(diǎn)考慮對(duì)象。工程師開發(fā)的多個(gè)項(xiàng)目之間總會(huì)碰到相同的功能點(diǎn),那么是否可以有套代碼框架可以容納已經(jīng)做過的功能點(diǎn),去掉重復(fù)的工作,加快產(chǎn)品或者demo的開發(fā)。


        功耗的考量

        出于功耗考慮,對(duì)外設(shè)的操作是:喚醒外設(shè),操作,最后進(jìn)入休眠。這樣的操作形式和文件的操作很類似,文件的操作步驟是打開到編輯到關(guān)閉。


        因此將外設(shè)的操作看作是對(duì)文件的操作進(jìn)行。每個(gè)外設(shè)打開后返回一個(gè)描述符,后續(xù)代碼中對(duì)外設(shè)的操作都是基于這個(gè)描述符進(jìn)行。關(guān)閉外設(shè)后回收描述符。


        所以外設(shè)的驅(qū)動(dòng)中打開和關(guān)閉的操作執(zhí)行對(duì)設(shè)備的喚醒和睡眠。利用描述符來操作外設(shè)還有一個(gè)好處是,當(dāng)更換外設(shè)后,只需更換驅(qū)動(dòng)接口,業(yè)務(wù)部分的代碼不需要變動(dòng)


        快速開發(fā)

        小型項(xiàng)目的開發(fā)中,有較多使用率高的功能模塊,例如:UTC、錯(cuò)誤管理、電池電量、存儲(chǔ)數(shù)據(jù)、上位機(jī)通信、固件升級(jí)等等。將這些功能都做成不依賴于硬件的模塊交給BabyOS管理。將調(diào)試好的外設(shè)驅(qū)動(dòng)也交給BabyOS管理。再次啟動(dòng)項(xiàng)目時(shí),通過配置文件,選擇當(dāng)前項(xiàng)目使用的功能模塊。以搭積木的方式縮短開發(fā)時(shí)間。


        使用方法

        1.添加文件

        bos/core/src 核心文件及功能模塊全部添加至工程

        bos/driver/src 選擇需要的驅(qū)動(dòng)添加至工程

        bos/hal/ 添加至工程,根據(jù)具體平臺(tái)進(jìn)行修改


        2.選擇功能模塊

        對(duì)于b_config.h進(jìn)行配置,根據(jù)自己的需要選擇功能模塊。


        3.列出需要使用的設(shè)備

        找到b_device_list.h,在里面添加使用的外設(shè)。例如當(dāng)前項(xiàng)目只需要使用flash和模擬串口,那么添加如下代碼:

        //           設(shè)備        驅(qū)動(dòng)接口      描述B_DEVICE_REG(W25QXX, bW25X_Driver, "flash")B_DEVICE_REG(SUART, SUART_Driver, "suart")


        4.使用范例

        #include "b_os.h"    //頭文件//b_config.h配置文件中使能KV存儲(chǔ)int main(){    uint8_t buf[128];    //......    bInit();    //初始化,外設(shè)的初始化會(huì)在此處調(diào)用
        //下面舉例使用:W25QXX和KV存儲(chǔ)功能模塊,其中W25QXX已經(jīng)添加到b_device_list.h if(0 == bKV_Init(W25QXX, 0xA000, 4096 * 4, 4096)) //初始化KV存儲(chǔ),指定存儲(chǔ)設(shè)備W25QXX { b_log("bKV_Init ok...\r\n"); } //存儲(chǔ)鍵值對(duì)(可用于存儲(chǔ)系統(tǒng)配置信息) b_log("save ip, name\r\n"); bKV_Set((uint8_t *)"ip", (uint8_t *)"192.168.1.155", sizeof("192.168.1.155")); bKV_Set((uint8_t *)"name", (uint8_t *)"BabyOS", sizeof("BabyOS")); //獲取值 b_log("read ip, name...\r\n"); bKV_Get((uint8_t *)"ip", buf); b_log("ip: %s\r\n", buf); bKV_Get((uint8_t *)"name", buf); b_log("name %s\r\n", buf); //修改鍵值對(duì)的值 b_log("change name...\r\n"); bKV_Set((uint8_t *)"name", (uint8_t *)"abcde", sizeof("abcde")); //重新獲取值 bKV_Get((uint8_t *)"name", buf); b_log("new name: %s\r\n", buf); //...... while(1) { //..... bExec(); //循環(huán)調(diào)用此函數(shù) //..... }}

        舉例使用W25QXX讀取數(shù)據(jù),從0地址讀取128個(gè)字節(jié)數(shù)據(jù)至buf:

        {    int fd = -1;    fd = bOpen(W25QXX, BCORE_FLAG_RW);    if(fd == -1)    {        return;    }    bLseek(fd, 0);    bRead(fd, buf, 128);    bClose(fd);}


        更多使用介紹,請(qǐng)參看:

        https://gitee.com/notrynohigh/BabyOS/wikis
        https://github.com/notrynohigh/BabyOS/wiki


        Baby如何成長

        之所以稱之為BabyOS,從上面的介紹可以看出,她如果能在項(xiàng)目中發(fā)揮大的作用就需要有足夠的功能模塊以及驅(qū)動(dòng)代碼。


        希望借助廣大網(wǎng)友的力量,一起“喂養(yǎng)”她,是她成為MCU裸機(jī)開發(fā)中不可缺少的一部分。


        碼云:

        https://gitee.com/notrynohigh/BabyOS

        github:
        https://github.com/notrynohigh/BabyOS


        友情項(xiàng)目

        BabyOS包含了第三方開源代碼,這部分代碼都是MCU項(xiàng)目中比較實(shí)用的。


        b_shell 功能模塊基于開源項(xiàng)目nr_micro_shell:

        https://gitee.com/nrush/nr_micro_shell

        (感謝作者Nrush)


        b_button 功能模塊基于開源項(xiàng)目FlexibleButton:

        https://github.com/murphyzhao/FlexibleButton

        (感謝作者M(jìn)urphy)

        版權(quán)聲明:本文來源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識(shí),版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請(qǐng)聯(lián)系我進(jìn)行刪除。

        ????????????????  END  ???????????????

        關(guān)注我的微信公眾號(hào),回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


        點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。

        瀏覽 92
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人精品| 久久色大香蕉 | 国产成人精品视频免费看 | 欧美激情国产在线 | 青青青在线 | 和女同学玩她真做进去了 | 欧美成人免费专区精品高清 | 久热久草 | 小舞揉搓难受3d动漫 | 麻豆 天美 蜜桃 91 |