chargeController/tools/TimeSliceOffset/timeSliceOffset.c

150 lines
5.3 KiB
C
Raw Normal View History

2024-12-06 13:23:28 +00:00
/*
* timeSliceOffset.c
*
* Created on: 2024622
* Author: psx
*/
#include "TimeSliceOffset.h"
static STR_TimeSliceOffset* pTimeSliceList = NULL; /**< 时间片链表入口(仅入口,最终直接指向设备实体,所需无需申请空间。链表是单向线性链表) */
/**
* @brief
* @param[in] pTSlice
* @param[in] taskFunc
* @param[in] reloadVal *tick基准即为任务执行间隔
* @param[in] offset
* @return
* - 0
* - 1
* - -1 pTSlice为空指针
* @par
* - reloadVal设置为零即非定时任务offset偏移量无效
* @par :
* @code
*
* TimeSliceOffset_Register(&m_timeSlice_1, Task_1, 0, 0); //0即非定时任务(每次轮询都会执行)
* TimeSliceOffset_Register(&m_timeSlice_2, Task_2, 10, 0); //10*1ms即10ms运行一次
* TimeSliceOffset_Register(&m_timeSlice_3, Task_3, 10, 5); //10*1ms即10ms运行一次与Task_2错开5ms这样就不会集中到同一个10ms的时间点上
*
* @endcode
*/
int TimeSliceOffset_Register(STR_TimeSliceOffset* pTSlice, \
void (*taskFunc)(void), \
unsigned short reloadVal, \
unsigned short offset)
{
if(NULL == pTSlice)return -1; /* 返回错误:无效对象 */
pTSlice->reloadVal = reloadVal;
pTSlice->count = reloadVal + offset; /* 添加偏移量,使得同一数值的时间片错开 */
pTSlice->taskFunc = taskFunc;
if(0 == reloadVal) /* 非定时任务 */
{
pTSlice->runFlag = 1; /* 非定时任务可运行标志默认为一 */
}
else /* 定时任务 */
{
pTSlice->runFlag = 0; /* 定时任务可运行标志默认为零 */
}
/*遍历链表,防止添加重复*/
for(STR_TimeSliceOffset* pTemp = pTimeSliceList; pTemp != NULL; pTemp = pTemp->pNext)
{
if(pTemp == pTSlice)
{
return 1; /* 返回成功:配置完成,但对象已存在,无需加入链表 */
}
}
/*加入链表*/
pTSlice->pNext = pTimeSliceList;
pTimeSliceList = pTSlice; /* 把对象加入到链表头部 */
return 0; /* 返回成功:注册成功 */
}
/**
* @brief
* @return
* - 0
* - 1
* - -1 pTSlice为空指针
* @endcode
*/
int TimeSliceOffset_Unregister(STR_TimeSliceOffset* pTSlice)
{
if (NULL == pTSlice) return -1; /* 返回错误:无效对象 */
/* 遍历链表 */
for (STR_TimeSliceOffset* pTemp = pTimeSliceList; pTemp != NULL; pTemp = pTemp->pNext) {
if (pTemp->pNext == pTSlice) {
pTemp->pNext = pTemp->pNext->pNext;
return 0; /* 返回成功:取消注册 */
} else if (pTemp == pTSlice) {
pTimeSliceList = pTemp->pNext;
// pTimeSliceList->pNext = pTemp->pNext->pNext;
return 0; /* 返回成功:取消注册 */
}
}
return 1; /* 返回成功:对象不存在于链表中 */
}
/**
* @brief (main的while循环)
* @param null
* @return null
* @par
* - null
*/
void TimeSliceOffset_Start(void)
{
while(1) /* 代替main的while循环 */
{
/*遍历时间片链表*/
for(STR_TimeSliceOffset* pTemp = pTimeSliceList; pTemp != NULL; pTemp = pTemp->pNext)
{
if(pTemp->runFlag) /* 可运行则调用任务函数 */
{
if(pTemp->reloadVal) /* 重载值不为0即定时任务 */
{
pTemp->runFlag = 0; /* 可运行标志清零,开启新一轮倒计时 */
}
pTemp->taskFunc();
}
}
// __WFI();
}
}
/**
* @brief (systick或定时器中断处理函数内)
* @param null
* @return null
* @par
* - null
*/
void TimeSliceOffset_Produce(void)
{
/*遍历时间片链表*/
for(STR_TimeSliceOffset* pTemp = pTimeSliceList; pTemp != NULL; pTemp = pTemp->pNext)
{
if(pTemp->reloadVal) /* 重载值不为0即定时任务 */
{
--pTemp->count; /* 计数器递减 */
if(0 == pTemp->count) /* 计数器递减到零 */
{
pTemp->runFlag = 1; /* 允许执行 */
pTemp->count = pTemp->reloadVal; /* 计数器重载 */
}
}
}
}