嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。
嵌入式框架Zorb Framework搭建过程
嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统
嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
一、前言
之前,我一直以为C语言只是面向过程的语言,直到我发现它也可以用来创造对象。现在,我就要用面向对象的思想来搭建一个轻量级的嵌入式框架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[] = "[rank=0]"; \
code[] = '' + (char)rank; \
if (code[] != '') \
{ \
printf("%s", code); \
} \
printf(x); \
} while()
#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) : 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 ();
} /******************************** 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) + ); \
} \
else \
{ \
ZF_delayTick(ms_ / ZF_TICK_PERIOD); \
} \
} while() /* 获取系统滴答数 */
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 ********************************/
/**
*****************************************************************************
* @file zf_time.c
* @author Zorb
* @version V1.0.0
* @date 2018-06-28
* @brief 系统时间的实现
*****************************************************************************
* @history
*
* 1. Date:2018-06-28
* Author:Zorb
* Modification:建立文件
*
*****************************************************************************
*/ #include "zf_time.h" /* 系统滴答数 */
uint32_t ZF_tick = ; /******************************************************************************
* 描述 :获取系统滴答数
* 参数 :无
* 返回 :系统滴答数
******************************************************************************/
uint32_t ZF_getSystemTick(void)
{
return ZF_tick;
} /******************************************************************************
* 描述 :获取系统时间(ms)
* 参数 :无
* 返回 :系统时间(ms)
******************************************************************************/
uint32_t ZF_getSystemTimeMS(void)
{
return ZF_tick * ZF_TICK_PERIOD;
} /******************************************************************************
* 描述 :系统延时
* 参数 :(in)-tick 需要延时的系统周期数
* 返回 :无
******************************************************************************/
void ZF_delayTick(uint32_t tick)
{
uint32_t startTick = ZF_getSystemTick();
while((ZF_getSystemTick() - startTick) < tick);
} /******************************************************************************
* 描述 :系统滴答程序(需挂在硬件的时间中断里边)
* 参数 :无
* 返回 :无
******************************************************************************/
void ZF_timeTick (void)
{
/* 系统滴答计数 */
ZF_tick++;
} /******************************** END OF FILE ********************************/
六、最后
本篇实现的功能比较基础,但是整个框架开发的根基,后面所有扩展的功能都需要在此环境下进行开发。搭建良好的调试输出环境,可以帮我们快速定位bug的所在,从而提高开发效率。
本文工程代码:1-Zorb_Framework嵌入式环境搭建.rar
Zorb Framework github:https://github.com/54zorb/Zorb-Framework
版权所有,转载请打赏哟
如果你喜欢我的文章,可以通过微信扫一扫给我打赏哟
嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统的更多相关文章
- 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建三:列表的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建四:状态机的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建五:事件的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建六:定时器的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- 嵌入式框架Zorb Framework搭建七:任务的实现
我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...
- Zend Framework学习日记(1)--环境搭建篇(转)
Zend Framework学习日记(1)--环境搭建篇 (1)开发工具 Zend Framework框架:http://framework.zend.com/download/latest 包含2个 ...
- SSH环境搭建之Hibernate环境搭建篇
SSH环境搭建之Hibernate环境搭建篇 搭建有两种方式: 1.使用IntelliJ IDEA或者MyEclipse的逆向工程(关系模型 -> 对象模型),我使用的是IntelliJ IDE ...
- SSH环境搭建之Spring环境搭建篇
SSH环境搭建之Spring环境搭建篇 一.引入Spring所使用的JAR文件 二.在src目录下创建beans.xml(Spring的容器文件) <?xml version="1.0 ...
随机推荐
- ELK_Elastic Search和kibana版本对应关系
https://www.elastic.co/downloads/past-releases/kibana-5-0-0 https://www.elastic.co/downloads/past-re ...
- Deep Learning Drizzle
Deep Learning Drizzle Drench yourself in Deep Learning, Reinforcement Learning, Machine Learning, Co ...
- SAP成都研究院2018年总共87篇技术文章合集
2018年很快就要结束了.Jerry在2017年年底准备开始写这个公众号时,给自己定的目标是:2018年至少保证每周发布一篇高质量的文章.如今2018年就快过去了,高质量与否需要大家来反馈,至少从量上 ...
- linux-记录
查看运行的进程 ps -aux|grep java 找到要删除的进程的编号 杀死进程 kill -9 1883(进程编号) 重启服务 sh satrtBussinessService.sh
- react开发中如何使用require.ensure加载es6风格的组件
其实用的babel,在浏览器端就应该可以加载,之前少了个default: require.ensure([],(require) => { let A = require('./a.js').d ...
- js获取7天之前或之后的日期
function fun_date(aa){ var date1 = new Date(), time1=date1.getFullYear()+"-"+(date1.getMon ...
- iOS学习笔记09-核心动画CoreAnimation
http://www.cnblogs.com/liutingIOS/p/5368536.html 一.CALayer CALayer包含在QuartzCore框架中,具有跨平台性,在iOS中使用Cor ...
- Unity3D十款最火的的插件推荐
作为当前最主流的3D游戏引擎之中的一个.Unity拥有大量第三方插件和工具帮助开发人员提升工作效率. 我们摘选了十款最受欢迎的工具推荐给大家.类别包括2D开发.UI设计.原型制作.着色.特效等,涉及了 ...
- 牛客网多校训练第一场 E - Removal(线性DP + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/E 题意: 给出一个n(1≤n≤1e5)个整数(范围是1至10)的序列,求从中移除m(1≤m≤min(n-1, ...
- jquery基础介绍-转
学习目的:理解 Ajax 及其工作原理,构建网站的一种有效方法. Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写. 下面是 Ajax 应用程 ...