分享一個(gè)適用于MCU項(xiàng)目的代碼框架
來源: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.使用范例
//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.hif(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)參看:
Baby如何成長
之所以稱之為BabyOS,從上面的介紹可以看出,她如果能在項(xiàng)目中發(fā)揮大的作用就需要有足夠的功能模塊以及驅(qū)動(dòng)代碼。
希望借助廣大網(wǎng)友的力量,一起“喂養(yǎng)”她,是她成為MCU裸機(jī)開發(fā)中不可缺少的一部分。
碼云:
友情項(xiàng)目
BabyOS包含了第三方開源代碼,這部分代碼都是MCU項(xiàng)目中比較實(shí)用的。
b_shell 功能模塊基于開源項(xiàng)目nr_micro_shell:
(感謝作者Nrush)
b_button 功能模塊基于開源項(xiàng)目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)贊、在看。
