定时器的兑现,嵌入式框架Zorb

By admin in 4858.com on 2019年3月27日

自作者是卓波,笔者是一名嵌入式工程师,笔者相对没悟出笔者会在此处跟我们夸口皮。

自家是卓波,我是一名嵌入式工程师,小编相对没悟出作者会在此处跟大家吹牛皮。

小编是卓波,作者是一名嵌入式工程师,作者相对没悟出作者会在此间跟我们吹捧皮。

自己是卓波,笔者是一名嵌入式工程师,作者相对没悟出作者会在此间跟大家吹嘘皮。

嵌入式框架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。嵌入式框架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搭建七:职分的兑现

 

一、前言

  在这一篇中,大家将为Zorb
Framework提供环形缓冲区的机能。环形缓冲区主要使用在字节数据流传输上,如串口、网口的收发都得以经过环形缓冲区进行缓存。例如小编要透过串口发送命令“LED
ON”来支配开发板的led灯亮起来,但开发板串口接受不是一遍把“LED
ON”同时吸收,而是一个字节3个字节地接过,由此须求使用缓冲区来缓存数据,然后解析器来分析缓冲区的数额。

 

一、前言

  此前,作者直接觉得C语言只是面向进程的言语,直到本人发觉它也得以用来创制对象。未来,小编即将用面向对象的商量来搭建贰个轻量级的嵌入式框架Zorb
Framework。搭建Zorb
Framework的目标是为在不能够运作Linux的芯片上急忙支付使用,不用反复造轮子。

  Zorb Framework的起首设计作用有

  壹 、时间类别机能zf_time

  ② 、环形缓冲区成效zf_buffer

  三 、列表效率zf_list

  四 、状态机成效zf_fsm

  五 、事件作用zf_event

  陆 、定时器成效zf_timer

  七 、职分功效zf_task

  前陆个效益,就足以实现纯事件驱动的次序,基本得以满意中型小型型嵌入式应用程序开发的急需。加上职分成效,是为了满意部分程序对实时性供给较高的急需。当然,也足以将前伍个功能裁剪出来,然后运转在存活的嵌入式系统方面,那样子也能够满意实时性的须要。

一、前言

  在嵌入式开发中,大家平时会用到定时器,大家得以用芯片的定时器外设,能够用基本的systick,也得以行使操作系统的定时器。本篇要规划的定时器类似与操作系统的定时器,是软件定时器。假若Zorb
Framework运营在操作系统上边,大能够不应用本篇的效应,直接利用操作系统自带的定时器。

 

一、前言

  在这一篇中,大家将为Zorb
Framework提供列表效用。列表是笔者最欢欣用的数据结构,没有之一。在只要提到到管理对象不止三个的时候,作者就会想到列表。前边将要设计的状态机、事件、定时器和职务等等都要求列表的支撑,能够说列表在一切框架之中是少不了的多个意义。

 

② 、环形缓冲区设计

  大家先来看望要落实的缓冲区长什么样子,提供什么样效果,那样便于我们陈设。

  起初要提供的成效如下:

  一 、要有能够缓存数据的空中

  ② 、能够知晓总空间的尺寸

  ③ 、能够领略已用空间的多少

  ④ 、能够压入数据

  五 、能够弹出多少

  陆 、作者也得以在不弹出多少的地方下,读到特定长度的数额

4858.com,  由此,开首设计的数据结构如下:

 1 /* 环形缓冲区数据结构 */
 2 typedef struct _RingBuffer
 3 {
 4     bool IsExternBuffer;  /* 是否外部缓冲区,是则销毁时不释放 */
 5     uint8_t *pBuf;        /* 缓冲区指针 */
 6     uint32_t Head;        /* 缓冲区头地址 */
 7     uint32_t Trail;       /* 缓冲区尾地址 */
 8     uint32_t Size;        /* 缓冲区大小 */
 9     uint32_t Count;       /* 数据字节数 */
10     
11     /* 缓冲器是否已满 */
12     bool (*IsFull)(struct _RingBuffer * const pRb);
13     
14     /* 缓冲器是否空 */
15     bool (*IsEmpty)(struct _RingBuffer * const pRb);
16     
17     /* 压入一个字节 */
18     bool (*SaveByte)(struct _RingBuffer * const pRb, uint8_t byte);
19     
20     /* 取出一个字节 */
21     bool (*GetByte)(struct _RingBuffer * const pRb, uint8_t *pByte);
22     
23     /* 读取缓冲器已使用字节个数 */
24     uint32_t (*GetCount)(struct _RingBuffer * const pRb);
25     
26     /* 读取n个字节(n超过最大数据数时全部读出) */
27     bool (*ReadBytes)(struct _RingBuffer * const pRb, uint8_t *pArray,
28         uint32_t n);
29     
30     /* 丢弃n个字节(n超过最大数据数时全部丢弃) */
31     bool (*DropBytes)(struct _RingBuffer * const pRb, uint32_t n);
32     
33     /* 清空缓冲器 */
34     bool (*Clear)(struct _RingBuffer * const pRb);
35     
36     /* 释放缓冲器(不释放外部创建的缓冲区) */
37     bool (*Dispose)(struct _RingBuffer * const pRb);
38 } RingBuffer;

  其实按实际须求,可能远不止上边提到的6种情况,例如笔者能够放弃特定数量的字节数据,也能够直接清空掉缓冲区数码,甚至能够设想提供动态缓冲区的效应,也便是说能够释放缓冲器自个儿。

  缓冲区已经筹划好了,具体落到实处请看附属类小部件代码或在文末的github地址拉框架源码。

 

贰 、嵌入式环境搭建

  选取STM32F429开发板作为硬件运转条件,硬件能源用到串口1和systick,在那之中串口1提供调节和测试打字与印刷功用,systick提供系统时间计数功效。

  4858.com 1

  关于硬件环境的搭建不多说,能够参考开发板提供的例程来搭建,板级起首化完毕了调节串口和systick的开头化。

 1 /****************************************************************************** 2  * 描述  :硬件环境初始化 3  * 参数  :无 4  * 返回  :无 5 ******************************************************************************/ 6 void BSP_init(void) 7 { 8     /* 嵌套向量中断控制器组选择 */ 9     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);10     11     /* 初始化调试串口 */12     Debug_USART_init();13     14     /* Systick初始化 */15     SystemTick_init();16 }17 18 /******************************************************************************19  * 描述  :硬件底层程序20  * 参数  :无21  * 返回  :无22 ******************************************************************************/23 void BSP_process(void)24 {25 26 }

贰 、定时器设计

  我们先来看看要促成的定时器提供什么样效果:

  初步要提供的作用如下:

  壹 、能够安装定时时间

  二 、能够安装定时器是单次依旧再一次运维

  三 、能够安装定时器处理函数

  四 、定时器函数能够一向运转还是推送异步事件

  伍 、能够打开和倒闭定时器

  因而,开端设计的数据结构如下: 

 1 /* 定时器处理程序 */
 2 typedef void (*ITimerProcess)(void);
 3 
 4 /* 定时器结构 */
 5 typedef struct _Timer
 6 {
 7     uint8_t Priority;               /* 事件优先级 */
 8     uint32_t Interval;              /* 时间间隔(ms) */
 9     uint32_t AlarmTime;             /* 定时到达时间 */
10     bool IsAutoReset;               /* 重复运行(默认开) */
11     bool IsRunning;                 /* 是否正在运行(默认关) */
12     /* 事件的处理者,事件将推送到处理者的队列 */
13     /* 不设置处理者则本地执行(挂载Timer_process的地方) */
14     EventHandler *pEventHandler;
15     /* 处理事件 */
16     ITimerProcess TimerProcess;
17     
18     /* 开始定时器 */
19     void (*Start)(struct _Timer * const pTimer);
20     
21     /* 关闭定时器 */
22     void (*Stop)(struct _Timer * const pTimer);
23     
24     /* 重新运行定时器 */
25     void (*Restart)(struct _Timer * const pTimer);
26     
27     /* 销毁定时器(释放空间) */
28     bool (*Dispose)(struct _Timer * const pTimer);
29 } Timer;

  事件和事件处理器已经规划好了,再把定时器的处理程序添加到系统滴答程序中即可:

 1 /******************************************************************************
 2  * 描述  :系统滴答程序(需挂在硬件的时间中断里边)
 3  * 参数  :无
 4  * 返回  :无
 5 ******************************************************************************/
 6 void ZF_timeTick (void)
 7 {
 8     /* 系统滴答计数 */
 9     ZF_tick++;
10     
11     /* 软件定时器程序 */
12     Timer_process();
13 }

  具体落到实处请看附属类小部件代码或在文末的github地址拉框架源码。

 

贰 、列表设计

  大家先来看看要落到实处的列表提供如何效力:

  开首要提供的法力如下:

  一 、能够在钦命地方增添多少

  贰 、能够在钦命地方删除数据

  3、能够领略列表数据的个数

  四 、可以清空列表

  ⑤ 、能够不自由数据,仅仅把多少移出列表

  陆 、能够根据数据获得它所在的目录

  由此,初步设计的数据结构如下: 

 1 /* 列表节点结构 */
 2 typedef struct _ListNode
 3 {
 4     bool IsExternData;          /* 是否外部数据,是则销毁时不释放 */
 5     uint8_t *pData;             /* 指向数据的指针 */
 6     uint32_t Size;              /* 数据的大小 */
 7     struct _ListNode *Next;     /* 指向下一个节点 */
 8 } ListNode;
 9 
10 /* 列表结构 */
11 typedef struct _List
12 {
13     ListNode *pRootNode;        /* 指向根节点数据 */
14     uint32_t Count;             /* 节点个数 */
15     
16     /* 在尾端增加节点 */
17     bool (*Add)(struct _List * const pList, ListNode *pNode);
18     
19     /* 删除节点(释放空间) */
20     bool (*Delete)(struct _List * const pList, ListNode *pNode);
21     
22     /* 移除节点(不释放空间) */
23     bool (*Remove)(struct _List * const pList, ListNode *pNode);
24     
25     /* 返回指定索引处的节点的指针 */
26     bool (*GetElementAt)(struct _List * const pList, uint32_t index,
27         ListNode **ppNode);
28     
29     /* 返回数据区指向data的节点的指针 */
30     bool (*GetElementByData)(struct _List * const pList, void *pdata,
31         ListNode **ppNode);
32     
33     /* 返回指定索引处的节点的数据缓冲区的指针 */
34     void *(*GetElementDataAt)(struct _List * const pList, uint32_t index);
35     
36     /* 返回节点的索引 */
37     bool (*GetElementIndex)(struct _List * const pList, ListNode *pNode,
38         uint32_t *pIndex);
39     
40     /* 在指定索引处增加节点 */
41     bool (*AddElementAt)(struct _List * const pList, uint32_t index,
42         ListNode *pNode);
43     
44     /* 在指定索引处删除节点(释放空间) */
45     bool (*DeleteElementAt)(struct _List * const pList, uint32_t index);
46     
47     /* 在指定索引处移除节点(不释放空间) */
48     bool (*RemoveElementAt)(struct _List * const pList, uint32_t index);
49     
50     /* 清空列表(释放空间) */
51     bool (*Clear)(struct _List * const pList);
52     
53     /* 释放列表(释放空间) */
54     bool (*Dispose)(struct _List * const pList);
55 } List;

  为了完毕动态列表,在列表中提供了2个Dispose的成效。

  列表已经筹划好了,具体贯彻请看附件代码或在文末的github地址拉框架源码。

 

叁 、环形缓冲区结果测试

  简单的测试代码如下:

 1 /**
 2   *****************************************************************************
 3   * @file    app_buffer.c
 4   * @author  Zorb
 5   * @version V1.0.0
 6   * @date    2018-06-28
 7   * @brief   环形缓冲区测试的实现
 8   *****************************************************************************
 9   * @history
10   *
11   * 1. Date:2018-06-28
12   *    Author:Zorb
13   *    Modification:建立文件
14   *
15   *****************************************************************************
16   */
17 
18 #include "app_buffer.h"
19 #include "zf_includes.h"
20 
21 /* 环形缓冲区指针 */
22 RingBuffer *rb;
23 
24 /******************************************************************************
25  * 描述  :任务初始化
26  * 参数  :无
27  * 返回  :无
28 ******************************************************************************/
29 void App_Buffer_init(void)
30 {
31     /* 创建500字节的缓冲区 */
32     RB_create(&rb, 500);
33 }
34 
35 /******************************************************************************
36  * 描述  :任务程序
37  * 参数  :无
38  * 返回  :无
39 ******************************************************************************/
40 void App_Buffer_process(void)
41 {
42     uint32_t i;
43     uint8_t buf[11];
44     uint8_t byte;
45     
46     ZF_DEBUG(LOG_D, "rb count before adding data is %d\r\n", rb->Count);
47     
48     /* 填充10个字节数据(0-9) */
49     for (i = 0; i < 10; i++)
50     {
51         rb->SaveByte(rb, i);
52     }
53     
54     ZF_DEBUG(LOG_D, "rb count after adding data is %d\r\n", rb->Count);
55     
56     /* 读出数据看是否正确 */
57     rb->ReadBytes(rb, buf, 10);
58     
59     ZF_DEBUG(LOG_D, "rb data is ");
60     
61     for (i = 0; i < 10; i++)
62     {
63         ZF_DEBUG(LOG_D, "%d ", buf[i]);
64     }
65     
66     ZF_DEBUG(LOG_D, "\r\n\r\n");
67     
68     /* 弹出数据 */
69     for (i = 0; i < 10; i++)
70     {
71         rb->GetByte(rb, &byte);
72         
73         ZF_DEBUG(LOG_D, "byte %d is %d\r\n", i, byte);
74         ZF_DEBUG(LOG_D, "rb count is %d\r\n", rb->Count);
75     }
76     
77     while(1);
78 }
79 
80 /******************************** END OF FILE ********************************/

  结果:

rb count before adding data is 0
rb count after adding data is 10
rb data is 0 1 2 3 4 5 6 7 8 9 

byte 0 is 0
rb count is 9
byte 1 is 1
rb count is 8
byte 2 is 2
rb count is 7
byte 3 is 3
rb count is 6
byte 4 is 4
rb count is 5
byte 5 is 5
rb count is 4
byte 6 is 6
rb count is 3
byte 7 is 7
rb count is 2
byte 8 is 8
rb count is 1
byte 9 is 9
rb count is 0

 

③ 、调节和测试输出

  开发3个程序,最开首也最要紧的是搭建调试的条件,大家运用串口1作为调剂输出,然后调节和测试音信分为三个阶段,后续上位机可以依照不一致等级实行高亮提醒:

 1 /** 2   ***************************************************************************** 3   * @file    zf_debug.h 4   * @author  Zorb 5   * @version V1.0.0 6   * @date    2018-06-28 7   * @brief   调试输出的头文件 8   ***************************************************************************** 9   * @history10   *11   * 1. Date:2018-06-2812   *    Author:Zorb13   *    Modification:建立文件14   *15   *****************************************************************************16   */17 18 #ifndef __ZF_DEBUG_H__19 #define __ZF_DEBUG_H__20 21 #ifdef __cplusplus22 extern "C" {23 #endif24 25 #include "stdio.h"26 #include "stdbool.h"27 28 #define LOG_D 0; /* 信息等级:正常 */29 #define LOG_W 1; /* 信息等级:告警 */30 #define LOG_E 2; /* 信息等级:错误 */31 32 #define _ZF_DEBUG             /* 定义调试功能 */33 #define ZF_DEBUG_ON true      /* 启用调试功能 */34 35 #ifdef _ZF_DEBUG36     #if ZF_DEBUG_ON37         #define ZF_DEBUG(rank, x...) do     \38         {                                   \39             char code[10] = "[rank=0]";     \40             code[6] = '0' + (char)rank;     \41             if (code[6] != '0')             \42             {                               \43                 printf("%s", code);         \44             }                               \45             printf;                      \46         } while(0)47     #else48         #define ZF_DEBUG(rank, x...)49     #endif /* ZF_DEBUG_ON */50 #endif /* _ZF_DEBUG */51 52 #ifdef __cplusplus53 }54 #endif55 56 #endif /* __ZF_DEBUG_H__ */57 58 /******************************** END OF FILE ********************************/

③ 、定时器结果测试

  简单的测试代码如下:

 1 /**
 2   *****************************************************************************
 3   * @file    app_timer.c
 4   * @author  Zorb
 5   * @version V1.0.0
 6   * @date    2018-06-28
 7   * @brief   定时器测试的实现
 8   *****************************************************************************
 9   * @history
10   *
11   * 1. Date:2018-06-28
12   *    Author:Zorb
13   *    Modification:建立文件
14   *
15   *****************************************************************************
16   */
17 
18 #include "app_timer.h"
19 #include "zf_includes.h"
20 
21 /* 事件处理器 */
22 static EventHandler *pEventHandler;
23 /* 定时器1 */
24 static Timer *pTimer1;
25 /* 定时器2 */
26 static Timer *pTimer2;
27 
28 /******************************************************************************
29  * 描述  :定时器程序1
30  * 参数  :void
31  * 返回  :无
32 ******************************************************************************/
33 void TimerProcess1(void)
34 {
35     ZF_DEBUG(LOG_D, "%dms:timer process 1 run\r\n", ZF_SYSTIME_MS());
36 }
37 
38 /******************************************************************************
39  * 描述  :定时器程序2
40  * 参数  :void
41  * 返回  :无
42 ******************************************************************************/
43 void TimerProcess2(void)
44 {
45     ZF_DEBUG(LOG_D, "%dms:timer process 2 run\r\n", ZF_SYSTIME_MS());
46 }
47 
48 /******************************************************************************
49  * 描述  :任务初始化
50  * 参数  :无
51  * 返回  :无
52 ******************************************************************************/
53 void App_Timer_init(void)
54 {
55     /* 初始化事件处理器 */
56     EventHandler_create(&pEventHandler);
57     
58     /* 创建定时器1 */
59     Timer_create(&pTimer1);
60     pTimer1->Priority = 1;
61     pTimer1->Interval = 500;
62     pTimer1->TimerProcess = TimerProcess1;
63     pTimer1->IsAutoReset = true;
64     pTimer1->pEventHandler = pEventHandler;
65     pTimer1->Start(pTimer1);
66     
67     /* 创建定时器2 */
68     Timer_create(&pTimer2);
69     pTimer2->Priority = 2;
70     pTimer2->Interval = 1000;
71     pTimer2->TimerProcess = TimerProcess2;
72     pTimer2->IsAutoReset = true;
73     pTimer2->pEventHandler = pEventHandler;
74     pTimer2->Start(pTimer2);
75 }
76 
77 /******************************************************************************
78  * 描述  :任务程序
79  * 参数  :无
80  * 返回  :无
81 ******************************************************************************/
82 void App_Timer_process(void)
83 {
84     while(1)
85     {
86         /* 执行事件 */
87         if (pEventHandler->GetEventCount(pEventHandler) > 0)
88         {
89             pEventHandler->Execute(pEventHandler);
90         }
91         else
92         {
93             /* 可在此实现低功耗 */
94         }
95     }
96 }
97 /******************************** END OF FILE ********************************/

  结果:

500ms:timer process 1 run
1000ms:timer process 1 run
1002ms:timer process 2 run
1500ms:timer process 1 run
2000ms:timer process 1 run
2002ms:timer process 2 run
2500ms:timer process 1 run
3000ms:timer process 1 run
3002ms:timer process 2 run
3500ms:timer process 1 run
4000ms:timer process 1 run
4002ms:timer process 2 run
4500ms:timer process 1 run
5000ms:timer process 1 run
5002ms:timer process 2 run

省略...

  在测试程序中,定时器1周期为500ms,定时器2周期为1000ms。至于定时器2程序先是次举办的时间为1002ms的原因:定时器1和定时器2同时在一千ms处响应,但定时器1 的先行级比定时器2的先行级高,因而事件处理器先处理完定时器1的事件再处理定时器2的风浪,而调试串口Porter率115200,定时器1程序把调节和测试数据发送完的时光大体2ms,因而定时器2的首先次执行时间为1002ms。

 

三 、列表结果测试

  不难的测试代码如下:

  1 /**
  2   *****************************************************************************
  3   * @file    app_list.c
  4   * @author  Zorb
  5   * @version V1.0.0
  6   * @date    2018-06-28
  7   * @brief   列表测试的实现
  8   *****************************************************************************
  9   * @history
 10   *
 11   * 1. Date:2018-06-28
 12   *    Author:Zorb
 13   *    Modification:建立文件
 14   *
 15   *****************************************************************************
 16   */
 17 
 18 #include "app_list.h"
 19 #include "zf_includes.h"
 20 #include "string.h"
 21 
 22 /* 列表指针 */
 23 List *pBookList;
 24 
 25 /* 书本数据结构 */
 26 typedef struct _Book
 27 {
 28     uint32_t Index; /* 索引 */
 29     char Name[10];  /* 书名 */
 30 } Book;
 31 
 32 /******************************************************************************
 33  * 描述  :任务初始化
 34  * 参数  :无
 35  * 返回  :无
 36 ******************************************************************************/
 37 void App_List_init(void)
 38 {
 39     /* 创建列表 */
 40     List_create(&pBookList);
 41 }
 42 
 43 /******************************************************************************
 44  * 描述  :任务程序
 45  * 参数  :无
 46  * 返回  :无
 47 ******************************************************************************/
 48 void App_List_process(void)
 49 {
 50     uint32_t i;
 51     ListNode *pNode;
 52     Book *pBook;
 53     
 54     ZF_DEBUG(LOG_D, "book list count before adding data is %d\r\n",
 55         pBookList->Count);
 56     
 57     /* 填充10个数据 */
 58     for (i = 0; i < 10; i++)
 59     {
 60         /* 创建节点 */
 61         List_mallocNode(&pNode, (void **)&pBook, sizeof(Book));
 62         
 63         /* 填充节点内容 */
 64         pBook->Index = i;
 65         strcpy(pBook->Name, "book x");
 66         pBook->Name[5] = '0' + i;
 67         
 68         /* 添加到列表 */
 69         pBookList->Add(pBookList, pNode);
 70     }
 71     
 72     ZF_DEBUG(LOG_D, "book list count after adding data is %d\r\n",
 73         pBookList->Count);
 74     
 75     /* 读出第3个数据看是否正确 */
 76     pBook = (Book *)pBookList->GetElementDataAt(pBookList, 2);
 77     
 78     ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index);
 79     ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name);
 80     
 81     ZF_DEBUG(LOG_D, "\r\n");
 82     
 83     /* 删除第5个数据 */
 84     pBookList->DeleteElementAt(pBookList, 4);
 85     
 86     ZF_DEBUG(LOG_D, "book list count after deleteing data is %d\r\n",
 87         pBookList->Count);
 88     
 89     /* 显示现有数据 */
 90     for (i = 0; i < pBookList->Count; i++)
 91     {
 92         pBook = (Book *)pBookList->GetElementDataAt(pBookList, i);
 93         
 94         ZF_DEBUG(LOG_D, "\r\n");
 95         ZF_DEBUG(LOG_D, "book index is %d\r\n", pBook->Index);
 96         ZF_DEBUG(LOG_D, "book name is %s\r\n", pBook->Name);
 97     }
 98     
 99     while(1);
100 }
101 
102 /******************************** END OF FILE ********************************/

  结果:

book list count before adding data is 0
book list count after adding data is 10
book index is 2
book name is book 2

book list count after deleteing data is 9

book index is 0
book name is book 0

book index is 1
book name is book 1

book index is 2
book name is book 2

book index is 3
book name is book 3

book index is 5
book name is book 5

book index is 6
book name is book 6

book index is 7
book name is book 7

book index is 8
book name is book 8

book index is 9
book name is book 9

 

四、最后

  本篇为Zorb
Framework提供了环形缓冲区功用,只要涉及到字节流通讯,基本都亟需缓冲区来贯彻,可以说利用效用比较高。今后造了这一个轮子,后面就足以从来造跑车了。

 

  Zorb Framework
github:

  版权全体,转发请打赏哟

 

假诺您喜爱笔者的篇章,能够透过微信扫一扫给自家打赏哟

4858.com 2

四 、实现断言

  在支付进度中,在事关心体贴大地点开始展览局地预知,能够一本万利定位bug。

 1 /** 2   ***************************************************************************** 3   * @file    zf_assert.h 4   * @author  Zorb 5   * @version V1.0.0 6   * @date    2018-06-28 7   * @brief   断言的头文件 8   ***************************************************************************** 9   * @history10   *11   * 1. Date:2018-06-2812   *    Author:Zorb13   *    Modification:建立文件14   *15   *****************************************************************************16   */17 18 #ifndef __ZF_ASSERT_H__19 #define __ZF_ASSERT_H__20 21 #ifdef __cplusplus22 extern "C" {23 #endif24 25 #include "stdint.h"26 27 #define _ZF_ASSERT              /* 定义断言功能 */28 #define ZF_ASSERT_ON true       /* 启用断言功能 */29 30 #ifdef _ZF_ASSERT31     #if ZF_ASSERT_ON32          #define ZF_ASSERT(expression_) ((expression_) ?\33             (void)0 : ZF_assertHandle((uint8_t *)__FILE__, (int)__LINE__));34     #else35          #define ZF_ASSERT(expression_)36     #endif /* ZF_ASSERT_ON */37 #endif /* _ZF_ASSERT */38 39 /* 断言产生时的处理 */40 void ZF_assertHandle(uint8_t *pFileName, int line);41 42 #ifdef __cplusplus43 }44 #endif45 46 #endif /* __ZF_ASSERT_H__ */47 48 /******************************** END OF FILE ********************************/

  断言的处理非常粗略,就是报告大家在哪个文件哪一行出错就足以,达成如下

 1 /** 2   ***************************************************************************** 3   * @file    zf_assert.c 4   * @author  Zorb 5   * @version V1.0.0 6   * @date    2018-06-28 7   * @brief   断言的实现 8   ***************************************************************************** 9   * @history10   *11   * 1. Date:2018-06-2812   *    Author:Zorb13   *    Modification:建立文件14   *15   *****************************************************************************16   */17 18 #include "zf_assert.h"19 #include "zf_debug.h"20 21 /******************************************************************************22  * 描述  :断言产生时的处理23  * 参数  :-pFileName 文件名24  *         -line 行数25  * 返回  :无26 ******************************************************************************/27 void ZF_assertHandle(uint8_t *pFileName, int line)28 {29     ZF_DEBUG(LOG_E, "file:%s line:%d:asserted\r\n", pFileName, line);30     31     while (1);32 }33 34 /******************************** END OF FILE ********************************/

四、最后

  本篇为Zorb
Framework提供了定时器作用。在对定时精度供给不高(微秒级),完全能够选用软件定时器。软件定时器是在硬件定时器的基本功上支付的,好处在于能够挂载七个定时器,不用再为芯片的定时器财富不够而抑郁。

 

  Zorb Framework
github:

  版权全部,转发请打赏哟

 

比方您欣赏小编的文章,能够通过微信扫一扫给自个儿打赏哟

4858.com 3

四、最后

  本篇为Zorb
Framework提供了列表作用,而且这些列表能够装载差别品种的多寡。能够说是小成效,大效益。

 

  Zorb Framework
github:

  版权全数,转发请打赏哟

 

借使你欢娱自个儿的作品,能够因而微信扫一扫给小编打赏哟

4858.com 4

五 、建立刻间连串

  为了减弱框架对能源的费用,所以开始设定框架的微时辰间周期为1ms,由此大家要求设置systick的定时周期为1ms,然后每一遍进入暂停为大家的框架计数即可。

 1 /****************************************************************************** 2  * 描述  :SysTick中断服务程序 3  * 参数  :无 4  * 返回  :无 5 ******************************************************************************/ 6 void SysTick_Handler(void) 7 { 8     /* 为zorb framework提供计时 */ 9     ZF_timeTick();10 }

  以往时光种类提供的意义相比较基础,唯有系统滴答计数和系统死等待延时,后边大家开发定时器功用和天职成效的时候会再一次扩充时间体系。

 1 /** 2   ***************************************************************************** 3   * @file    zf_time.h 4   * @author  Zorb 5   * @version V1.0.0 6   * @date    2018-06-28 7   * @brief   系统时间的头文件 8   ***************************************************************************** 9   * @history10   *11   * 1. Date:2018-06-2812   *    Author:Zorb13   *    Modification:建立文件14   *15   *****************************************************************************16   */17 18 #ifndef __ZF_TIME_H__19 #define __ZF_TIME_H__20 21 #ifdef __cplusplus22 extern "C" {23 #endif24 25 #include "stdbool.h"26 #include "stdint.h"27 28 /* 系统滴答周期 */29 #define ZF_TICK_PERIOD 130 31 /* 获取系统滴答数 */32 #define ZF_SYSTICK() ZF_getSystemTick()33 34 /* 获取系统时间 */35 #define ZF_SYSTIME_MS() ZF_getSystemTimeMS()36 37 /* 系统延时 */38 #define ZF_DELAY_MS do                            \39 {                                                      \40     if (ms_ % ZF_TICK_PERIOD)                          \41     {                                                  \42         ZF_delayTick((ms_ / ZF_TICK_PERIOD) + 1);      \43     }                                                  \44     else                                               \45     {                                                  \46         ZF_delayTick(ms_ / ZF_TICK_PERIOD);            \47     }                                                  \48 } while(0)49 50 /* 获取系统滴答数 */51 uint32_t ZF_getSystemTick(void);52 53 /* 获取系统时间 */54 uint32_t ZF_getSystemTimeMS(void);55 56 /* 系统延时 */57 void ZF_delayTick(uint32_t tick);58 59 /* 系统滴答程序(需挂在硬件的时间中断里边) */60 void ZF_timeTick (void);61 62 #ifdef __cplusplus63 }64 #endif65 66 #endif /* __ZF_TIME_H__ */67 68 /******************************** END OF FILE ********************************/

 1 /** 2   ***************************************************************************** 3   * @file    zf_time.c 4   * @author  Zorb 5   * @version V1.0.0 6   * @date    2018-06-28 7   * @brief   系统时间的实现 8   ***************************************************************************** 9   * @history10   *11   * 1. Date:2018-06-2812   *    Author:Zorb13   *    Modification:建立文件14   *15   *****************************************************************************16   */17 18 #include "zf_time.h"19 20 /* 系统滴答数 */21 uint32_t ZF_tick = 0;22 23 /******************************************************************************24  * 描述  :获取系统滴答数25  * 参数  :无26  * 返回  :系统滴答数27 ******************************************************************************/28 uint32_t ZF_getSystemTick(void)29 {30     return ZF_tick;31 }32 33 /******************************************************************************34  * 描述  :获取系统时间35  * 参数  :无36  * 返回  :系统时间37 ******************************************************************************/38 uint32_t ZF_getSystemTimeMS(void)39 {40     return ZF_tick * ZF_TICK_PERIOD;41 }42 43 /******************************************************************************44  * 描述  :系统延时45  * 参数  :-tick   需要延时的系统周期数46  * 返回  :无47 ******************************************************************************/48 void ZF_delayTick(uint32_t tick)49 {50     uint32_t startTick = ZF_getSystemTick();51     while((ZF_getSystemTick() - startTick) < tick);52 }53 54 /******************************************************************************55  * 描述  :系统滴答程序(需挂在硬件的时间中断里边)56  * 参数  :无57  * 返回  :无58 ******************************************************************************/59 void ZF_timeTick (void)60 {61     /* 系统滴答计数 */62     ZF_tick++;63 }64 65 /******************************** END OF FILE ********************************/

六、最后

  本篇达成的职能相比较基础,不过全体框架开发的基本功,前面全部扩张的作用都急需在此条件下展费用付。搭建杰出的调剂输出环境,能够帮大家快速稳定bug的四方,从而进步费用功用。

  本文工程代码:1-Zorb_Framework嵌入式环境搭建.rar

  Zorb Framework github:

  版权全体,转发请打赏哟

假定你欢娱本身的稿子,能够由此微信扫一扫给作者打赏哟

4858.com 5

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有