一、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的初始化。
/****************************************************************************** *描述:硬件環境初始化 *參數:無 *返回:無 ******************************************************************************/ voidBSP_init(void) { /*嵌套向量中斷控制器組選擇*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*初始化調試串口*/ Debug_USART_init(); /*Systick初始化*/ SystemTick_init(); } /****************************************************************************** *描述:硬件底層程序 *參數:無 *返回:無 ******************************************************************************/ voidBSP_process(void) { }
三、調試輸出
開發一個程序,最開始也最重要的是搭建調試的環境,我們采用串口1作為調試輸出(printf映射),然后調試信息分為三個等級,后續上位機可以根據不同等級進行高亮提示:
/** ***************************************************************************** *@filezf_debug.h *@authorZorb *@versionV1.0.0 *@date2018-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" #defineLOG_D0;/*信息等級:正常*/ #defineLOG_W1;/*信息等級:告警*/ #defineLOG_E2;/*信息等級:錯誤*/ #define_ZF_DEBUG/*定義調試功能*/ #defineZF_DEBUG_ONtrue/*啟用調試功能*/ #ifdef_ZF_DEBUG #ifZF_DEBUG_ON #defineZF_DEBUG(rank,x...)do { charcode[10]="[rank=0]"; code[6]='0'+(char)rank; if(code[6]!='0') { printf("%s",code); } printf(x); }while(0) #else #defineZF_DEBUG(rank,x...) #endif/*ZF_DEBUG_ON*/ #endif/*_ZF_DEBUG*/ #ifdef__cplusplus } #endif #endif/*__ZF_DEBUG_H__*/ /********************************ENDOFFILE********************************/
四、實現斷言
在開發過程中,在關鍵地方進行一些斷言,可以方便定位bug。
/** ***************************************************************************** *@filezf_assert.h *@authorZorb *@versionV1.0.0 *@date2018-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/*定義斷言功能*/ #defineZF_ASSERT_ONtrue/*啟用斷言功能*/ #ifdef_ZF_ASSERT #ifZF_ASSERT_ON #defineZF_ASSERT(expression_)((expression_)? (void)0:ZF_assertHandle((uint8_t*)__FILE__,(int)__LINE__)); #else #defineZF_ASSERT(expression_) #endif/*ZF_ASSERT_ON*/ #endif/*_ZF_ASSERT*/ /*斷言產生時的處理*/ voidZF_assertHandle(uint8_t*pFileName,intline); #ifdef__cplusplus } #endif #endif/*__ZF_ASSERT_H__*/ /********************************ENDOFFILE********************************/
斷言的處理很簡單,就是告訴我們在哪個文件哪一行出錯就可以,實現如下
/** ***************************************************************************** *@filezf_assert.c *@authorZorb *@versionV1.0.0 *@date2018-06-28 *@brief斷言的實現 ***************************************************************************** *@history * *1.Date:2018-06-28 *Author:Zorb *Modification:建立文件 * ***************************************************************************** */ #include"zf_assert.h" #include"zf_debug.h" /****************************************************************************** *描述:斷言產生時的處理 *參數:(in)-pFileName 文件名 *(in)-line行數 *返回:無 ******************************************************************************/ voidZF_assertHandle(uint8_t*pFileName,intline) { ZF_DEBUG(LOG_E,"file:%sline:%d:asserted ",pFileName,line); while(1); } /********************************ENDOFFILE********************************/
五、建立時間系統
為了減少框架對資源的消耗,所以初步設定框架的最小時間周期為1ms,因此我們需要設置systick的定時周期為1ms,然后每次進入中斷為我們的框架計數即可。
/****************************************************************************** *描述:SysTick中斷服務程序 *參數:無 *返回:無 ******************************************************************************/ voidSysTick_Handler(void) { /*為zorbframework提供計時*/ ZF_timeTick(); }
現在時間系統提供的功能比較基礎,只有系統滴答計數和系統死等待延時,后面我們開發定時器功能和任務功能的時候會重新擴展時間系統。
/** ***************************************************************************** *@filezf_time.h *@authorZorb *@versionV1.0.0 *@date2018-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)*/ #defineZF_TICK_PERIOD1 /*獲取系統滴答數*/ #defineZF_SYSTICK()ZF_getSystemTick() /*獲取系統時間(ms)*/ #defineZF_SYSTIME_MS()ZF_getSystemTimeMS() /*系統延時(ms)*/ #defineZF_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_tZF_getSystemTick(void); /*獲取系統時間(ms)*/ uint32_tZF_getSystemTimeMS(void); /*系統延時*/ voidZF_delayTick(uint32_ttick); /*系統滴答程序(需掛在硬件的時間中斷里邊)*/ voidZF_timeTick(void); #ifdef__cplusplus } #endif #endif/*__ZF_TIME_H__*/ /********************************ENDOFFILE********************************/
六、最后
本篇實現的功能比較基礎,但是整個框架開發的根基,后面所有擴展的功能都需要在此環境下進行開發。搭建良好的調試輸出環境,可以幫我們快速定位bug的所在,從而提高開發效率。
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5045文章
18817瀏覽量
298486 -
定時器
+關注
關注
23文章
3218瀏覽量
113676 -
串口
+關注
關注
14文章
1533瀏覽量
75455 -
開發板
+關注
關注
25文章
4771瀏覽量
96162 -
環境搭建
+關注
關注
0文章
53瀏覽量
9027
原文標題:【嵌入式框架】搭建調試輸出、建立時間系統
文章出處:【微信號:工程師進階筆記,微信公眾號:工程師進階筆記】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論