不看不知道,原來嵌入式開發大神們都這麼會玩
從現實生活來看,使用嵌入式的產品比比皆是。譬如常使用的手機、平板電腦、智能家居、智能汽車、物聯網以及航天航空設備等。可以說,嵌入式系統的市場前景是相當巨大的。尤其是當前隨著物聯網上升為國家戰略後,造晶片成為各類科技企業發展必修課之後,作為晶片的底層技術————嵌入式系統也漸漸從後台走到前台。
實際上,目前存在多種嵌入式系統的定義,但是從比較廣泛且官方的說法來看:
「嵌入式系統是以應用為中心,以計算機技術為基礎,並且軟硬體可裁剪,適用於應用系統對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統。」
///插播一條:我自己在今年年初錄製了一套還比較系統的入門單片機教程,想要的同學找我拿就行了免費的,私信我就可以哦~點我頭像黑色字體加我地球呺也能領取哦。最近比較閒,帶做畢設,帶學生參加省級或以上比賽///
正文開始:
縱觀嵌入式系統的發展,至今已有30餘年的歷史,但是這項系統並不只是包括為了解決特定問題而設計的硬體系統,同時也有控制系統的軟體。從而,這對於嵌入式系統的開發人員而言,增添了新的挑戰。
首先對於嵌入式軟體的開發而言,主要的挑戰源自於嵌入式開發需要掌握底層「硬體」領域的知識,一旦硬體的更改將會對軟體開發帶來重大影響。
此外,對於嵌入式的開發者而言,搞嵌入式系統的入門門檻較高,畢竟擁有軟硬結合的能力,遠遠比單純掌握某種程序開發語言更為艱難。
雖然入門困難,但是目前越來越多的開發者主動將自己的嵌入式軟體開發開源出來了,分享給更多需要學習嵌入式的開發者們,從自己玩到大家一塊玩,既能讓更多的人使用開發者的開源軟體,了解學習並交流嵌入式開發,從自己玩到大家一塊玩,同時還將軟體的價值最大化。
今天,我們就給大家介紹幾款入門簡單、輕量好用的嵌入式開源軟體開發,讓大家共同學習、交流,一起豐富嵌入式開發的生態環境。
01eventos-nano
開源許可證: MIT
推薦原因: eventos-nano是一個企業級的嵌入式開發框架。之所以叫 Nano,是因為它真的非常輕量。最低占用 ROM 1.5KB,RAM 172位元組。核心技術是事件總線,支持 Reactor和狀態機兩種模式,協作式內核,極度可靠。可深度裁剪,移植方便。
項目啟動代碼:除源碼外,只需要實現三個代碼,就可以使用EventOS Nano來編寫程序。
1. main.c main函數,初始化和啟動 EventOS Nano。
/* include ------------------------------------------------------------------ */
#include "eventos.h" // EventOS Nano頭文件
#include "event_def.h" //事件主題的枚舉
#include "eos_led.h" // LED燈閃爍狀態機
/* define ------------------------------------------------------------------- */
static eos_u32_t eos_sub_table[Event_Max]; //訂閱表數據空間
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); //事件池初始化
//狀態機模塊的初始化
eos_led_init(); // LED狀態機初始化
//啟動EventOS Nano。
eos_run(); // EventOS啟動並運行
return 0;
}
2. eos_port.c如 EventOS在特定平台上的接口實現,也就是 EventOS Nano移植的相關代碼。
可前往在《 UM-02-002 EventOS Nano移植文檔》查看詳細說明。
3. .ceos_led.c LED的閃爍狀態機。LED燈閃爍,就是單片機界的 Hello World。
/* include ------------------------------------------------------------------ */
#include "eos_led.h" //模塊頭文件
#include "eventos.h" // EventOS頭文件
#include "event_def.h" //事件定義頭文件
#include //標準輸入輸出庫
/* 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對象,單例模式
/* static state function ---------------------------------------------------- */
//初始狀態
static eos_ret_t state_init(eos_led_t * const me, eos_event_t const * const e);
// Led的ON狀態
static eos_ret_t state_on(eos_led_t * const me, eos_event_t const * const e);
// Led的Off狀態
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]; //事件隊列
eos_sm_init(&led.super, 1, queue, 32); //狀態機初始化
//狀態機啟動,以state_init作為初始狀態。
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就被發送一次。
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: //狀態state_on的進入事件
printf("State On!\n");
me->status = 1;
return EOS_Ret_Handled;
case Event_Time_500ms: //收到Event_Time_500ms,跳轉到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: //狀態state_on的進入事件
printf("State Off!\n");
me->status = 0;
return EOS_Ret_Handled;
case Event_Time_500ms: //收到Event_Time_500ms,跳轉到state_on
return EOS_TRAN(state_on);
default:
return EOS_SUPER(eos_state_top);
}
}
02klite
開源許可證: MIT
項目簡介: KLite的定位是一款入門級的嵌入式實時作業系統內核,以簡潔易用為設計目標,旨在降低嵌入式 RTOS的入門難度。
項目操作準備:
//只需要包含這一個頭文件
#include "kernel.h"
//用於初始化應用程式的線程
void init(void *arg)
{
//在這裡完成外設和驅動初始化
//並創建更多線程實現不同的功能
//thread_create(...)
}
//空閒線程,只需調用kernel_idle即可
void idle(void *arg)
{
kernel_idle();
}
//C語言程序入口
void main(void)
{
static uint8_t heap[HEAP_SIZE]; /*定義堆內存 */
kernel_init(heap, sizeof(heap)); /*系統初始化 */
thread_create(idle, 0, 0); /*創建idle線程 */
thread_create(init, 0, 0); /*創建init線程 */
kernel_start(); /*啟動系統 */
}
03GuiLite
開源許可證: Apache-2.0
推薦原因: GuiLite是一款能運行在「 Docker」上的輕量嵌入式UI框架,僅 4千行 C++代碼, 0依賴,單一頭文件庫( GuiLite.h),單片機上也能流暢運行。
項目圖層管理:
04python-simple-http-server
開源許可證: MIT
推薦原因: python-simple-http-server是一個超輕量級的 HTTP Server,支持嵌入到 WSGI標準中。
如何啟動伺服器:
import simple_http_server.server as server
#如果你的控制器代碼(處理請求的函數)放在別的文件中,那麼在你的 main.py中,你必須將他都 import進來。
import my_test_ctrl
def main(*args):
#除了 import外,還可以通過 scan方法批量加載 controller文件。
server.scan("my_ctr_pkg", r".*controller.*")
server.start()
if __name__ == "__main__":
main()
05xboot
開源許可證: MIT
推薦原因: xboot是一款功能強大、可移植性強、代碼復用率高的嵌入式系統 bootloader,只需編寫一次,即可在任何地方運行。
項目演示:
06nutzboot
開源許可證: Apache-2.0
推薦原因: nutzboot是一款開放的企業級微服務框架,提供自動配置,嵌入式web服務。
項目演示: