一、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)機(jī)功能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ī)可以根據(jù)不同等級進(jìn)行高亮提示:
/** ***************************************************************************** *@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)鍵地方進(jì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,然后每次進(jìn)入中斷為我們的框架計數(shù)即可。
/******************************************************************************
*描述:SysTick中斷服務(wù)程序
*參數(shù):無
*返回:無
******************************************************************************/
voidSysTick_Handler(void)
{
/*為zorbframework提供計時*/
ZF_timeTick();
}
現(xiàn)在時間系統(tǒng)提供的功能比較基礎(chǔ),只有系統(tǒng)滴答計數(shù)和系統(tǒng)死等待延時,后面我們開發(fā)定時器功能和任務(wù)功能的時候會重新擴(kuò)展時間系統(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ā)的根基,后面所有擴(kuò)展的功能都需要在此環(huán)境下進(jìn)行開發(fā)。搭建良好的調(diào)試輸出環(huán)境,可以幫我們快速定位bug的所在,從而提高開發(fā)效率。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20442瀏覽量
333962 -
定時器
+關(guān)注
關(guān)注
23文章
3368瀏覽量
123571 -
串口
+關(guān)注
關(guān)注
15文章
1618瀏覽量
82803 -
開發(fā)板
+關(guān)注
關(guān)注
26文章
6289瀏覽量
118039 -
環(huán)境搭建
+關(guān)注
關(guān)注
0文章
60瀏覽量
9461
原文標(biāo)題:【嵌入式框架】搭建調(diào)試輸出、建立時間系統(tǒng)
文章出處:【微信號:工程師進(jìn)階筆記,微信公眾號:工程師進(jìn)階筆記】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
嵌入式框架Zorb Framework狀態(tài)機(jī)的實現(xià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)機(jī)搭建,TFTP服務(wù)搭建,NFS服務(wù)搭建
嵌入式系統(tǒng)框架----軟件篇
嵌入式linux安裝qt,嵌入式Linux版本Qt5.4快速部署
嵌入式框架模板構(gòu)建方案
嵌入式框架Zorb Framework搭建方案
評論