【嵌入式项目应用】__用于搭建调试输出、建立时间系统的嵌入式框架“Zorb Framework”

news2025/7/19 17:07:26

目录

一、什么是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 开发板作为硬件运行环境,硬件资源用到串口1systick,

其中串口1:提供调试打印功能,systick:提供系统时间计数功能。

关于硬件环境的搭建不多说,可以参照开发板提供的例程来搭建,板级初始化完成了调试串口和systick的初始化。

/******************************************************************************
 * 描述  :硬件环境初始化
 * 参数  :无
 * 返回  :无
******************************************************************************/
void BSP_init(void)
{
    /* 嵌套向量中断控制器组选择 */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    /* 初始化调试串口 */
    Debug_USART_init();

    /* Systick初始化 */
    SystemTick_init();
}

/******************************************************************************
 * 描述  :硬件底层程序
 * 参数  :无
 * 返回  :无
******************************************************************************/
void BSP_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 */

/* 断言产生时的处理 */
void ZF_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 行数
 * 返回  :无
******************************************************************************/
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 ********************************/

五、建立时间系统

为了减少框架对资源的消耗,所以初步设定框架的最小时间周期为1ms,因此我们需要设置systick的定时周期为1ms,然后每次进入中断为我们的框架计数即可。 

/******************************************************************************
 * 描述  :SysTick中断服务程序
 * 参数  :无
 * 返回  :无
******************************************************************************/
void SysTick_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_t ZF_getSystemTick(void);

/* 获取系统时间(ms) */
uint32_t ZF_getSystemTimeMS(void);

/* 系统延时 */
void ZF_delayTick(uint32_t tick);

/* 系统滴答程序(需挂在硬件的时间中断里边) */
void ZF_timeTick (void);

#ifdef __cplusplus
}
#endif

#endif /* __ZF_TIME_H__ */

/******************************** END OF FILE ********************************/

 

六、结束语

本篇实现的功能比较基础,但是整个框架开发的根基,后面所有扩展的功能都需要在此环境下进行开发。搭建良好的调试输出环境,可以帮我们快速定位bug的所在,从而提高开发效率。

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


(* ̄︶ ̄)创作不易!期待你们的 点赞收藏评论喔。

本文来源网络,免费分享知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1157591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

visinextek的sdk编译

编译sdk 1、修改编译链路径 cd customer-rel/board/package/mk/ vi common.mksudo echo ‘PATH“/home/johan/share/vs839/vs-linux/x86-arm/gcc-linaro-7.5.0-aarch64-linux-gnu/bin:$PATH”’ >> /etc/profile source /etc/profile 2、bypass DSP 编译,…

Leetcode循环队列

这道题十分考验我们对队列的理解。 文章目录 队列的介绍队列的实现进入正题 队列的介绍 队列是一种只允许在一段进行插入,在另一端进行删除的数据操作的特殊线性结构,,因此决定了他具有先入先出的特点,其中进行插入操作的一段叫做…

MFC打开控制台的常用方式

工程项目中,想打开控制台的,简单打印日志 (1)依次打开: 项目配置属性——>生成事件——>后期生成事件:命令行 (2)输入: editbin /SUBSYSTEM:CONSOLE $(OUTDIR)\$…

pppoe拨号案例

R3服务端 interface LoopBack0 ip address 1.1.1.1 255.255.255.255 aaa local-user test password cipher admin local-user test service-type ppp ip pool test network 100.0.0.0 mask 255.255.255.0 interface Virtual-Template0 ppp authentication-mode chap remote …

【设计模式】第23节:行为型模式之“策略模式”

一、简介 策略模式:定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。 二、适用场景 动态选择算法多种类似的行为 …

CondConv 动态卷积学习笔记 (附代码)

论文地址:https://arxiv.org/abs/1904.04971 代码地址:https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/condconv 1.是什么? CondConv是一种条件参数卷积,也称为动态卷积,它是一种即插即用的模块&…

数据结构之集合框架

1.Java集合框架的定义 Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces和其实现类 classes 。 其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行…

向上管理中的沟通技巧

一. 背景 我们要弄清楚两个问题为什么要向上管理呢,向上管理主要是要做什么呢? 首先,第一个问题为什么要向上管理?向上管理的本质是为了同时给公司、上司和自己带来最好的结果,并有意识地配合和改变工作方法&#xf…

iPhone连不上Wi-Fi?看完这篇文章你就知道了!

大家在使用苹果手机的过程中有没有遇到过这样的情况:手机突然连接不上Wi-Fi,或者连接了也根本使用不了。遇到上述情况请不要着急,iphone连不上wifi是由很多种原因导致的。那么,iPhone连接不上Wi-Fi时该怎么办呢? 我们…

测试可用的安防视频分析软件:烟火检测、车型检测、玩手机打电话检测、厨帽检测、抽烟检测、人员入侵检测

下载地址:https://pan.baidu.com/s/1R1MvD_KQ3uB-0KL_N3is-w?pwdwa33 随着AI、大数据、云计算和边缘计算等技术的迅猛发展,我国的视频监控市场正处于全新的阶段。借助AI深度学习技术的进步,现代化的安防视频监控系统通过边缘计算设备上的AI识…

用友NC BeanShell RCE漏洞

一、漏洞简介 用友 NC 是面向集团企业的管理软件,其在同类市场占有率中达到亚太第一。用友 NC 由于对外开放了 BeanShell 接口,攻击者可以在未授权的情况下直接访问该接口,并构造恶意数据执行任意代码从而获取服务器权限。 二、影响版本 NC …

误删的文件不在回收站如何找回?分享3个简单方法!

“我前段时间清理电脑的时候误删了一些比较重要的文件,通常我都会使用回收站来还原这些文件的,但昨天不小心清空了回收站,想问问还有机会找回我的文件吗?” 为了保证用户的权益,误删的文件通常会先被移入电脑回收站中。…

SpringBootWeb案例——Tlias智能学习辅助系统(1)

目录 需求与准备环境搭建REST风格的API接口开发规范-统一响应结果 部门管理部门列表查询功能删除部门新增部门请求路径优化查询部门修改部门 员工管理分页查询分页插件PageHelper分页查询(带条件) (难点)删除员工 需求与准备 1、部门管理 包括: 查询部门列表 删除部…

解决远程连接数据库缓慢的问题【图文】【非常详细】

问题概述 当我们远程访问数据库,遇到连接不上或者连接等待时间较长,问题大概率就出在数据库远程链接解析的问题,就是在MySQL的配置文件中增加如下配置参数: [mysqld] skip-name-resolve 具体操作如下 解决步骤 打开mysql所在文…

中小企业选择外贸管理系统有哪些常见的误区?

中小企业基础设施相对薄弱、人员管理松散,选择外贸管理系统是很多管理者的解决方案。选型系统不是一蹴而就的,其中会遇到很多问题甚至进入误区,那么中小企业选择外贸管理系统有哪些常见的误区? 本地部署比云服务更安全 CRM数据安…

【唠唠嵌入式】__如何学习单片机?

目录 前言 个人定位,从事软件还是硬件? 学习内容 (* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 前言 作为一个老司机,多年来跟单片机、Keil、C语言、AD、烙铁、风枪、示波器、电子元器件纠缠不清…

【机器学习】五、贝叶斯分类

我想说:“任何事件都是条件概率。”为什么呢?因为我认为,任何事件的发生都不是完全偶然的,它都会以其他事件的发生为基础。换句话说,条件概率就是在其他事件发生的基础上,某事件发生的概率。 条件概率是朴…

获取Webshell方法

CMS系统指的是内容管理系统。已经有别人开发好了整个网站的前后端,使用者只需要部署cms,然后通过后台添加数据,修改图片等工作,就能搭建好一个的WEB系统。 CMS获取Webshell方法 WordPress后台拿Webshell phpcms拿Webshell 非CMS…

Vue:实现复制按钮功能

作者:CSDN @ _乐多_ 本文记录了vue开发中,复制按钮的实现代码。用于复制网页中的一个数或者字符串啥的。 效果如下图所示, 文章目录 <el-button @click="copyToClipboard(wgs84Position2.altitude)">复制</el-button>data(

AI赋能,轻松出爆文!AI新闻创作新时代,你准备好了吗?

众所周知&#xff0c;传统新闻报道需要大量的人工参与&#xff0c;不仅耗时耗力&#xff0c;还对媒体工作者的文字功底和知识积累有很高的要求。但随着人工智能技术的发展&#xff0c;大模型在新闻写作领域展现出强大的潜力。通过AI写作技术&#xff0c;在很大程度上实现了新闻…