入门简单、轻量好用的嵌入式开发开源项目
前言
从现实生活来看,使用嵌入式的产品比比皆是。譬如常使用的手机、平板电脑、智能家居、智能汽车、物联网以及航天航空设备等。可以说,嵌入式系统的市场前景是相当巨大的。 尤其是当前随着物联网上升为国家战略后,造芯片成为各类科技企业发展必修课之后,作为芯片的底层技术————嵌入式系统也渐渐从后台走到前台。
实际上,目前存在多种嵌入式系统的定义,但是从比较广泛且官方的说法来看:
嵌入式系统是什么?
“嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。”
纵观嵌入式系统的发展,至今已有30余年的历史,但是这项系统并不只是包括为了解决特定问题而设计的硬件系统,同时也有控制系统的软件。从而,这对于嵌入式系统的开发人员而言,增添了新的挑战。
首先对于嵌入式软件的开发而言,主要的挑战源自于嵌入式开发需要掌握底层「硬件」领域的知识,一旦硬件的更改将会对软件开发带来重大影响。
此外,对于嵌入式的开发者而言,搞嵌入式系统的入门门槛较高,毕竟拥有软硬结合的能力,远远比单纯掌握某种程序开发语言更为艰难。
虽然入门困难,但是目前越来越多的开发者主动将自己的嵌入式软件开发开源出来了,分享给更多需要学习嵌入式的开发者们,从自己玩到大家一块玩,既能让更多的人使用开发者的开源软件,了解学习并交流嵌入式开发,从自己玩到大家一块玩,同时还将软件的价值最大化。
今天,我们就给大家介绍几款入门简单、轻量好用的嵌入式开源软件开发,让大家共同学习、交流,一起丰富嵌入式开发的生态环境。
eventos-nano
开源许可证: MIT
项目作者: EventOS( EventOS 是一个 RTOS 项目)
项目地址: eventos-nano
项目地址: https://gitee.com/event-os/eventos-nano
推荐原因: 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 <stdio.h> // 标准输入输出库
/* 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);
}
}
klite
开源许可证: MIT
项目作者: jiangxiaogang
项目地址: https://gitee.com/kerndev/klite
项目简介: 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(); /* 启动系统 */
}
GuiLite
开源许可证: Apache-2.0
项目作者: idea4good
项目地址: https://gitee.com/idea4good/GuiLite
推荐原因: GuiLite 是一款能运行在“ Docker ”上的轻量嵌入式UI框架,仅 4 千行 C++ 代码, 0 依赖,单一头文件库( GuiLite.h ),单片机上也能流畅运行。
项目图层管理:
python-simple-http-server
开源许可证: MIT
项目作者: keijack
项目地址: https://gitee.com/keijack/python-simple-http-server
推荐原因: 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()
xboot
开源许可证: MIT
项目作者: xboot
项目地址: https://gitee.com/xboot/xboot
推荐原因: xboot 是一款功能强大、可移植性强、代码复用率高的嵌入式系统 bootloader ,只需编写一次,即可在任何地方运行。
项目演示:
nutzboot
开源许可证: Apache-2.0
项目作者: Nutz
项目地址: https://gitee.com/nutz/nutzboot
推荐原因: nutzboot 是一款开放的企业级微服务框架,提供自动配置,嵌入式web服务。
项目演示:
本文系作者 @Gitee 原创发布在 Gitee 官方博客。未经许可,禁止转载。