一、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的所在,從而提高開發效率。
審核編輯:湯梓紅
-
嵌入式
+關注
關注
5208文章
20587瀏覽量
336288 -
定時器
+關注
關注
23文章
3370瀏覽量
124291 -
串口
+關注
關注
15文章
1626瀏覽量
83230 -
開發板
+關注
關注
26文章
6372瀏覽量
120072 -
環境搭建
+關注
關注
0文章
60瀏覽量
9486
原文標題:【嵌入式框架】搭建調試輸出、建立時間系統
文章出處:【微信號:工程師進階筆記,微信公眾號:工程師進階筆記】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
嵌入式框架圖
如何搭建嵌入式Linux開發環境
基于Nios II的嵌入式開發模式的搭建方案
嵌入式開發環境的搭建
嵌入式應用框架EAF詳解
關于嵌入式應用框架(EAF)的分析
嵌入式系統移植-01嵌入式基本概念,嵌入式開發環境搭建,目標機搭建,TFTP服務搭建,NFS服務搭建
嵌入式linux安裝qt,嵌入式Linux版本Qt5.4快速部署
嵌入式框架模板構建方案
嵌入式框架Zorb Framework搭建方案
評論