威尼斯人线上娱乐

环形缓冲区的落到实处,嵌入式框架Zorb

11 4月 , 2019  

自己是卓波,我是一名嵌入式工程师,作者相对没悟出笔者会在那里跟大家夸口皮。

自身是卓波,小编是一名嵌入式工程师,作者相对没悟出笔者会在这里跟大家说大话皮。

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

本身是卓波,小编是一名嵌入式工程师,笔者相对没悟出作者会在此处跟我们说大话皮。

嵌入式框架Zorb Framework搭建进程

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

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

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

环形缓冲区的落到实处,嵌入式框架Zorb。嵌入式框架Zorb
Framework搭建四:状态机的达成

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

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

嵌入式框架Zorb
Framework搭建柒:任务的落实

 

嵌入式框架Zorb Framework搭建进程

嵌入式框架Zorb Framework搭建一:嵌入式环境搭建、调节和测试输出和创造即间连串

嵌入式框架Zorb Framework搭建2:环形缓冲区的完成

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

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

嵌入式框架Zorb Framework搭建伍:事件的落实

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

嵌入式框架Zorb Framework搭建7:职务的完结

嵌入式框架Zorb Framework搭建进度

嵌入式框架Zorb
Framework搭建一:嵌入式环境搭建、调节和测试输出和成马上间种类

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

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

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

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

嵌入式框架Zorb
Framework搭建6:定时器的贯彻

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

 

嵌入式框架Zorb Framework搭建进度

嵌入式框架Zorb
Framework搭建壹:嵌入式环境搭建、调节和测试输出和成马上间连串

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

嵌入式框架Zorb
Framework搭建3:列表的落实

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

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

嵌入式框架Zorb
Framework搭建6:定时器的贯彻

嵌入式框架Zorb
Framework搭建7:任务的完成

 

一、前言

  在那1篇中,大家将为Zorb
Framework提供环形缓冲区的功用。环形缓冲区重要利用在字节数据流传输上,如串口、网口的收发都足以通过环形缓冲区举行缓存。例如小编要经过串口发送命令“LED
ON”来决定开发板的led灯亮起来,但开发板串口接受不是1回把“LED
ON”同时接收,而是2个字节七个字节地收取,因而必要利用缓冲区来缓存数据,然后解析器来分析缓冲区的多少。

 

一、前言

  此前,小编直接觉得C语言只是面向进度的言语,直到小编发觉它也得以用来创设对象。今后,我就要用面向对象的思量来搭建五个轻量级的嵌入式框架Zorb
Framework。搭建Zorb
Framework的指标是为在不能够运作Linux的芯片上高速支付应用,不用反复造轮子。

  Zorb Framework的早先设计功能有

  壹、时间类别机能zf_time

  二、环形缓冲区功效zf_buffer

  3、列表功效zf_list

  四、状态机作用zf_fsm

  5、事件成效zf_event

  6、定时器功用zf_timer

  柒、职务功效zf_task

  前陆个职能,就能够完成纯事件驱动的先后,基本得以满足中小型嵌入式应用程序开发的必要。加上职分成效,是为着满意部分程序对实时性须求较高的须求。当然,也足以将前陆个职能裁剪出来,然后运营在现有的嵌入式系统方面,那样子也得以满意实时性的需求。

一、前言

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

 

一、前言

  在那1篇中,我们将为Zorb
Framework提供列表功用。列表是自身最欢快用的数据结构,未有之一。在只要提到到管理对象不止叁个的时候,小编就会想到列表。前边将要设计的状态机、事件、定时器和天职等等都亟需列表的帮忙,能够说列表在一切框架之中是不能缺少的3个效果。

 

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玖开发板作为硬件运营条件,硬件财富用到串口一和systick,当中串口1提供调节和测试打字与印刷作用,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 }

贰、定时器设计

  我们先来看望要促成的定时器提供什么服从:

  初阶要提供的职能如下:

威尼斯人线上娱乐,  一、能够安装定时时间

  二、能够安装定时器是单次仍旧重国民党的新生活运动行

  三、可以安装定时器处理函数

  四、定时器函数能够一向运维依然推送异步事件

  五、可以打开和倒闭定时器

  由此,早先设计的数据结构如下: 

 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、能够清空列表

  5、能够不自由数据,仅仅把数据移出列表

  六、可以依据数量得到它所在的目录

  由此,伊始设计的数据结构如下: 

 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;

  为了促成动态列表,在列表中提供了3个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 /** 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 ********************************/

3、定时器结果测试

  不难的测试代码如下:

 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周期为一千ms。至于定时器2程序首先次实践的时刻为100二ms的缘故:定时器一和定时器贰同时在一千ms处响应,但定时器1 的预先级比定时器贰的先期级高,由此事件处理器先处理完定时器一的事件再处理定时器2的事件,而调节和测试串口Porter率115200,定时器一程序把调节和测试数据发送完的年华大体贰ms,由此定时器二的第3遍实践时间为100二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:

  版权全体,转发请打赏哟

 

借使你欢欣本身的篇章,能够透过微信扫壹扫给笔者打赏哟

威尼斯人线上娱乐 3

四、最后

  本篇为Zorb
Framework提供了列表功效,而且以此列表能够装载差异品种的多寡。能够说是小成效,大效劳。

 

  Zorb Framework
github:

  版权全数,转发请打赏哟

 

只要您喜爱作者的小说,能够经过微信扫1扫给本人打赏哟

威尼斯人线上娱乐 4

伍、建马上间类别

  为了减弱框架对财富的消耗,所以早先设定框架的微乎其微时间周期为一ms,因而大家要求安装systick的定时周期为一ms,然后每回进入暂停为大家的框架计数即可。

 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:

  版权全数,转发请打赏哟

如果你喜欢自个儿的小说,能够经过微信扫壹扫给自家打赏哟

威尼斯人线上娱乐 5


相关文章

发表评论

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

网站地图xml地图