📄 schcore.c
字号:
/*------------------------------------------------------------------*-
SCHCore.C
-----------------------------------------------------------------*/
#include "Main.h"
#include "Port.h"
#include "SCHCore.h"
//数据区
sTask SCH_tasks_G[SCH_MAX_TASKS]; //调度器任务队列
tByte Error_code_G = 0;
//系统休眠函数
static void SCH_Go_To_Sleep(void);
//设置系统报错参数
static tWord Error_tick_count_G; //报错周期
static tByte Last_error_code_G; //上次报错状态
/*------------------------------------------------------------------*-
SCH_Dispatch_Tasks()
系统调度执行任务
-*------------------------------------------------------------------*/
void SCH_Dispatch_Tasks(void)
{
tByte Index;
for (Index = 0; Index < SCH_MAX_TASKS; Index++) //查询任务队列,优先级按队列位置排列
{
if (SCH_tasks_G[Index].RunMe > 0) //任务就绪
{
(*SCH_tasks_G[Index].pTask)(); //执行任务
SCH_tasks_G[Index].RunMe -= 1; // 任务出列
if (SCH_tasks_G[Index].Period == 0) //如果不是周期性任务,则删除
{
SCH_Delete_Task(Index);
}
}
}
// 报告系统状态
SCH_Report_Status();
// 系统休眠
SCH_Go_To_Sleep();
}
/*------------------------------------------------------------------*-
SCH_Add_Task()
系统添加任务
参数:
*pFunction--函数名
DELAY--启动延时,赋0则立刻执行
PERIOD--运行周期,赋0则只执行一次
返回值:任务号或系统报错
-*------------------------------------------------------------------*/
tByte SCH_Add_Task(void (code * pFunction)(),
const tWord DELAY,
const tWord PERIOD)
{
tByte Index = 0;
while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
{
Index++;
}
if (Index == SCH_MAX_TASKS)
{
Error_code_G = ERROR_SCH_TOO_MANY_TASKS;
return SCH_MAX_TASKS;
}
SCH_tasks_G[Index].pTask = pFunction;
SCH_tasks_G[Index].Delay = DELAY;
SCH_tasks_G[Index].Period = PERIOD;
SCH_tasks_G[Index].RunMe = 0;
return Index;
}
/*------------------------------------------------------------------*-
SCH_Delete_Task()
系统删除任务
参数:
TASK_INDEX--任务号
返回值:
1--成功,0--失败
-*------------------------------------------------------------------*/
bit SCH_Delete_Task(const tByte TASK_INDEX)
{
bit Return_code;
if (SCH_tasks_G[TASK_INDEX].pTask == 0) //任务为空时,删除失败
{
Error_code_G = ERROR_SCH_CANNOT_DELETE_TASK;
Return_code = RETURN_ERROR;
}
else
{
Return_code = RETURN_NORMAL;
}
SCH_tasks_G[TASK_INDEX].pTask = 0x0000;
SCH_tasks_G[TASK_INDEX].Delay = 0;
SCH_tasks_G[TASK_INDEX].Period = 0;
SCH_tasks_G[TASK_INDEX].RunMe = 0;
return Return_code;
}
/*------------------------------------------------------------------*-
SCH_Report_Status()
报告系统状态
-*------------------------------------------------------------------*/
void SCH_Report_Status(void)
{
#ifdef SCH_REPORT_ERRORS
if (Error_code_G != Last_error_code_G)
{
Error_port = 255 - Error_code_G;
Last_error_code_G = Error_code_G;
if (Error_code_G != 0)
{
Error_tick_count_G = 60000;
}
else
{
Error_tick_count_G = 0;
}
}
else
{
if (Error_tick_count_G != 0)
{
if (--Error_tick_count_G == 0)
{
Error_code_G = 0;
}
}
}
#endif
}
/*------------------------------------------------------------------*-
SCH_Go_To_Sleep()
系统休眠
-*------------------------------------------------------------------*/
void SCH_Go_To_Sleep()
{
PCON |= 0x01;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -