https://github.com/54zorb/Zorb-FrameworkZorb簡介
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
前6個功能,就可以實現(xiàn)純事件驅(qū)動的程序,基本可以滿足中小型嵌入式應(yīng)用程序開發(fā)的需求。加上任務(wù)功能,是為了滿足部分程序?qū)崟r性要求較高的需求。
當然,也可以將前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ù)??:無
?*?返回??:無
******************************************************************************/
void?BSP_init(void)
{
????/*?嵌套向量中斷控制器組選擇?*/
????NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
????/*?初始化調(diào)試串口?*/
????Debug_USART_init();
????/*?Systick初始化?*/
????SystemTick_init();
}
/******************************************************************************
?*?描述??:硬件底層程序
?*?參數(shù)??:無
?*?返回??:無
******************************************************************************/
void?BSP_process(void)
{
}
調(diào)試
開發(fā)一個程序,最開始也最重要的是搭建調(diào)試的環(huán)境,我們采用串口1作為調(diào)試輸出(printf映射),然后調(diào)試信息分為三個等級,后續(xù)上位機可以根據(jù)不同等級進行高亮提示:
/**
??*****************************************************************************
??*?@file????zf_debug.h
??*?@author??Zorb
??*?@version?V1.0.0
??*?@date????2018-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"
#define?LOG_D?0;?/*?信息等級:正常?*/
#define?LOG_W?1;?/*?信息等級:告警?*/
#define?LOG_E?2;?/*?信息等級:錯誤?*/
#define?_ZF_DEBUG?????????????/*?定義調(diào)試功能?*/
#define?ZF_DEBUG_ON?true??????/*?啟用調(diào)試功能?*/
#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?********************************/
斷言
在開發(fā)過程中,在關(guān)鍵地方進行一些斷言,可以方便定位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?*/
/*?斷言產(chǎn)生時的處理?*/
void?ZF_assertHandle(uint8_t?*pFileName,?int?line);
#ifdef?__cplusplus
}
#endif
#endif?/*?__ZF_ASSERT_H__?*/
/********************************?END?OF?FILE?********************************/
斷言的處理很簡單,就是告訴我們在哪個文件哪一行出錯就可以,實現(xiàn)如下
/**
??*****************************************************************************
??*?@file????zf_assert.c
??*?@author??Zorb
??*?@version?V1.0.0
??*?@date????2018-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ù)
?*?返回??:無
******************************************************************************/
void?ZF_assertHandle(uint8_t?*pFileName,?int?line)
{
????ZF_DEBUG(LOG_E,?"file:%s?line:%d:asserted\r\n",?pFileName,?line);
????while?(1);
}
/********************************?END?OF?FILE?********************************/
調(diào)度時間
為了減少框架對資源的消耗,所以初步設(shè)定框架的最小時間周期為1ms,因此我們需要設(shè)置systick的定時周期為1ms,然后每次進入中斷為我們的框架計數(shù)即可。
/******************************************************************************
?*?描述??:SysTick中斷服務(wù)程序
?*?參數(shù)??:無
?*?返回??:無
******************************************************************************/
void?SysTick_Handler(void)
{
????/*?為zorb?framework提供計時?*/
????ZF_timeTick();
}
現(xiàn)在時間系統(tǒng)提供的功能比較基礎(chǔ),只有系統(tǒng)滴答計數(shù)和系統(tǒng)死等待延時,后面我們開發(fā)定時器功能和任務(wù)功能的時候會重新擴展時間系統(tǒng)。
/**
??*****************************************************************************
??*?@file????zf_time.h
??*?@author??Zorb
??*?@version?V1.0.0
??*?@date????2018-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)?*/
#define?ZF_TICK_PERIOD?1
/*?獲取系統(tǒng)滴答數(shù)?*/
#define?ZF_SYSTICK()?ZF_getSystemTick()
/*?獲取系統(tǒng)時間(ms)?*/
#define?ZF_SYSTIME_MS()?ZF_getSystemTimeMS()
/*?系統(tǒng)延時(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)
/*?獲取系統(tǒng)滴答數(shù)?*/
uint32_t?ZF_getSystemTick(void);
/*?獲取系統(tǒng)時間(ms)?*/
uint32_t?ZF_getSystemTimeMS(void);
/*?系統(tǒng)延時?*/
void?ZF_delayTick(uint32_t?tick);
/*?系統(tǒng)滴答程序(需掛在硬件的時間中斷里邊)?*/
void?ZF_timeTick?(void);
#ifdef?__cplusplus
}
#endif
#endif?/*?__ZF_TIME_H__?*/
/********************************?END?OF?FILE?********************************/最后
本篇實現(xiàn)的功能比較基礎(chǔ),但是整個框架開發(fā)的根基,后面所有擴展的功能都需要在此環(huán)境下進行開發(fā)。
搭建良好的調(diào)試輸出環(huán)境,可以幫我們快速定位bug的所在,從而提高開發(fā)效率。
Github 地址
https://github.com/54zorb/Zorb-Framework
End
「汽車電子嵌入式在CSDN上同步推出AUTOSAR精進之路專欄,本專欄每個模塊完全按實際項目中開發(fā)及維護過程來詳細介紹。模塊核心概念介紹、實際需求描述、實際工程配置、特殊需求介紹及背后原理、實際工程使用經(jīng)驗總結(jié)。目的是讓讀者看完每一個章節(jié)后能理解原理后根據(jù)需求完成一個模塊的配置或者解決一個問題。」
點擊文章最后左下角的閱讀原文可以獲取更多信息
或者復(fù)制如下鏈接到瀏覽器獲取更多信息
https://blog.csdn.net/qq_36056498/article/details/132125693
文末福利
2.為便于技術(shù)交流,創(chuàng)建了汽車電子嵌入式技術(shù)交流群,可盡情探討AP,CP,DDS,SOME/IP等前沿?zé)狳c話題,后臺回復(fù)“加群”即可加入;
注:本文引用了一些第三方工具和文檔,若有侵權(quán),請聯(lián)系作者刪除!
推薦閱讀
汽車電子嵌入式精彩文章匯總第一期:20210530-20230703
AUTOSAR 架構(gòu)下EcuM喚醒源事件詳解
AUTOSAR架構(gòu)下NVM Block連續(xù)寫及Default Value問題分析
AUTOSAR架構(gòu)下NvM模塊詳細分析
AUTOSAR架構(gòu)下報文掉線超時不上報問題分析
Classic Autosar下的以太網(wǎng)通訊架構(gòu)概覽
通信中間件Someip服務(wù)化通信
AUTOSAR架構(gòu)下Fee詳細分析
TC37x芯片F(xiàn)LASH基本概念介紹
AUTOSAR架構(gòu)下Fls詳細分析
TC3xx芯片DMU介紹
TC3xx芯片MPU介紹
TC3xx芯片的Trap詳解
AUTOSAR架構(gòu)下的OS錯誤處理
AUTOSAR架構(gòu)下QM Application如何訪問ASIL Application
AUTOSAR架構(gòu)下多核啟動
TC3xx芯片的Trap詳解(二)
AUTOSAR架構(gòu)下多核Shutdown
AUTOSAR架構(gòu)下多核通信
RH850U2A芯片平臺Spinlock的底層實現(xiàn)
TC3xx芯片Clock System功能詳解-時鐘源OSC
TC3xx芯片Clock System功能詳解-鎖相環(huán)PLL
TC3xx芯片Clock System功能詳解-時鐘分配CCU
End
歡迎點贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,都是我最大的動力!
汽車電子嵌入式
微信掃描二維碼,關(guān)注我的公眾號