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

一、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.hqwc.cn/news/160898.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust学习日记(二)变量的使用--结合--温度换算/斐波那契数列--实例

前言: 这是一个系列的学习笔记,会将笔者学习Rust语言的心得记录。 当然,这并非是流水账似的记录,而是结合实际程序项目的记录,如果你也对Rust感兴趣,那么我们可以一起交流探讨,使用Rust来构建程…

CMU/MIT/清华/Umass提出生成式机器人智能体RoboGen

文章目录 导读1. Introduction2. 论文地址3. 项目主页4. 开源地址5. RoboGen Pipeline6. Experimental Results作者介绍Reference 导读 CMU/MIT/清华/Umass提出的全球首个生成式机器人智能体RoboGen,可以无限生成数据,让机器人7*24小时永不停歇地训练。…

7.spark sql编程

概述 spark 版本为 3.2.4,注意 RDD 转 DataFrame 的代码出现的问题及解决方案 本文目标如下: RDD ,Datasets,DataFrames 之间的区别入门 SparkSession创建 DataFramesDataFrame 操作编程方式运行 sql 查询创建 DatasetsDataFrames 与 RDDs 互相转换 使用…

Deep Image Matting:深度学习Matting开山之作

论文:https://arxiv.org/pdf/1703.03872.pdf 代码:GitHub - foamliu/Deep-Image-Matting-PyTorch: Deep Image Matting implementation in PyTorch 1、动机 在此之前的Matting方法要么是用传统方法,要么是传统深度学习的组合,他们…

亚马逊云科技大语言模型下的六大创新应用功能

目录 前言 亚马逊云科技的AI创新应用 ​编辑 Amazon CodeWhisperer Amazon CodeWhisperer产品的优势 更快地完成更多工作 自信地进行编码 增强代码安全性 使用收藏夹工具 自定义 CodeWhisperer 以获得更好的建议 如何使用Amazon CodeWhisperer 步骤 1 步骤 2 具体…

2023年金融科技建模大赛(初赛)开箱点评-基于四川新网银行数据集

各位同学大家好,我是Toby老师。2023年金融科技建模大赛(初赛)从今年10月14日开始,11月11日结束。 比赛背景 发展数字经济是“十四五”时期的重大战略规划。2023年,中共中央、国务院印发了《数字中国建设整体布局规划》…

【漏洞复现】​金蝶云星空管理中心

目录 0x01 漏洞介绍 0x02 影响产品 0x03 语法特征 0x04 漏洞复现 0x01 漏洞介绍 金蝶云星空是一款基于领先的可组装低代码PaaS平台,全面服务客户研发、生产、营销、供应链、财务等领域转型的企业管理服务平台。它已支持IPD、精益、阿米巴等先进管理理念在3.1万余…

一站式解决方案:体验亚马逊轻量服务器/VPS的顶级服务与灵活性

文章目录 一、什么是轻量级服务器/VPS 二、服务器创建步骤 三、服务器连接客户端(私钥登录) 四、使用服务器搭建博客网站 五、个人浅解及总结 一、什么是轻量级服务器/VPS 亚马逊推出的轻量级服务器/VPS:是一种基于云计算技术的虚拟服务器解决方案。它允许用户…

JAVA毕业设计109—基于Java+Springboot+Vue的宿舍管理系统(源码+数据库)

基于JavaSpringbootVue的宿舍管理系统(源码数据库)109 一、系统介绍 本系统前后端分离 本系统分为学生、宿管、超级管理员三种角色 1、用户: 登录、我的宿舍、申请调宿、报修申请、水电费管理、卫生检查、个人信息修改。 2、宿管: 登录、用户管理…

MES与ERP系统集成的一些探讨

什么是MES软件? 制造执行系统 (MES) 是一种用于控制车间复杂制造操作和数据的软件。MES软件有助于提高生产过程的质量,使制造商能够轻松响应需求和客户偏好的变化。 MES软件有什么作用? 制造执行系统允许企业跟踪、…

【Unity细节】论复合函数在Start生命周期中的调用顺序和时间

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

【云服务器】对比传统服务器,为什么说云服务器更具优势?

个人主页:【😊个人主页】 系列专栏:【❤️其他领域】 文章目录 前言云服务器云服务器的优势成本可扩展性可靠性和安全性 总结 前言 2006年搜索引擎大会上,“云服务器”的概念孕育而生,时至今日云服务器与传统服务器的…