|
@@ -1,7 +1,7 @@
|
|
|
/************************************/
|
|
|
/* @Author: @woshiashuai */
|
|
|
/* @Version: V1.0 */
|
|
|
-/* @Date: 2023-02-12 13:06:48 */
|
|
|
+/* @Date: 2023-02-13 10:49:00 */
|
|
|
/* @Description: */
|
|
|
/* V1.0: create */
|
|
|
/************************************/
|
|
@@ -10,7 +10,8 @@
|
|
|
TSS_t *TSS_head = NULL; // 分时调度系统工作链表头节点
|
|
|
|
|
|
/**
|
|
|
- * @brief 分时调度事件初始化 加入到初始化中
|
|
|
+ * @brief 分时调度事件初始化
|
|
|
+ * @note 加入到初始化中
|
|
|
* @param TSS: 事件指针
|
|
|
* @param targetTicks: 目标计数值 = 事件调度周期 / 调度器周期 例如: 100 = 500ms / 5ms
|
|
|
* @param callback: 事件回调函数
|
|
@@ -23,33 +24,25 @@ unsigned char TSS_init(TSS_t *TSS, unsigned int targetTicks, void (* callback)(v
|
|
|
memset(TSS, 0, sizeof(TSS_t));
|
|
|
TSS->targetTicks = targetTicks;
|
|
|
TSS->callback = callback;
|
|
|
-
|
|
|
- TSS_t *TSS_target = TSS_head;
|
|
|
- while(TSS_target) {
|
|
|
- if(TSS_target == TSS) return 3;
|
|
|
- TSS_target = TSS_target->next;
|
|
|
- }
|
|
|
- TSS->state = 1; // 加入工作链表则改变状态为在工作链表
|
|
|
- TSS->next = TSS_head;
|
|
|
- TSS_head = TSS;
|
|
|
return 0;
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件循环处理的内部方法
|
|
|
+ * @brief 分时调度事件执行(循环)处理的内部方法
|
|
|
+ * @note None
|
|
|
* @param TSS: 事件指针
|
|
|
* @retval None
|
|
|
*/
|
|
|
static void TSS_whileHandle(TSS_t *TSS)
|
|
|
{
|
|
|
- // 分时调度结果是可执行
|
|
|
- if(TSS->result) {
|
|
|
- TSS->callback(); // 执行绑定的回调函数
|
|
|
- TSS->ticks = 0; // 防止因手动切换状态导致的ticks不为0
|
|
|
- TSS->result = 0; // 切换分时调度结果为等待中
|
|
|
- }
|
|
|
+ // 分时调度结果是等待中或跳过调度则退出
|
|
|
+ if(!TSS->result || TSS->skip) return ;
|
|
|
+ TSS->callback(); // 执行绑定的回调函数
|
|
|
+ TSS->ticks = 0; // 防止因手动切换状态导致的ticks不为0
|
|
|
+ TSS->result = 0; // 切换分时调度结果为等待中
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件循环处理 加入到主循环中
|
|
|
+ * @brief 分时调度事件执行(循环)处理
|
|
|
+ * @note 加入到主循环中
|
|
|
* @param None
|
|
|
* @retval None
|
|
|
*/
|
|
@@ -62,23 +55,24 @@ void TSS_while(void)
|
|
|
}
|
|
|
/**
|
|
|
* @brief 分时调度事件调度处理的内部方法
|
|
|
+ * @note None
|
|
|
* @param TSS: 事件指针
|
|
|
* @retval None
|
|
|
*/
|
|
|
static void TSS_timerHandle(TSS_t *TSS)
|
|
|
{
|
|
|
- // 分时调度结果是等待中
|
|
|
- if(!TSS->result) {
|
|
|
- TSS->ticks += 1; // 计数自加
|
|
|
- // 计数大于等于目标计数
|
|
|
- if(TSS->ticks >= TSS->targetTicks) {
|
|
|
- TSS->ticks = 0; // 计数清零
|
|
|
- TSS->result = 1; // 切换分时调度结果为可执行
|
|
|
- }
|
|
|
- }
|
|
|
+ // 分时调度结果是可执行或跳过调度则退出
|
|
|
+ if(TSS->result || TSS->skip) return ;
|
|
|
+ TSS->ticks += 1; // 计数自加
|
|
|
+ // 计数大于等于目标计数
|
|
|
+ if(TSS->ticks >= TSS->targetTicks) {
|
|
|
+ TSS->ticks = 0; // 计数清零
|
|
|
+ TSS->result = 1; // 切换分时调度结果为可执行
|
|
|
+ }
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件调度处理 加入到调度器中
|
|
|
+ * @brief 分时调度事件调度处理
|
|
|
+ * @note 加入到调度器中
|
|
|
* @param None
|
|
|
* @retval None
|
|
|
*/
|
|
@@ -92,13 +86,14 @@ void TSS_timer(void)
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * @brief 分时调度事件挂起处理 将事件从工作链表中去掉
|
|
|
+ * @brief 分时调度事件挂起处理
|
|
|
+ * @note 主要用于将事件从工作链表中取下
|
|
|
* @param TSS: 事件指针
|
|
|
* @retval 0: 挂起成功 1: 事件未初始化/初始化失败 2: 事件不在工作链表中(可能已被挂起)
|
|
|
*/
|
|
|
unsigned char TSS_pending(TSS_t *TSS)
|
|
|
{
|
|
|
- if((TSS->targetTicks == 0) || (TSS->callback == NULL) || (TSS->next == NULL)) return 1;
|
|
|
+ if((TSS->targetTicks == 0) || (TSS->callback == NULL)) return 1;
|
|
|
TSS_t *TSS_target = TSS_head;
|
|
|
TSS_t *TSS_last = NULL;
|
|
|
while(TSS_target) {
|
|
@@ -121,13 +116,14 @@ unsigned char TSS_pending(TSS_t *TSS)
|
|
|
return 2;
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件恢复处理
|
|
|
+ * @brief 分时调度事件启动处理
|
|
|
+ * @note 主要用于将事件加入到工作链表中
|
|
|
* @param TSS: 事件指针
|
|
|
- * @retval 0: 恢复成功 1: 事件未初始化/初始化失败 2: 事件已在工作链表中(可能已被恢复)
|
|
|
+ * @retval 0: 启动成功 1: 事件未初始化/初始化失败 2: 事件已在工作链表中(可能已被恢复)
|
|
|
*/
|
|
|
-unsigned char TSS_resume(TSS_t *TSS)
|
|
|
+unsigned char TSS_start(TSS_t *TSS)
|
|
|
{
|
|
|
- if((TSS->targetTicks == 0) || (TSS->callback == NULL) || (TSS->next == NULL)) return 1;
|
|
|
+ if((TSS->targetTicks == 0) || (TSS->callback == NULL)) return 1;
|
|
|
TSS_t *TSS_target = TSS_head;
|
|
|
while(TSS_target) {
|
|
|
if(TSS_target == TSS) return 2;
|
|
@@ -142,6 +138,7 @@ unsigned char TSS_resume(TSS_t *TSS)
|
|
|
|
|
|
/**
|
|
|
* @brief 分时调度事件设置计数值处理
|
|
|
+ * @note None
|
|
|
* @param TSS: 事件指针
|
|
|
* @param ticks: 设置的计数值
|
|
|
* @retval None
|
|
@@ -152,6 +149,7 @@ void TSS_setTicks(TSS_t *TSS, unsigned char ticks)
|
|
|
}
|
|
|
/**
|
|
|
* @brief 分时调度事件获取计数值处理
|
|
|
+ * @note None
|
|
|
* @param TSS: 事件指针
|
|
|
* @retval 事件计数值
|
|
|
*/
|
|
@@ -160,7 +158,8 @@ unsigned int TSS_getTicks(TSS_t *TSS)
|
|
|
return TSS->ticks;
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件设置目标计数值处理 主要用于修改事件执行周期,若较上次改小则可能立即触发事件执行
|
|
|
+ * @brief 分时调度事件设置目标计数值处理
|
|
|
+ * @note 主要用于修改事件执行周期,若较上次改小则可能立即触发事件执行
|
|
|
* @param TSS: 事件指针
|
|
|
* @param result: 设置的目标计数值
|
|
|
* @retval None
|
|
@@ -170,7 +169,8 @@ void TSS_setTargetTicks(TSS_t *TSS, unsigned char targetTicks)
|
|
|
TSS->targetTicks = targetTicks;
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件获取目标计数值处理 主要用于查看事件执行周期
|
|
|
+ * @brief 分时调度事件获取目标计数值处理
|
|
|
+ * @note 主要用于查看事件执行周期
|
|
|
* @param TSS: 事件指针
|
|
|
* @retval 事件目标计数值
|
|
|
*/
|
|
@@ -179,7 +179,8 @@ unsigned int TSS_TargetTicks(TSS_t *TSS)
|
|
|
return TSS->targetTicks;
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件设置结果值处理 主要用于立即切换事件结果为1:可执行
|
|
|
+ * @brief 分时调度事件设置结果值处理
|
|
|
+ * @note 主要用于立即切换事件结果为1:可执行
|
|
|
* @param TSS: 事件指针
|
|
|
* @param result: 设置的结果值
|
|
|
* @retval None
|
|
@@ -189,7 +190,8 @@ void TSS_setResult(TSS_t *TSS, unsigned char result)
|
|
|
TSS->result = result;
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件获取结果值处理 一般获取到的事件结果多为0:等待中,因为事件执行后即清零
|
|
|
+ * @brief 分时调度事件获取结果值处理
|
|
|
+ * @note 一般获取到的事件结果多为0:等待中,因为在事件执行后事件结果值即清零
|
|
|
* @param TSS: 事件指针
|
|
|
* @retval 事件结果值 0: 等待中 1: 可执行
|
|
|
*/
|
|
@@ -199,7 +201,8 @@ unsigned char TSS_getResult(TSS_t *TSS)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * @brief 分时调度事件设置状态值处理 手动操作此函数无效,因为事件状态只与事件是否存在于工作链表中有关
|
|
|
+ * @brief 分时调度事件设置状态值处理
|
|
|
+ * @note 手动操作此函数无效,因为事件状态只与事件是否存在于工作链表中有关
|
|
|
* @param TSS: 事件指针
|
|
|
* @param state: 设置的状态值
|
|
|
* @retval None
|
|
@@ -209,7 +212,8 @@ void TSS_setState(TSS_t *TSS, unsigned char state)
|
|
|
// TSS->state = state;
|
|
|
}
|
|
|
/**
|
|
|
- * @brief 分时调度事件获取状态值处理 主要用于查看事件是否存在于工作链表中
|
|
|
+ * @brief 分时调度事件获取状态值处理
|
|
|
+ * @note 主要用于查看事件是否存在于工作链表中
|
|
|
* @param TSS: 事件指针
|
|
|
* @retval 事件的状态值 0:不在工作链表 1:在工作链表
|
|
|
*/
|
|
@@ -217,3 +221,25 @@ unsigned char TSS_getState(TSS_t *TSS)
|
|
|
{
|
|
|
return TSS->state;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * @brief 分时调度事件设置跳过值处理
|
|
|
+ * @note 主要用于事件仍在工作链表中的启动或挂起,相较于把事件从工作链表取下和恢复,此操作更快
|
|
|
+ * @param TSS: 事件指针
|
|
|
+ * @param state: 设置的跳过值
|
|
|
+ * @retval None
|
|
|
+ */
|
|
|
+void TSS_setSkip(TSS_t *TSS, unsigned char skip)
|
|
|
+{
|
|
|
+ TSS->skip = skip;
|
|
|
+}
|
|
|
+/**
|
|
|
+ * @brief 分时调度事件获取跳过值处理
|
|
|
+ * @note 主要用于查看事件是否跳过事件调度,事件仍在工作链表中的启动或挂起
|
|
|
+ * @param TSS: 事件指针
|
|
|
+ * @retval 事件的跳过值 0:不跳过调度 1: 跳过调度
|
|
|
+ */
|
|
|
+unsigned char TSS_getSkip(TSS_t *TSS)
|
|
|
+{
|
|
|
+ return TSS->skip;
|
|
|
+}
|