一、Zorb簡介
Zorb Framework是一個基于面向?qū)ο蟮乃枷雭泶罱ㄒ粋€輕量級的嵌入式框架。
搭建Zorb Framework的目的是為在不能運行Linux的芯片上快速開發(fā)應(yīng)用,不用反復(fù)造輪子。
Zorb Framework的初步設(shè)計功能有:
1、時間系統(tǒng)功能zf_time
2、環(huán)形緩沖區(qū)功能zf_buffer
3、列表功能zf_list
4、狀態(tài)機功能zf_fsm
5、事件功能zf_event
6、定時器功能zf_timer
7、任務(wù)功能zf_task
前6個功能,就可以實現(xiàn)純事件驅(qū)動的程序,基本可以滿足中小型嵌入式應(yīng)用程序開發(fā)的需求。加上任務(wù)功能,是為了滿足部分程序?qū)崟r性要求較高的需求。當(dāng)然,也可以將前6個功能裁剪出來,然后運行在現(xiàn)有的嵌入式系統(tǒng)上面,這樣子也可以滿足實時性的需求。
二、嵌入式環(huán)境搭建
采用STM32F429開發(fā)板作為硬件運行環(huán)境,硬件資源用到串口1和systick,其中串口1提供調(diào)試打印功能,systick提供系統(tǒng)時間計數(shù)功能。
關(guān)于硬件環(huán)境的搭建不多說,可以參照開發(fā)板提供的例程來搭建,板級初始化完成了調(diào)試串口和systick的初始化。
/****************************************************************************** *描述:硬件環(huán)境初始化 *參數(shù):無 *返回:無 ******************************************************************************/ voidBSP_init(void) { /*嵌套向量中斷控制器組選擇*/ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /*初始化調(diào)試串口*/ Debug_USART_init(); /*Systick初始化*/ SystemTick_init(); } /****************************************************************************** *描述:硬件底層程序 *參數(shù):無 *返回:無 ******************************************************************************/ voidBSP_process(void) { }
三、調(diào)試輸出
開發(fā)一個程序,最開始也最重要的是搭建調(diào)試的環(huán)境,我們采用串口1作為調(diào)試輸出(printf映射),然后調(diào)試信息分為三個等級,后續(xù)上位機可以根據(jù)不同等級進行高亮提示:
/** ***************************************************************************** *@filezf_debug.h *@authorZorb *@versionV1.0.0 *@date2018-06-28 *@brief調(diào)試輸出的頭文件 ***************************************************************************** *@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/*定義調(diào)試功能*/ #defineZF_DEBUG_ONtrue/*啟用調(diào)試功能*/ #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********************************/
四、實現(xiàn)斷言
在開發(fā)過程中,在關(guān)鍵地方進行一些斷言,可以方便定位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*/ /*斷言產(chǎn)生時的處理*/ voidZF_assertHandle(uint8_t*pFileName,intline); #ifdef__cplusplus } #endif #endif/*__ZF_ASSERT_H__*/ /********************************ENDOFFILE********************************/
斷言的處理很簡單,就是告訴我們在哪個文件哪一行出錯就可以,實現(xiàn)如下
/** ***************************************************************************** *@filezf_assert.c *@authorZorb *@versionV1.0.0 *@date2018-06-28 *@brief斷言的實現(xiàn) ***************************************************************************** *@history * *1.Date:2018-06-28 *Author:Zorb *Modification:建立文件 * ***************************************************************************** */ #include"zf_assert.h" #include"zf_debug.h" /****************************************************************************** *描述:斷言產(chǎn)生時的處理 *參數(shù):(in)-pFileName 文件名 *(in)-line行數(shù) *返回:無 ******************************************************************************/ voidZF_assertHandle(uint8_t*pFileName,intline) { ZF_DEBUG(LOG_E,"file:%sline:%d:asserted ",pFileName,line); while(1); } /********************************ENDOFFILE********************************/
五、建立時間系統(tǒng)
為了減少框架對資源的消耗,所以初步設(shè)定框架的最小時間周期為1ms,因此我們需要設(shè)置systick的定時周期為1ms,然后每次進入中斷為我們的框架計數(shù)即可。
/****************************************************************************** *描述:SysTick中斷服務(wù)程序 *參數(shù):無 *返回:無 ******************************************************************************/ voidSysTick_Handler(void) { /*為zorbframework提供計時*/ ZF_timeTick(); }
現(xiàn)在時間系統(tǒng)提供的功能比較基礎(chǔ),只有系統(tǒng)滴答計數(shù)和系統(tǒng)死等待延時,后面我們開發(fā)定時器功能和任務(wù)功能的時候會重新擴展時間系統(tǒng)。
/** ***************************************************************************** *@filezf_time.h *@authorZorb *@versionV1.0.0 *@date2018-06-28 *@brief系統(tǒng)時間的頭文件 ***************************************************************************** *@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" /*系統(tǒng)滴答周期(ms)*/ #defineZF_TICK_PERIOD1 /*獲取系統(tǒng)滴答數(shù)*/ #defineZF_SYSTICK()ZF_getSystemTick() /*獲取系統(tǒng)時間(ms)*/ #defineZF_SYSTIME_MS()ZF_getSystemTimeMS() /*系統(tǒng)延時(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) /*獲取系統(tǒng)滴答數(shù)*/ uint32_tZF_getSystemTick(void); /*獲取系統(tǒng)時間(ms)*/ uint32_tZF_getSystemTimeMS(void); /*系統(tǒng)延時*/ voidZF_delayTick(uint32_ttick); /*系統(tǒng)滴答程序(需掛在硬件的時間中斷里邊)*/ voidZF_timeTick(void); #ifdef__cplusplus } #endif #endif/*__ZF_TIME_H__*/ /********************************ENDOFFILE********************************/
六、最后
本篇實現(xiàn)的功能比較基礎(chǔ),但是整個框架開發(fā)的根基,后面所有擴展的功能都需要在此環(huán)境下進行開發(fā)。搭建良好的調(diào)試輸出環(huán)境,可以幫我們快速定位bug的所在,從而提高開發(fā)效率。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5121文章
19418瀏覽量
312623 -
定時器
+關(guān)注
關(guān)注
23文章
3271瀏覽量
116523 -
串口
+關(guān)注
關(guān)注
14文章
1579瀏覽量
78270 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5374瀏覽量
100573 -
環(huán)境搭建
+關(guān)注
關(guān)注
0文章
54瀏覽量
9175
原文標(biāo)題:【嵌入式框架】搭建調(diào)試輸出、建立時間系統(tǒng)
文章出處:【微信號:工程師進階筆記,微信公眾號:工程師進階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
嵌入式框架EFC是什么? 使用EFC的設(shè)計方案有哪些實例?
嵌入式框架圖
如何搭建嵌入式Linux開發(fā)環(huán)境
基于Nios II的嵌入式開發(fā)模式的搭建方案

嵌入式開發(fā)環(huán)境的搭建

嵌入式應(yīng)用框架EAF詳解
關(guān)于嵌入式應(yīng)用框架(EAF)的探索
關(guān)于嵌入式應(yīng)用框架(EAF)的分析
嵌入式系統(tǒng)框架----硬件篇

嵌入式系統(tǒng)移植-01嵌入式基本概念,嵌入式開發(fā)環(huán)境搭建,目標(biāo)機搭建,TFTP服務(wù)搭建,NFS服務(wù)搭建

嵌入式系統(tǒng)框架----軟件篇

嵌入式linux安裝qt,嵌入式Linux版本Qt5.4快速部署

嵌入式框架模板構(gòu)建方案

評論