[经验分享] 开源软件框架:Zorb

[复制链接]
lzbf 发表于 2025-8-23 16:12 | 显示全部楼层 |阅读模式
很多时候,做单片机项目,会因为性能和内存资源的限制,没办法运行一些“大型”的通用框架,这个时候,一些轻量级的软件框架有显得尤为重要了。   这里就给大家分享一款一款适合单片机裸机的开源软件框架:Zorb

1、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个功能裁剪出来,然后运行在现有的嵌入式系统上面,这样子也可以满足实时性的需求。

2、环境搭建   

采用STM32F429开发板作为硬件运行环境,硬件资源用到串口1和systick,其中串口1提供调试打印功能,systick提供系统时间计数功能。

关于硬件环境的搭建不多说,可以参照开发板提供的例程来搭建,板级初始化完成了调试串口和systick的初始化。

  1. /******************************************************************************
  2. * 描述  :硬件环境初始化
  3. * 参数  :无
  4. * 返回  :无
  5. ******************************************************************************/
  6. void BSP_init(void)
  7. {
  8.     /* 嵌套向量中断控制器组选择 */
  9.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  10.     /* 初始化调试串口 */
  11.     Debug_USART_init();

  12.     /* Systick初始化 */
  13.     SystemTick_init();
  14. }

  15. /******************************************************************************
  16. * 描述  :硬件底层程序
  17. * 参数  :无
  18. * 返回  :无
  19. ******************************************************************************/
  20. void BSP_process(void)
  21. {

  22. }

3、调试   

开发一个程序,最开始也最重要的是搭建调试的环境,我们采用串口1作为调试输出(printf映射),然后调试信息分为三个等级,后续上位机可以根据不同等级进行高亮提示:

  1. /**
  2.   *****************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]    zf_debug.h
  4.   * [url=home.php?mod=space&uid=187600]@author[/url]  Zorb
  5.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.0.0
  6.   * [url=home.php?mod=space&uid=212281]@date[/url]    2018-06-28
  7.   * [url=home.php?mod=space&uid=247401]@brief[/url]   调试输出的头文件
  8.   *****************************************************************************
  9.   * @history
  10.   *
  11.   * 1. Date:2018-06-28
  12.   *    Author:Zorb
  13.   *    Modification:建立文件
  14.   *
  15.   *****************************************************************************
  16.   */

  17. #ifndef __ZF_DEBUG_H__
  18. #define __ZF_DEBUG_H__

  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif

  22. #include "stdio.h"
  23. #include "stdbool.h"

  24. #define LOG_D 0; /* 信息等级:正常 */
  25. #define LOG_W 1; /* 信息等级:告警 */
  26. #define LOG_E 2; /* 信息等级:错误 */

  27. #define _ZF_DEBUG             /* 定义调试功能 */
  28. #define ZF_DEBUG_ON true      /* 启用调试功能 */

  29. #ifdef _ZF_DEBUG
  30.     #if ZF_DEBUG_ON
  31.         #define ZF_DEBUG(rank, x...) do     
  32.         {                                   
  33.             char code[10] = "[rank=0]";     
  34.             code[6] = '0' + (char)rank;     
  35.             if (code[6] != '0')            
  36.             {                              
  37.                 printf("%s", code);         
  38.             }                              
  39.             printf(x);                     
  40.         } while(0)
  41.     #else
  42.         #define ZF_DEBUG(rank, x...)
  43.     #endif /* ZF_DEBUG_ON */
  44. #endif /* _ZF_DEBUG */

  45. #ifdef __cplusplus
  46. }
  47. #endif

  48. #endif /* __ZF_DEBUG_H__ */

  49. /******************************** END OF FILE ********************************/

4、断 言   

在开发过程中,在关键地方进行一些断言,可以方便定位bug。

  1. /**
  2.   *****************************************************************************
  3.   * @file    zf_assert.h
  4.   * @author  Zorb
  5.   * @version V1.0.0
  6.   * @date    2018-06-28
  7.   * @brief   断言的头文件
  8.   *****************************************************************************
  9.   * @history
  10.   *
  11.   * 1. Date:2018-06-28
  12.   *    Author:Zorb
  13.   *    Modification:建立文件
  14.   *
  15.   *****************************************************************************
  16.   */

  17. #ifndef __ZF_ASSERT_H__
  18. #define __ZF_ASSERT_H__

  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif

  22. #include "stdint.h"

  23. #define _ZF_ASSERT              /* 定义断言功能 */
  24. #define ZF_ASSERT_ON true       /* 启用断言功能 */

  25. #ifdef _ZF_ASSERT
  26.     #if ZF_ASSERT_ON
  27.          #define ZF_ASSERT(expression_) ((expression_) ?
  28.             (void)0 : ZF_assertHandle((uint8_t *)__FILE__, (int)__LINE__));
  29.     #else
  30.          #define ZF_ASSERT(expression_)
  31.     #endif /* ZF_ASSERT_ON */
  32. #endif /* _ZF_ASSERT */

  33. /* 断言产生时的处理 */
  34. void ZF_assertHandle(uint8_t *pFileName, int line);

  35. #ifdef __cplusplus
  36. }
  37. #endif

  38. #endif /* __ZF_ASSERT_H__ */

  39. /******************************** END OF FILE ********************************/

断言的处理很简单,就是告诉我们在哪个文件哪一行出错就可以,实现如下

  1. /**
  2.   *****************************************************************************
  3.   * @file    zf_assert.c
  4.   * @author  Zorb
  5.   * @version V1.0.0
  6.   * @date    2018-06-28
  7.   * @brief   断言的实现
  8.   *****************************************************************************
  9.   * @history
  10.   *
  11.   * 1. Date:2018-06-28
  12.   *    Author:Zorb
  13.   *    Modification:建立文件
  14.   *
  15.   *****************************************************************************
  16.   */

  17. #include "zf_assert.h"
  18. #include "zf_debug.h"

  19. /******************************************************************************
  20. * 描述  :断言产生时的处理
  21. * 参数  :(in)-pFileName 文件名
  22. *         (in)-line 行数
  23. * 返回  :无
  24. ******************************************************************************/
  25. void ZF_assertHandle(uint8_t *pFileName, int line)
  26. {
  27.     ZF_DEBUG(LOG_E, "file:%s line:%d:asserted
  28. ", pFileName, line);

  29.     while (1);
  30. }

  31. /******************************** END OF FILE ********************************/

5、调度时间   

为了减少框架对资源的消耗,所以初步设定框架的最小时间周期为1ms,因此我们需要设置systick的定时周期为1ms,然后每次进入中断为我们的框架计数即可。

  1. /******************************************************************************
  2. * 描述  :SysTick中断服务程序
  3. * 参数  :无
  4. * 返回  :无
  5. ******************************************************************************/
  6. void SysTick_Handler(void)
  7. {
  8.     /* 为zorb framework提供计时 */
  9.     ZF_timeTick();
  10. }

现在时间系统提供的功能比较基础,只有系统滴答计数和系统死等待延时,后面我们开发定时器功能和任务功能的时候会重新扩展时间系统。

  1. /**
  2.   *****************************************************************************
  3.   * @file    zf_time.h
  4.   * @author  Zorb
  5.   * @version V1.0.0
  6.   * @date    2018-06-28
  7.   * @brief   系统时间的头文件
  8.   *****************************************************************************
  9.   * @history
  10.   *
  11.   * 1. Date:2018-06-28
  12.   *    Author:Zorb
  13.   *    Modification:建立文件
  14.   *
  15.   *****************************************************************************
  16.   */

  17. #ifndef __ZF_TIME_H__
  18. #define __ZF_TIME_H__

  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif

  22. #include "stdbool.h"
  23. #include "stdint.h"

  24. /* 系统滴答周期(ms) */
  25. #define ZF_TICK_PERIOD 1

  26. /* 获取系统滴答数 */
  27. #define ZF_SYSTICK() ZF_getSystemTick()

  28. /* 获取系统时间(ms) */
  29. #define ZF_SYSTIME_MS() ZF_getSystemTimeMS()

  30. /* 系统延时(ms) */
  31. #define ZF_DELAY_MS(ms_) do                           
  32. {                                                      
  33.     if (ms_ % ZF_TICK_PERIOD)                          
  34.     {                                                  
  35.         ZF_delayTick((ms_ / ZF_TICK_PERIOD) + 1);      
  36.     }                                                  
  37.     else                                               
  38.     {                                                  
  39.         ZF_delayTick(ms_ / ZF_TICK_PERIOD);            
  40.     }                                                  
  41. } while(0)

  42. /* 获取系统滴答数 */
  43. uint32_t ZF_getSystemTick(void);

  44. /* 获取系统时间(ms) */
  45. uint32_t ZF_getSystemTimeMS(void);

  46. /* 系统延时 */
  47. void ZF_delayTick(uint32_t tick);

  48. /* 系统滴答程序(需挂在硬件的时间中断里边) */
  49. void ZF_timeTick (void);

  50. #ifdef __cplusplus
  51. }
  52. #endif

  53. #endif /* __ZF_TIME_H__ */

  54. /******************************** END OF FILE ********************************/


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

5576

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部