stm32_ota/ABM开发板(APP源码)/YcOS版本/APPV4.0/YCOS/ycos.c
2024-12-17 20:03:43 +08:00

135 lines
6.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "ycos.h"
#include <string.h>
/********************************************************************************
* @file ycos.c
* @author 晏诚科技 Mr.Wang
* @version V1.0.0
* @date 11-Dec-2018
* @brief 晏诚科技自主研发YCOS驱动代码
******************************************************************************
* @attention
*******************************************************************************/
YcOSTask_s sYcOSTask[YCOSTASK_MAX] ; //定义YcOSTasks类型的数组用来保存所有的YCOS任务信息
/********************************************************************************************************************************************************
* 名 称psYcOSTaskHandle YcOSTaskCreate( const char * const pcTaskName,
const YcOSTaskPrio_e eTaskPrio,
const uint32_t taskTickInterval,
const int taskID,
const YCOSTASKFP pCallback )
* 功 能创建一个YcOS任务,但是不开启该任务轮询
* 入口参数:
* @param1 pcTaskName YcOS任务的命名
* @param2 eTaskPrio YcOS任务优先级
* @param3 taskTickInterval YcOS任务轮询间隔节拍数
* @param4 taskID YcOS任务ID 即数组sYcOSTask的元素sYcOSTask[taskID]
* @param5 pCallback YcOS任务轮询间隔到达时要执行的代码函数指针
* 出口参数: &sYcOSTask[taskID]
********************************************************************************************************************************************************/
psYcOSTaskHandle YcOSTaskCreate( const char * const pcTaskName,
const YcOSTaskPrio_e eTaskPrio,
const uint32_t taskTickInterval,
const int taskID,
const YCOSTASKFP pCallback )
{
YcOSTask_s *psTask = &sYcOSTask[taskID] ;
psTask->taskName = pcTaskName ;
psTask->enTask = false ;
psTask->eTaskPrio = eTaskPrio ;
psTask->taskTickInterval = taskTickInterval ;
psTask->pFunc = pCallback ;
if( taskID >= YCOSTASK_MAX )
{
//LogOut("alarm ID >= ALARM_MAX") ;
return NULL ;
}
return psTask ;
}
/********************************************************************************************************************************************************
* 名 称void CloseTimer(int timerNum )
* 功 能删除psYcOSTaskHandle句柄任务
* 入口参数:
* @param1 psTask YcOS任务句柄psYcOSTaskHandle YcOSTaskCreate函数返回的定时器句柄
********************************************************************************************************************************************************/
void YcOSTaskDelete(psYcOSTaskHandle psTask)
{
psTask->taskName = " " ;
psTask->enTask = false ;
psTask->taskTickInterval = 0xFFFFFFFF ;
psTask->pFunc = NULL ;
}
/********************************************************************************************************************************************************
* 名 称void YcOSTaskStart(psYcOSTaskHandle psTask)
* 功 能开启psYcOSTaskHandle任务的轮询
* 入口参数:
* @param1 psTask YcOS任务句柄psYcOSTaskHandle YcOSTaskCreate函数返回的定时器句柄
********************************************************************************************************************************************************/
void YcOSTaskStart(psYcOSTaskHandle psTask)
{
psTask->enTask = true ;
}
/********************************************************************************************************************************************************
* 名 称void CloseTimer(int timerNum )
* 功 能关闭psYcOSTaskHandle任务的轮询
* 入口参数:
* @param1 psTask YcOS任务句柄psYcOSTaskHandle YcOSTaskCreate函数返回的定时器句柄
********************************************************************************************************************************************************/
void YcOSTaskStop(psYcOSTaskHandle psTask)
{
psTask->enTask = false ;
}
/********************************************************************************************************************************************************
* 名 称void YcOSLowPrioSchedulerCallback(void)
* 功 能YcOS低优先级任务的轮询调度器
* 说 明: 请将该调度器移植到应用层定时器中断中应用层定时器中断建议100ms中断一次。
* 注 意:应用层改定时器中断抢占优先级必须为最低级别,且在该抢占优先级内没有其他中断
********************************************************************************************************************************************************/
void YcOSLowPrioSchedulerCallback(void)
{
volatile static uint32_t osLowPrioCounter = 0 ;
osLowPrioCounter++ ; //timeCount 计数器
if( osLowPrioCounter >= 0XFFFFFFF0) osLowPrioCounter=0; //防止timeCount越界
for( int i = 0; i<YCOSTASK_MAX; i++)
{
if( (sYcOSTask[i].enTask == true) && ( sYcOSTask[i].eTaskPrio == YCOSTASK_LOWPRIO ) ) //该任务调度已开启、且该任务为低优先级任务
{
if( osLowPrioCounter % sYcOSTask[i].taskTickInterval == 0 ) //该任务间隔节拍数到达
{
sYcOSTask[i].pFunc() ; //运行任务函数
}
}
}
}
/********************************************************************************************************************************************************
* 名 称void YcOSHighPrioSchedulerCallback(void)
* 功 能YcOS高优先级任务的轮询调度器
* 注 意:应用层改定时器中断抢占优先级必须为次最低级别,且在该抢占优先级内没有其他中断
********************************************************************************************************************************************************/
void YcOSHighPrioSchedulerCallback(void)
{
volatile static uint32_t osHighPrioCounter = 0 ;
osHighPrioCounter++ ; //timeCount 计数器
if( osHighPrioCounter >= 0XFFFFFFF0) osHighPrioCounter=0; //防止timeCount越界
for( int i = 0; i<YCOSTASK_MAX; i++)
{
if( (sYcOSTask[i].enTask == true) && ( sYcOSTask[i].eTaskPrio == YCOSTASK_HIGHPRIO ) ) //该任务调度已开启、且该任务为高优先级任务
{
if( osHighPrioCounter % sYcOSTask[i].taskTickInterval == 0 ) //该任务间隔节拍数到达
{
sYcOSTask[i].pFunc() ; //运行任务函数
}
}
}
}