【嵌入式框架】搭建调试输出、建立时间系统

news2024/11/25 13:23:07

一、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的初始化。

/******************************************************************************
 * 描述  :硬件环境初始化
 * 参数  :无
 * 返回  :无
******************************************************************************/
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

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

-END-

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

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

相关文章

微信小程序获取openid

1.需要小程序中调用 wx.login获取临时code值(每次获取的code值只能用一次) wx.login({success (res) {console.log(res)} }) 打印结果为: 2.调用微信提供的apid接口,获取openid,入参需要三个参数:AppID(小…

SPSS单因素方差分析

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

Python 用户输入和字符串格式化指南

Python 允许用户输入数据。这意味着我们可以向用户询问输入。在 Python 3.6 中,使用 input() 方法来获取用户输入。在 Python 2.7 中,使用 raw_input() 方法来获取用户输入。以下示例要求用户输入用户名,并在输入用户名后将其打印在屏幕上&am…

Prometheus接入AlterManager配置企业微信告警(基于K8S环境部署)

文章目录 一、创建企业微信机器人二、配置AlterManager告警发送至企业微信三、Prometheus接入AlterManager配置四、部署PrometheusAlterManager(放到一个Pod中)五、测试告警 注意:请基于 PrometheusGrafana监控K8S集群(基于K8S环境部署)文章之上做本次实验。 一、创…

IDEA快捷键总结+常识积累

&#xff08;一&#xff09;常用快捷键总结 以下快捷键输入完成后按Tab键即可。 1、输入main public static void main(String[] args) {}2、输入sout System.out.println();3、输入fori for (int i 0; i < ; i) {}4、输入foreach&#xff08;增强for循环快捷键&#x…

CMake引用QT、CMake构建一个转换为3d tile的开源代码

在CMake里单独运行一下 find_package(Qt5 REQUIRED COMPONENTS Core Xml Test) ,Core Xml Test 这三个是需要的qt组件; 情况如下;提示找不到QT; 根据资料,cmake引用qt需要3-4个方面, 首先Qt包含三个编译工具:moc、uic、rcc, moc:元对象编译器(Meta O…

翻页电子杂志制作功略,快收藏,保管好用!

翻页电子杂志&#xff0c;我相信这对大家很熟悉吧&#xff0c;大家也都经常看电子杂志吧。它和我们的生活紧密相关&#xff0c;也极大地改变了我们的阅读方式。听到这“翻页电子杂志”&#xff0c;是不是觉得制作起来肯定很难很复杂&#xff0c;需要专业的人才能制作呢&#xf…

2023 年最值得推荐的 10 款 iPhone 数据恢复软件

iPhone 从来都不是一个简单的打电话电话。它就像一台微型电脑&#xff0c;让我们互相联系、拍照、拍视频、发邮件、看文档、看书。然而&#xff0c;随着它成为日常生活的必需品&#xff0c;我们总是容易因各种原因丢失数据&#xff0c;如删除、恢复出厂设置、iOS 错误、文件同步…

python 之softmx 函数

文章目录 总的介绍小应用 总的介绍 Softmax函数是一个常用的激活函数&#xff0c;通常用于多类别分类问题中。它将一个实数向量转换为概率分布。这个函数的输出是一个概率分布&#xff0c;表示输入样本属于每个可能类别的概率。 给定一个具有 (K) 个不同数值的实数向量 z (z1…

从功能测试到测试开发,待遇翻倍,我整理的超全学习指南!

在这个吃技术的IT行业来说&#xff0c;我刚入行的时候每天做的也是最基础的工作&#xff0c;但是随着时间的消磨&#xff0c;我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间&#xff0c;另一个就是做了快2年的测试&#xff0c;感觉每天过得浑浑噩噩&#xff…

【Spring Security】Spring Security 认证与授权

在前面的章节中,我们沿用了Spring Security默认的安全机制:仅有一个用户,仅有一种角色。在实际开发中,这自然是无法满足需求的。本章将更加深入地对Spring Security迚行配置,且初步使用授权机制。 3.1 默认数据库模型的认证与授权 3.1.1、资源准备 首先,在controller包…

Linux文件共享的完美助手:深入探索Samba和NFS

1 samba介绍 1.1 samba基本介绍 作用&#xff1a;网络文件共享 smb&#xff08;Server Message Block &#xff09;是 Miscrosoft公司软件。 cifs &#xff08; Common Internet File System &#xff09;是Sum公司开发&#xff0c;是smb的开源版。 1.2 samba基本信息 服务启…

全球首例无液氦脑磁图辅助下的胶质瘤切除手术顺利完成

近日&#xff0c;在国家重点研发计划“新型无液氦脑磁图系统研发”项目支持下&#xff0c;首都医科大学附属北京天坛医院季楠教授团队完成全球首例无液氦脑磁图运动功能区定位辅助下的胶质瘤切除手术。 手术对一例肿瘤累及运动功能区的年轻女性在术前分别利用无液氦脑磁图仪和功…

使用Gradle创建SpringBoot项目

Spring Boot Gradle 插件在Gradle 提供Spring Boot 支持。它允许您打包可执行jar 或war 归档文件&#xff0c;运行SpringBoot 应用程序&#xff0c;并使用Spring-Boot-dependencies 提供的依赖管理。相关文档请参考&#xff1a; https://docs.spring.io/spring-boot/docs/curre…

【算法挨揍日记】day19——62. 不同路径、63. 不同路径 II

62. 不同路径 62. 不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#x…

2023年【熔化焊接与热切割】免费试题及熔化焊接与热切割考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割免费试题参考答案及熔化焊接与热切割考试试题解析是安全生产模拟考试一点通题库老师及熔化焊接与热切割操作证已考过的学员汇总&#xff0c;相对有效帮助熔化焊接与热切割考试总结学员顺利通过考试。…

小熊猫c++ 搭配keil

小熊猫c 搭配keil 除了vs codekeil插件外&#xff0c;用国产的小熊猫C也可以写keil代码&#xff0c; 两者区别在于vs code多一个有编译功能&#xff0c;而小熊猫C的相对vscode方式&#xff0c;需要多了一个手动切换到keil进行编译步骤。 目的&#xff1a;小熊猫C可以 【代码提…

【MATLAB】基于灰狼优化算法优化BP神经网络 (GWO-BP)的数据回归预测

文章目录 效果一览文章概述订阅专栏只能获取一份代码部分源码参考资料效果一览 文章概述 【MATLAB】基于灰狼优化算法优化BP神经网络 (GWO-BP)的数据回归预测 在MATLAB中,基于灰狼优化算法优化BP神经网络(GWO-BP)进行数据回归预测的步骤如下: 数据准备:首先,将用于回归预…

如何保障企业TikTok直播网络的可靠性?

在这个直播流量爆炸的时代&#xff0c;直播带货的营销方式逐渐走向大众&#xff0c;企业通过直播的方式向消费者展示产品和服务&#xff0c;从而提高品牌知名度。而TikTok作为全球最受欢迎的短视频和直播社交平台&#xff0c;拥有庞大且活跃的用户群体&#xff0c;是不少企业直…

企业云产品如何分配才能更划算

当谈到企业在线成本时&#xff0c;CDN&#xff08;内容分发网络&#xff09;加速是一个关键的话题。CDN加速可以显著影响企业的线上运营成本&#xff0c;因此&#xff0c;正确使用云产品以获得更划算的CDN加速解决方案是至关重要的。 首先&#xff0c;让我们了解CDN加速的基本原…