适合单片机裸机的开源软件框架:Zorb

作者 |github - 54zorb          
很多时候,做单片机项目,会因为性能和内存资源的限制,没办法运行一些“大型”的通用框架,这个时候,一些轻量级的软件框架有显得尤为重要了。   这里就给大家分享一款一款适合单片机裸机的开源软件框架:zorb
zorb简介
zorb framework是一个基于面向对象的思想来搭建一个轻量级的嵌入式框架。
搭建zorb framework的目的是为在不能运行linux的芯片上快速开发应用,不用反复造轮子。
zorb framework的初步设计功能有:
1、时间系统功能zf_time
2、环形缓冲区功能zf_buffer
3、列表功能zf_list
4、状态机功能zf_fsm
5、事件功能zf_event
6、定时器功能zf_timer
7、任务功能zf_task
前6个功能,就可以实现纯事件驱动的程序,基本可以满足中小型嵌入式应用程序开发的需求。加上任务功能,是为了满足部分程序对实时性要求较高的需求。
当然,也可以将前6个功能裁剪出来,然后运行在现有的嵌入式系统上面,这样子也可以满足实时性的需求。
环境搭建
采用stm32f429开发板作为硬件运行环境,硬件资源用到串口1和systick,其中串口1提供调试打印功能,systick提供系统时间计数功能。
关于硬件环境的搭建不多说,可以参照开发板提供的例程来搭建,板级初始化完成了调试串口和systick的初始化。
/****************************************************************************** * 描述  :硬件环境初始化 * 参数  :无 * 返回  :无******************************************************************************/void bsp_init(void){    /* 嵌套向量中断控制器组选择 */    nvic_prioritygroupconfig(nvic_prioritygroup_2);    /* 初始化调试串口 */    debug_usart_init();    /* systick初始化 */    systemtick_init();}/****************************************************************************** * 描述  :硬件底层程序 * 参数  :无 * 返回  :无******************************************************************************/void bsp_process(void){} 调试
开发一个程序,最开始也最重要的是搭建调试的环境,我们采用串口1作为调试输出(printf映射),然后调试信息分为三个等级,后续上位机可以根据不同等级进行高亮提示:
/**  *****************************************************************************  * @file    zf_debug.h  * @author  zorb  * @version v1.0.0  * @date    2018-06-28  * @brief   调试输出的头文件  *****************************************************************************  * @history  *  * 1. date:2018-06-28  *    author:zorb  *    modification:建立文件  *  *****************************************************************************  */#ifndef __zf_debug_h__#define __zf_debug_h__#ifdef __cplusplusextern c {#endif#include stdio.h#include stdbool.h#define log_d 0; /* 信息等级:正常 */#define log_w 1; /* 信息等级:告警 */#define log_e 2; /* 信息等级:错误 */#define _zf_debug             /* 定义调试功能 */#define zf_debug_on true      /* 启用调试功能 */#ifdef _zf_debug    #if zf_debug_on        #define zf_debug(rank, x...) do             {                                               char code[10] = [rank=0];                 code[6] = '0' + (char)rank;                 if (code[6] != '0')                         {                                               printf(%s, code);                     }                                           printf(x);                              } while(0)    #else        #define zf_debug(rank, x...)    #endif /* zf_debug_on */#endif /* _zf_debug */#ifdef __cplusplus}#endif#endif /* __zf_debug_h__ *//******************************** end of file ********************************/ 断言
在开发过程中,在关键地方进行一些断言,可以方便定位bug。
/**  *****************************************************************************  * @file    zf_assert.h  * @author  zorb  * @version v1.0.0  * @date    2018-06-28  * @brief   断言的头文件  *****************************************************************************  * @history  *  * 1. date:2018-06-28  *    author:zorb  *    modification:建立文件  *  *****************************************************************************  */#ifndef __zf_assert_h__#define __zf_assert_h__#ifdef __cplusplusextern c {#endif#include stdint.h#define _zf_assert              /* 定义断言功能 */#define zf_assert_on true       /* 启用断言功能 */#ifdef _zf_assert    #if zf_assert_on         #define zf_assert(expression_) ((expression_) ?            (void)0 : zf_asserthandle((uint8_t *)__file__, (int)__line__));    #else         #define zf_assert(expression_)    #endif /* zf_assert_on */#endif /* _zf_assert *//* 断言产生时的处理 */void zf_asserthandle(uint8_t *pfilename, int line);#ifdef __cplusplus}#endif#endif /* __zf_assert_h__ *//******************************** end of file ********************************/ 断言的处理很简单,就是告诉我们在哪个文件哪一行出错就可以,实现如下
/**  *****************************************************************************  * @file    zf_assert.c  * @author  zorb  * @version v1.0.0  * @date    2018-06-28  * @brief   断言的实现  *****************************************************************************  * @history  *  * 1. date:2018-06-28  *    author:zorb  *    modification:建立文件  *  *****************************************************************************  */#include zf_assert.h#include zf_debug.h/****************************************************************************** * 描述  :断言产生时的处理 * 参数  :(in)-pfilename 文件名 *         (in)-line 行数 * 返回  :无******************************************************************************/void zf_asserthandle(uint8_t *pfilename, int line){    zf_debug(log_e, file:%s line:%d:asserted, pfilename, line);    while (1);}/******************************** end of file ********************************/ 调度时间
为了减少框架对资源的消耗,所以初步设定框架的最小时间周期为1ms,因此我们需要设置systick的定时周期为1ms,然后每次进入中断为我们的框架计数即可。
/****************************************************************************** * 描述  :systick中断服务程序 * 参数  :无 * 返回  :无******************************************************************************/void systick_handler(void){    /* 为zorb framework提供计时 */    zf_timetick();} 现在时间系统提供的功能比较基础,只有系统滴答计数和系统死等待延时,后面我们开发定时器功能和任务功能的时候会重新扩展时间系统。
/**  *****************************************************************************  * @file    zf_time.h  * @author  zorb  * @version v1.0.0  * @date    2018-06-28  * @brief   系统时间的头文件  *****************************************************************************  * @history  *  * 1. date:2018-06-28  *    author:zorb  *    modification:建立文件  *  *****************************************************************************  */#ifndef __zf_time_h__#define __zf_time_h__#ifdef __cplusplusextern c {#endif#include stdbool.h#include stdint.h/* 系统滴答周期(ms) */#define zf_tick_period 1/* 获取系统滴答数 */#define zf_systick() zf_getsystemtick()/* 获取系统时间(ms) */#define zf_systime_ms() zf_getsystemtimems()/* 系统延时(ms) */#define zf_delay_ms(ms_) do                            {                                                          if (ms_ % zf_tick_period)                              {                                                          zf_delaytick((ms_ / zf_tick_period) + 1);          }                                                      else                                                   {                                                          zf_delaytick(ms_ / zf_tick_period);                }                                                  } while(0)/* 获取系统滴答数 */uint32_t zf_getsystemtick(void);/* 获取系统时间(ms) */uint32_t zf_getsystemtimems(void);/* 系统延时 */void zf_delaytick(uint32_t tick);/* 系统滴答程序(需挂在硬件的时间中断里边) */void zf_timetick (void);#ifdef __cplusplus}#endif#endif /* __zf_time_h__ *//******************************** end of file ********************************/ 最后
本篇实现的功能比较基础,但是整个框架开发的根基,后面所有扩展的功能都需要在此环境下进行开发。
搭建良好的调试输出环境,可以帮我们快速定位bug的所在,从而提高开发效率。


近日,百度公布在北京开展自动驾驶测试里程已超过600万公里
专用MCU渐成热点,芯海科技持续发力信号链MCU
物联网是如何在道路运输行业中发挥作用的
“深圳人工智能应用创新服务中心”正式启动
北京博能股份有限公司宣布完成2000万元新一轮股权融资
适合单片机裸机的开源软件框架:Zorb
半导体荧光灯原理简介
音视频物联网:智能分析摄像头助力污水乱排乱放
小创意:散发迷人气味的节能灯
华为Mate20系列共销售1600万台 P30系列半年超过1700万台
[组图]频率稳定的调频信号传输电路
在微软云机器学习平台Azure ML上利用OpenVINO快速实现AI推理
老司机带你深入理解ST库中的 assert_param 语句
汽车以太网互联技术详解
存在了二十多年的IE浏览器将告别 微软将停止Office对IE浏览器支持
【节能学院】安科瑞农田灌溉收费管理平台
OC48卡的布局以及OC48卡的数字布线
应用案例 | 海伯森3D线光谱共焦传感器检测声学组件上的线圈高度
服务机器人迎来发展新时期,在未来将会扮演一个什么样的角色呢?
智能新风系统是如何工作的?