0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式框架Zorb Framework搭建方案

工程师进阶笔记 来源:github.com 2023-11-05 17:08 次阅读

一、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提供系统时间计数功能。

6b6e5776-7a2f-11ee-939d-92fbcf53809c.png

关于硬件环境的搭建不多说,可以参照开发板提供的例程来搭建,板级初始化完成了调试串口和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的所在,从而提高开发效率。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5083

    文章

    19129

    浏览量

    305397
  • 定时器
    +关注

    关注

    23

    文章

    3249

    浏览量

    114842
  • 串口
    +关注

    关注

    14

    文章

    1555

    浏览量

    76541
  • 开发板
    +关注

    关注

    25

    文章

    5057

    浏览量

    97519
  • 环境搭建
    +关注

    关注

    0

    文章

    53

    浏览量

    9057

原文标题:【嵌入式框架】搭建调试输出、建立时间系统

文章出处:【微信号:工程师进阶笔记,微信公众号:工程师进阶笔记】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式框架Zorb Framework状态机的实现

    Zorb Framework是一个基于面向对象的思想来搭建一个轻量级的嵌入式框架
    的头像 发表于 11-29 09:33 1174次阅读
    <b class='flag-5'>嵌入式</b><b class='flag-5'>框架</b><b class='flag-5'>Zorb</b> <b class='flag-5'>Framework</b>状态机的实现

    嵌入式框架EFC是什么? 使用EFC的设计方案有哪些实例?

    什么是框架?如何设计框架嵌入式框架EFC是什么?使用EFC的设计方案有哪些实例?
    发表于 04-27 06:23

    嵌入式框架

    1.overview 图1-1 嵌入式框架嵌入式系统分为硬件以及软件两大部分,大多数人参与的是嵌入式软件设计,更多的是接触的是上层软件系统部分,可以分为两大类型
    发表于 10-27 08:26

    如何搭建嵌入式C语言单元测试自动化框架

    关于嵌入式C语言单元测试自动化框架搭建思路
    发表于 12-15 07:35

    如何搭建嵌入式Linux开发环境

    关于嵌入式Linux开发环境搭建,请参考以下帖子:嵌入式Linux开发环境搭建-(1)安装VMware Workstation虚拟机嵌入式L
    发表于 12-16 08:31

    基于Nios II的嵌入式开发模式的搭建方案  

    介绍了Nios II的软件开发环境,然后详细阐述如何在Nios II平台下搭建RTEMS嵌入式开发环境。 1.引言 随着技术的不断发展,嵌入式技术逐渐成为计算机技术的一个重要分支。由于嵌入式
    发表于 10-17 10:47 0次下载
    基于Nios II的<b class='flag-5'>嵌入式</b>开发模式的<b class='flag-5'>搭建</b><b class='flag-5'>方案</b>  

    嵌入式开发环境的搭建

    本文详细介绍了嵌入式开发环境的搭建。这个教程在仅使用附带的光盘镜像文件里的资料的情况下,所搭建嵌入式 ARM 开发环境可以满足 ARM 核为 ARM920T 及 CORTEX-A8
    的头像 发表于 02-01 16:39 8528次阅读
    <b class='flag-5'>嵌入式</b>开发环境的<b class='flag-5'>搭建</b>

    嵌入式应用框架EAF详解

    EAF是Embedded Application Framework 的缩写,即嵌入式应用框架嵌入式应用框架是 Application
    发表于 12-02 11:30 2855次阅读

    关于嵌入式应用框架(EAF)的探索

    EAF是Embedded Application Framework 的缩写,即嵌入式应用框架
    发表于 12-10 14:28 866次阅读

    关于嵌入式应用框架(EAF)的分析

    EAF是Embedded Application Framework 的缩写,即嵌入式应用框架嵌入式应用框架是 Application
    发表于 01-01 09:50 1533次阅读

    嵌入式系统框架----硬件篇

    1.系统框架图对于一个嵌入式系统,最重要的当然是运算以及存储单元,基本的嵌入式系统可以简化成如下系统框架图:
    发表于 10-20 11:51 3次下载
    <b class='flag-5'>嵌入式</b>系统<b class='flag-5'>框架</b>----硬件篇

    嵌入式系统移植-01嵌入式基本概念,嵌入式开发环境搭建,目标机搭建,TFTP服务搭建,NFS服务搭建

    文章目录系统移植概述及环境搭建嵌入式基本概念嵌入式系统的应用领域什么是嵌入式系统用嵌入式系统硬件组成部分通用
    发表于 10-20 17:21 10次下载
    <b class='flag-5'>嵌入式</b>系统移植-01<b class='flag-5'>嵌入式</b>基本概念,<b class='flag-5'>嵌入式</b>开发环境<b class='flag-5'>搭建</b>,目标机<b class='flag-5'>搭建</b>,TFTP服务<b class='flag-5'>搭建</b>,NFS服务<b class='flag-5'>搭建</b>

    嵌入式系统框架----软件篇

    1.overview 图1-1 嵌入式框架嵌入式系统分为硬件以及软件两大部分,大多数人参与的是嵌入式
    发表于 10-20 19:21 5次下载
    <b class='flag-5'>嵌入式</b>系统<b class='flag-5'>框架</b>----软件篇

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

    摘要:Qt是一个领先的跨平台应用和UI 开发框架(Framework),使用标准C++,适用于桌面,嵌入式和移动平台。本文着重就利用Boot to Qt 软件包来实现Qt5在嵌入式AR
    发表于 11-02 10:51 0次下载
    <b class='flag-5'>嵌入式</b>linux安装qt,<b class='flag-5'>嵌入式</b>Linux版本Qt5.4快速部署

    嵌入式框架模板构建方案

    嵌入式框架模板构建方案关键内容python3.xmakoyaml实战演习main.pyimport yamlfrom mako.template import Templateimport
    发表于 12-29 19:00 2次下载
    <b class='flag-5'>嵌入式</b><b class='flag-5'>框架</b>模板构建<b class='flag-5'>方案</b>