從現(xiàn)實(shí)生活來(lái)看,使用嵌入式的產(chǎn)品比比皆是。譬如常使用的手機(jī)、平板電腦、智能家居、智能汽車、物聯(lián)網(wǎng)以及航天航空設(shè)備等??梢哉f(shuō),嵌入式系統(tǒng)的市場(chǎng)前景是相當(dāng)巨大的。 尤其是當(dāng)前隨著物聯(lián)網(wǎng)上升為國(guó)家戰(zhàn)略后,造芯片成為各類科技企業(yè)發(fā)展必修課之后,作為芯片的底層技術(shù)————嵌入式系統(tǒng)也漸漸從后臺(tái)走到前臺(tái)。
實(shí)際上,目前存在多種嵌入式系統(tǒng)的定義,但是從比較廣泛且官方的說(shuō)法來(lái)看:
“嵌入式系統(tǒng)是以應(yīng)用為中心,以計(jì)算機(jī)技術(shù)為基礎(chǔ),并且軟硬件可裁剪,適用于應(yīng)用系統(tǒng)對(duì)功能、可靠性、成 本、體積、功耗有嚴(yán)格要求的專用計(jì)算機(jī)系統(tǒng)。”
縱觀嵌入式系統(tǒng)的發(fā)展,至今已有30余年的歷史,但是這項(xiàng)系統(tǒng)并不只是包括為了解決特定問(wèn)題而設(shè)計(jì)的硬件系統(tǒng),同時(shí)也有控制系統(tǒng)的軟件。從而,這對(duì)于嵌入式系統(tǒng)的開(kāi)發(fā)人員而言,增添了新的挑戰(zhàn)。
首先對(duì)于嵌入式軟件的開(kāi)發(fā)而言,主要的挑戰(zhàn)源自于嵌入式開(kāi)發(fā)需要掌握底層「硬件」領(lǐng)域的知識(shí),一旦硬件的更改將會(huì)對(duì)軟件開(kāi)發(fā)帶來(lái)重大影響。
此外,對(duì)于嵌入式的開(kāi)發(fā)者而言,搞嵌入式系統(tǒng)的入門門檻較高,畢竟擁有軟硬結(jié)合的能力,遠(yuǎn)遠(yuǎn)比單純掌握某種程序開(kāi)發(fā)語(yǔ)言更為艱難。
雖然入門困難,但是目前越來(lái)越多的開(kāi)發(fā)者主動(dòng)將自己的嵌入式軟件開(kāi)發(fā)開(kāi)源出來(lái)了,分享給更多需要學(xué)習(xí)嵌入式的開(kāi)發(fā)者們,從自己玩到大家一塊玩,既能讓更多的人使用開(kāi)發(fā)者的開(kāi)源軟件,了解學(xué)習(xí)并交流嵌入式開(kāi)發(fā),從自己玩到大家一塊玩,同時(shí)還將軟件的價(jià)值最大化。
今天,我們就給大家介紹幾款入門簡(jiǎn)單、輕量好用的嵌入式開(kāi)源軟件開(kāi)發(fā),讓大家共同學(xué)習(xí)、交流,一起豐富嵌入式開(kāi)發(fā)的生態(tài)環(huán)境。
01 eventos-nano
開(kāi)源許可證: MIT
項(xiàng)目作者: EventOS( EventOS 是一個(gè) RTOS 項(xiàng)目)
項(xiàng)目地址: eventos-nano
項(xiàng)目地址: https://gitee.com/event-os/eventos-nano
推薦原因: eventos-nano 是一個(gè)企業(yè)級(jí)的嵌入式開(kāi)發(fā)框架。之所以叫 Nano ,是因?yàn)樗娴姆浅]p量。最低占用 ROM 1.5KB,RAM 172 字節(jié)。核心技術(shù)是事件總線,支持 Reactor 和狀態(tài)機(jī)兩種模式,協(xié)作式內(nèi)核,極度可靠??缮疃炔眉簦浦卜奖?。
項(xiàng)目啟動(dòng)代碼: 除源碼外,只需要實(shí)現(xiàn)三個(gè)代碼,就可以使用EventOS Nano來(lái)編寫程序。
1. main.c main 函數(shù),初始化和啟動(dòng) EventOS Nano 。
/* include ------------------------------------------------------------------ */#include "eventos.h" // EventOS Nano頭文件#include "event_def.h" // 事件主題的枚舉#include "eos_led.h" // LED燈閃爍狀態(tài)機(jī)/* define ------------------------------------------------------------------- */static eos_u32_t eos_sub_table[Event_Max]; // 訂閱表數(shù)據(jù)空間static eos_u8_t eos_heap_memory[1024]; // 事件池空間/* main function ------------------------------------------------------------ */int main(void){ // EventOS Nano的初始化 eos_init(); // EventOS初始化 eos_sub_init(eos_sub_table); // 訂閱表初始化 eos_event_pool_init(eos_heap_memory, 1024); // 事件池初始化 // 狀態(tài)機(jī)模塊的初始化 eos_led_init(); // LED狀態(tài)機(jī)初始化 // 啟動(dòng)EventOS Nano。 eos_run(); // EventOS啟動(dòng)并運(yùn)行 return 0;}
2. eos_port.c 如 EventOS 在特定平臺(tái)上的接口實(shí)現(xiàn),也就是 EventOS Nano 移植的相關(guān)代碼。
可前往在《 UM-02-002 EventOS Nano 移植文檔》查看詳細(xì)說(shuō)明。
3. .ceos_led.c LED 的閃爍狀態(tài)機(jī)。LED燈閃爍,就是單片機(jī)界的 Hello World 。
/* include ------------------------------------------------------------------ */#include "eos_led.h" // 模塊頭文件#include "eventos.h" // EventOS頭文件#include "event_def.h" // 事件定義頭文件#include <stdio.h> // 標(biāo)準(zhǔn)輸入輸出庫(kù)/* data structure ----------------------------------------------------------- */typedef struct eos_led_tag { // LED類 eos_sm_t super; eos_bool_t status;} eos_led_t;static eos_led_t led; // led對(duì)象,單例模式/* static state function ---------------------------------------------------- */// 初始狀態(tài)static eos_ret_t state_init(eos_led_t * const me, eos_event_t const * const e);// Led的ON狀態(tài)static eos_ret_t state_on(eos_led_t * const me, eos_event_t const * const e);// Led的Off狀態(tài)static eos_ret_t state_off(eos_led_t * const me, eos_event_t const * const e);/* api ---------------------------------------------------- */void eos_led_init(void){ static eos_u32_t queue[32]; // 事件隊(duì)列 eos_sm_init(&led.super, 1, queue, 32); // 狀態(tài)機(jī)初始化 // 狀態(tài)機(jī)啟動(dòng),以state_init作為初始狀態(tài)。 eos_sm_start(&led.super, EOS_STATE_CAST(state_init)); led.status = 0;}/* static state function ---------------------------------------------------- */static eos_ret_t state_init(eos_led_t * const me, eos_event_t const * const e){ // 訂閱事件Event_Time_500ms EOS_EVENT_SUB(Event_Time_500ms); // 使事件Event_Time_500ms,每隔500ms就被發(fā)送一次。 eos_event_pub_period(Event_Time_500ms, 500); return EOS_TRAN(state_off);}static eos_ret_t state_on(eos_led_t * const me, eos_event_t const * const e){ switch (e->topic) { case Event_Enter: // 狀態(tài)state_on的進(jìn)入事件 printf("State On!n"); me->status = 1; return EOS_Ret_Handled; case Event_Time_500ms: // 收到Event_Time_500ms,跳轉(zhuǎn)到state_off return EOS_TRAN(state_off); default: return EOS_SUPER(eos_state_top); }}static eos_ret_t state_off(eos_led_t * const me, eos_event_t const * const e){ switch (e->topic) { case Event_Enter: // 狀態(tài)state_on的進(jìn)入事件 printf("State Off!n"); me->status = 0; return EOS_Ret_Handled; case Event_Time_500ms: // 收到Event_Time_500ms,跳轉(zhuǎn)到state_on return EOS_TRAN(state_on); default: return EOS_SUPER(eos_state_top); }}
02 Klite
開(kāi)源許可證: MIT
項(xiàng)目作者: jiangxiaogang
項(xiàng)目地址: https://gitee.com/kerndev/klite
項(xiàng)目簡(jiǎn)介: KLite 的定位是一款入門級(jí)的嵌入式實(shí)時(shí)操作系統(tǒng)內(nèi)核,以簡(jiǎn)潔易用為設(shè)計(jì)目標(biāo),旨在降低嵌入式 RTOS 的入門難度。
項(xiàng)目操作準(zhǔn)備:
//只需要包含這一個(gè)頭文件#include "kernel.h"//用于初始化應(yīng)用程序的線程void init(void *arg){ //在這里完成外設(shè)和驅(qū)動(dòng)初始化 //并創(chuàng)建更多線程實(shí)現(xiàn)不同的功能 //thread_create(...)}//空閑線程,只需調(diào)用 _idle即可void idle(void *arg){ kernel_idle();}//C語(yǔ)言程序入口void main(void){ static uint8_t heap[HEAP_SIZE]; /* 定義堆內(nèi)存 */ kernel_init(heap, sizeof(heap)); /* 系統(tǒng)初始化 */ thread_create(idle, 0, 0); /* 創(chuàng)建idle線程 */ thread_create(init, 0, 0); /* 創(chuàng)建init線程 */ kernel_start(); /* 啟動(dòng)系統(tǒng) */}
03 GuiLite
開(kāi)源許可證: Apache-2.0
項(xiàng)目作者: idea4good
項(xiàng)目地址: https://gitee.com/idea4good/GuiLite
推薦原因: GuiLite 是一款能運(yùn)行在“ Docker ”上的輕量嵌入式UI框架,僅 4 千行 C 代碼, 0 依賴,單一頭文件庫(kù)( GuiLite.h ),單片機(jī)上也能流暢運(yùn)行。
項(xiàng)目圖層管理:
04 python-simple-http-server
開(kāi)源許可證: MIT
項(xiàng)目作者: keijack
項(xiàng)目地址: https://gitee.com/keijack/python-simple-http-server
推薦原因: python-simple-http-server 是一個(gè)超輕量級(jí)的 HTTP Server,支持嵌入到 WSGI 標(biāo)準(zhǔn)中。
如何啟動(dòng)服務(wù)器:
import simple_http_server.server as server# 如果你的控制器代碼(處理請(qǐng)求的函數(shù))放在別的文件中,那么在你的 main.py 中,你必須將他都 import 進(jìn)來(lái)。import my_test_ctrldef main(*args): # 除了 import 外,還可以通過(guò) scan 方法批量加載 controller 文件。 server.scan("my_ctr_pkg", r".*controller.*") server.start()if __name__ == "__main__": main()
05 xboot
開(kāi)源許可證: MIT
項(xiàng)目作者: xboot
項(xiàng)目地址: https://gitee.com/xboot/xboot
推薦原因: xboot 是一款功能強(qiáng)大、可移植性強(qiáng)、代碼復(fù)用率高的嵌入式系統(tǒng) bootloader ,只需編寫一次,即可在任何地方運(yùn)行。
項(xiàng)目演示:
06 nutzboot
開(kāi)源許可證: Apache-2.0
項(xiàng)目作者: Nutz
項(xiàng)目地址: https://gitee.com/nutz/nutzboot
推薦原因: nutzboot 是一款開(kāi)放的企業(yè)級(jí)微服務(wù)框架,提供自動(dòng)配置,嵌入式web服務(wù)。
項(xiàng)目演示:
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。