我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮。

嵌入式框架Zorb Framework搭建过程

嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调试输出和建立时间系统

嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

嵌入式框架Zorb Framework搭建三:列表的实现

嵌入式框架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搭建一:嵌入式环境搭建、调试输出和建立时间系统的更多相关文章

  1. 嵌入式框架Zorb Framework搭建二:环形缓冲区的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  2. 嵌入式框架Zorb Framework搭建三:列表的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  3. 嵌入式框架Zorb Framework搭建四:状态机的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  4. 嵌入式框架Zorb Framework搭建五:事件的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  5. 嵌入式框架Zorb Framework搭建六:定时器的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  6. 嵌入式框架Zorb Framework搭建七:任务的实现

    我是卓波,我是一名嵌入式工程师,我万万没想到我会在这里跟大家吹牛皮. 嵌入式框架Zorb Framework搭建过程 嵌入式框架Zorb Framework搭建一:嵌入式环境搭建.调试输出和建立时间系 ...

  7. Zend Framework学习日记(1)--环境搭建篇(转)

    Zend Framework学习日记(1)--环境搭建篇 (1)开发工具 Zend Framework框架:http://framework.zend.com/download/latest 包含2个 ...

  8. SSH环境搭建之Hibernate环境搭建篇

    SSH环境搭建之Hibernate环境搭建篇 搭建有两种方式: 1.使用IntelliJ IDEA或者MyEclipse的逆向工程(关系模型 -> 对象模型),我使用的是IntelliJ IDE ...

  9. SSH环境搭建之Spring环境搭建篇

    SSH环境搭建之Spring环境搭建篇 一.引入Spring所使用的JAR文件 二.在src目录下创建beans.xml(Spring的容器文件) <?xml version="1.0 ...

随机推荐

  1. RabbitMq ack 与 nack

    1.ack 移除 2.nack 移除再次发送队列

  2. IE 浏览器中英文切换

    Oracle相关产品浏览器中可以调节显示中英文

  3. 475. Heaters (start binary search, appplication for binary search)

    Winter is coming! Your first job during the contest is to design a standard heater with fixed warm r ...

  4. NET平台微服务

    .NET平台微服务项目汇集   最近博客园出现了一篇文章<微服务时代之2017年五军之战:Net PHP谁先死>,掀起了一波撕逼,作者只是从一个使用者的角度来指点江山,这个姿势是不对的.. ...

  5. 轮播图3D效果--roundabout(兼容IE8)升级版

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. hdu 6216 A Cubic number and A Cubic Number【数学题】

    hdu 6216 A Cubic number and A Cubic Number[数学] 题意:判断一个素数是否是两个立方数之差,就是验差分.. 题解:只有相邻两立方数之差才可能,,因为x^3-y ...

  7. CALayer & bitmap Content

    Working with High-Resolution Images Layers do not have any inherent knowledge of the resolution of t ...

  8. BZOJ3312:[USACO]No Change(状压DP)

    Description Farmer John is at the market to purchase supplies for his farm. He has in his pocket K c ...

  9. Codeforces Round #538 (Div. 2) D. Flood Fill 【区间dp || LPS (最长回文序列)】

    任意门:http://codeforces.com/contest/1114/problem/D D. Flood Fill time limit per test 2 seconds memory ...

  10. 浅谈DB2的四个隔离级别

    隔离级别定义用于控制并发事务的行为,它决定在访问数据时数据是如何锁定的.如何与其他进程隔离的. 包括四个级别,级别从高到低: RR(可重复读取) RS(读取稳定性) CS(游标稳定性) UR(未提交的 ...