作者 |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?__cplusplus extern?"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?__cplusplus
extern?"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?__cplusplus
extern?"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的所在,從而提高開發效率。
審核編輯:黃飛
?
電子發燒友App

















評論