當前位置: 妍妍網 > 碼農

一款適合微控制器裸機的開源軟體框架

2024-07-07碼農

作者 | Github - 54zorb

排版 | 嵌入式專欄

開源地址:

https://github.com/54zorb/Zorb-Framework

很多時候,做微控制器計畫,會因為效能和記憶體資源的限制,沒辦法執行一些「大型」的通用框架,這個時候,一些輕量級的軟體框架有顯得尤為重要了。

這裏就給大家分享一款一款適合微控制器裸機的開源軟體框架:Zorb

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對映),然後偵錯資訊分為三個等級,後續上位機可以根據不同等級進行高亮提示:

/**
*****************************************************************************
* @file zf_debug.h
* @author Zorb
* @version V1.0.0
* @date 2018-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"
#define LOG_D 0; /* 資訊等級:正常 */
#define LOG_W 1; /* 資訊等級:告警 */
#define LOG_E 2; /* 資訊等級:錯誤 */
#define _ZF_DEBUG /* 定義偵錯功能 */
#define ZF_DEBUG_ON true /* 啟用偵錯功能 */
#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 ********************************/







斷言

在開發過程中,在關鍵地方進行一些斷言,可以方便定位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 */
/* 斷言產生時的處理 */
voidZF_assertHandle(uint8_t *pFileName, int line);
#ifdef __cplusplus
}
#endif
#endif/* __ZF_ASSERT_H__ */
/******************************** END OF FILE ********************************/







斷言的處理很簡單,就是告訴我們在哪個檔哪一行出錯就可以,實作如下

/**
*****************************************************************************
* @file zf_assert.c
* @author Zorb
* @version V1.0.0
* @date 2018-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, int line)
{
ZF_DEBUG(LOG_E, "file:%s line:%d:asserted\r\n", pFileName, line);
while (1);
}
/******************************** END OF FILE ********************************/


排程時間

為了減少框架對資源的消耗,所以初步設定框架的最小時間周期為1ms,因此我們需要設定systick的定時周期為1ms,然後每次進入中斷為我們的框架計數即可。

/******************************************************************************
 * 描述 :SysTick中斷服務程式
 * 參數 :無
 * 返回 :無
******************************************************************************/

voidSysTick_Handler(void)
{
/* 為zorb framework提供計時 */
ZF_timeTick();
}

現在時間系統提供的功能比較基礎,只有系統滴答計數和系統死等待延時,後面我們開發定時器功能和任務功能的時候會重新擴充套件時間系統。

/**
*****************************************************************************
* @file zf_time.h
* @author Zorb
* @version V1.0.0
* @date 2018-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) */
#define ZF_TICK_PERIOD 1
/* 獲取系統滴答數 */
#define ZF_SYSTICK() ZF_getSystemTick()
/* 獲取系統時間(ms) */
#define ZF_SYSTIME_MS() ZF_getSystemTimeMS()
/* 系統延時(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)

/* 獲取系統滴答數 */
uint32_tZF_getSystemTick(void);
/* 獲取系統時間(ms) */
uint32_tZF_getSystemTimeMS(void);
/* 系統延時 */
voidZF_delayTick(uint32_t tick);
/* 系統滴答程式(需掛在硬體的時間中斷裏邊) */
voidZF_timeTick(void);
#ifdef __cplusplus
}
#endif
#endif/* __ZF_TIME_H__ */
/******************************** END OF FILE ********************************/













本篇實作的功能比較基礎,但是整個框架開發的根基,後面所有擴充套件的功能都需要在此環境下進行開發。

搭建良好的偵錯輸出環境,可以幫我們快速定位bug的所在,從而提高開發效率。

Github 地址

https://github.com/54zorb/Zorb-Framework

聲明: 本文素材來源網路,版權歸原作者所有。如涉及作品版權問題,請與我聯系刪除。

<END>

點這裏👇關註我,記得標星呀~

感謝你的分享,點贊,在看三