【美高梅开户网址】定时器的兑现,嵌入式框架Zorb

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

本人是卓波,笔者是一名嵌入式工程师,小编相对没悟出笔者会在那边跟我们吹捧皮。

自个儿是卓波,笔者是一名嵌入式工程师,笔者相对没悟出作者会在那边跟大家吹捧皮。

本身是卓波,笔者是一名嵌入式工程师,笔者相对没悟出小编会在那边跟我们吹捧皮。

嵌入式框架Zorb Framework搭建进度

嵌入式框架Zorb
Framework搭建1:嵌入式环境搭建、调试输出和确马上间种类

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

嵌入式框架Zorb
Framework搭建3:列表的达成

嵌入式框架Zorb
Framework搭建4:状态机的落到实处

嵌入式框架Zorb
Framework搭建伍:事件的贯彻

嵌入式框架Zorb
Framework搭建六:定时器的完成

嵌入式框架Zorb
Framework搭建柒:职分的贯彻

 

嵌入式框架Zorb Framework搭建进程

嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调节和测试输出和建登时间系列

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

嵌入式框架Zorb Framework搭建叁:列表的兑现

嵌入式框架Zorb Framework搭建肆:状态机的达成

【美高梅开户网址】定时器的兑现,嵌入式框架Zorb。嵌入式框架Zorb Framework搭建伍:事件的贯彻

嵌入式框架Zorb Framework搭建陆:定时器的兑现

嵌入式框架Zorb Framework搭建7:任务的落到实处

嵌入式框架Zorb Framework搭建进度

嵌入式框架Zorb
Framework搭建1:嵌入式环境搭建、调节和测试输出和建立刻间连串

美高梅开户网址 ,嵌入式框架Zorb
Framework搭建二:环形缓冲区的落到实处

嵌入式框架Zorb
Framework搭建三:列表的贯彻

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

嵌入式框架Zorb
Framework搭建伍:事件的贯彻

嵌入式框架Zorb
Framework搭建陆:定时器的兑现

嵌入式框架Zorb
Framework搭建7:职分的落到实处

 

嵌入式框架Zorb Framework搭建进程

嵌入式框架Zorb
Framework搭建1:嵌入式环境搭建、调节和测试输出和建立刻间体系

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

嵌入式框架Zorb
Framework搭建三:列表的贯彻

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

嵌入式框架Zorb
Framework搭建5:事件的落到实处

嵌入式框架Zorb
Framework搭建6:定时器的兑现

嵌入式框架Zorb
Framework搭建7:职责的达成

 

一、前言

  在那1篇中,我们将为Zorb
Framework提供环形缓冲区的效应。环形缓冲区首要选择在字节数据流传输上,如串口、网口的收发都能够经过环形缓冲区实行缓存。例如小编要经过串口发送命令“LED
ON”来控制开发板的led灯亮起来,但开发板串口接受不是3次把“LED
ON”同时吸收,而是一个字节3个字节地接过,因而要求选取缓冲区来缓存数据,然后解析器来分析缓冲区的数额。

 

一、前言

  此前,笔者直接以为C语言只是面向进程的言语,直到本身意识它也足以用来创制对象。以往,我即将用面向对象的构思来搭建一个轻量级的嵌入式框架Zorb
Framework。搭建Zorb
Framework的指标是为在不能够运作Linux的芯片上十分的快支付使用,不用反复造轮子。

  Zorb Framework的初叶设计作用有

  一、时间体系机能zf_time

  二、环形缓冲区作用zf_buffer

  叁、列表作用zf_list

  肆、状态机作用zf_fsm

  伍、事件作用zf_event

  6、定时器功效zf_timer

  柒、职分作用zf_task

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

一、前言

  在嵌入式开发中,大家经常会用到定时器,大家得以用芯片的定时器外设,能够用基本的systick,也得以应用操作系统的定时器。本篇要设计的定时器类似与操作系统的定时器,是软件定时器。即便Zorb
Framework运转在操作系统上边,大能够不应用本篇的效率,直接选择操作系统自带的定时器。

 

一、前言

  在这一篇中,大家将为Zorb
Framework提供列表功用。列表是自己最欢愉用的数据结构,未有之1。在只要提到到管理对象不止1个的时候,作者就会想到列表。前边将要设计的状态机、事件、定时器和天职等等都需求列表的帮忙,能够说列表在全方位框架之中是不可缺少的2个效应。

 

2、环形缓冲区设计

  大家先来看看要落到实处的缓冲村长什么样子,提供什么意义,那样有利于我们规划。

  发轫要提供的效益如下:

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

  二、能够清楚总空间的尺寸

  三、能够知晓已用空间的数量

  四、能够压入数据

  伍、能够弹出多少

  六、作者也能够在不弹出多少的景况下,读到特定长度的数目

  由此,起头设计的数据结构如下:

 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;

  其实按实际上供给,大概远不止下面提到的各样情景,例如小编能够丢弃特定数量的字节数据,也得以一直清空掉缓冲区数量,甚至可以设想提供动态缓冲区的效率,也正是说能够自由缓冲器自身。

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

 

贰、嵌入式环境搭建

  采纳STM3二F42玖开发板作为硬件运转环境,硬件财富用到串口1和systick,个中串口一提供调节和测试打字与印刷作用,systick提供系统时间计数功效。

  美高梅开户网址 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 }

2、定时器设计

  大家先来探望要达成的定时器提供怎么着效力:

  初叶要提供的机能如下:

  壹、能够设置定时时间

  二、能够设置定时器是单次照旧再次运维

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

  四、定时器函数能够直接运营照旧推送异步事件

  5、能够打开和关闭定时器

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

 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地址拉框架源码。

 

二、列表设计

  我们先来看望要促成的列表提供哪些坚守:

  初始要提供的效益如下:

  壹、能够在钦点地点扩张多少

  二、能够在钦点地点删除数据

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

  4、能够清空驶列车表

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

  6、能够依照数量获得它所在的目录

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

 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;

  为了兑现动态列表,在列表中提供了1个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

 

三、调节和测试输出

  开发三个先后,最开端也最关键的是搭建调节和测试的条件,大家选取串口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。至于定时器二程序率先次执行的时光为1002ms的因由:定时器一和定时器二同时在一千ms处响应,但定时器1 的事先级比定时器2的事先级高,因而事件处理器先处理完定时器一的轩然大波再处理定时器二的事件,而调节和测试串口Porter率115200,定时器一程序把调节和测试数据发送完的小时差不离二ms,由此定时器二的第壹遍施行时间为拾0二ms。

 

三、列表结果测试

  简单的测试代码如下:

  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:

  版权全部,转发请打赏哟

 

若果你喜悦自身的篇章,能够由此微信扫1扫给本身打赏哟

美高梅开户网址 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:

  版权全体,转发请打赏哟

 

假定你喜欢本人的稿子,能够经过微信扫1扫给本身打赏哟

美高梅开户网址 3

四、最后

  本篇为Zorb
Framework提供了列表功用,而且以此列表能够装载分裂门类的多少。能够说是小功能,大成效。

 

  Zorb Framework
github:

  版权全体,转发请打赏哟

 

如果您欣赏本身的稿子,能够通过微信扫①扫给自身打赏哟

美高梅开户网址 4

5、建马上间种类

  为了减小框架对财富的费用,所以最先设定框架的细微时间周期为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的四面八方,从而提升开销效用。

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

  Zorb Framework github:

  版权全体,转发请打赏哟

若是你喜欢作者的小说,能够经过微信扫1扫给本人打赏哟

美高梅开户网址 5

发表评论

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

网站地图xml地图