|
楼主 |
发表于 2005-8-5 23:07:24
|
显示全部楼层
#include "MySch.h"
/////////////////////////////////////////////////////////////////////////////
//SCH.c 调度器内核函数
// 任务调度器数组
sTask SCH_tasks_G[SCH_MAX_TASKS];
/*
***********************************************
* void SCH_Init_T0(void)
***********************************************
*/
void SCH_Init_T0(void)
{
TCCR0 = (1<<CS01)|(1<<CS00); //1024分频
uint8_t i;
for (i = 0; i < SCH_MAX_TASKS; i++)
{
SCH_Delete_Task(i); //删除不必要的任务
}
// 定时器0,8位定时,手动重装
TIMSK &= 0xFD; // Clear all T0 bits (T1,2 left unchanged)
// 设置定时器0的初志
SCH_Manual_Timer0_Reload(); //填装函数
// Interrupt Timer 0 enabled
TIMSK |= 0x01;
}
/*
************************************************
* void SCH_Start(void)
***********************************************
*/
void SCH_Start(void)
{
sei(); //开启全局中断
}
/*
************************************************************
*
* void SCH_Update(void) interrupt INTERRUPT_Timer_0_Overflow
*
*************************************************************
*/
SIGNAL(SIG_OVERFLOW0)
{
uint8_t Index;
SCH_Manual_Timer0_Reload();
for ( Index = 0; Index < SCH_MAX_TASKS; Index++ )
{
if (SCH_tasks_G[Index].pTask)
{
//**********************************************************
if (SCH_tasks_G[Index].Delay == 0)
{
// 给可以被调度的任务设置标志位
// 说明:任务运行标志位不具有存储功能,也就是说,如果在规定的
// 间隔内没有被运行,则机会丧失
SCH_tasks_G[Index].RunMe += 1; // Inc. the 'Run Me' flag
if (SCH_tasks_G[Index].Period)//将任务需要的延时装入
{
SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
}
}
//************************************************************
else
{
SCH_tasks_G[Index].Delay -= 1;//延时-1
}
//************************************************************
}
}
}
/*
************************************************************
*
* void SCH_Manual_Timer0_Reload()
*
*************************************************************
*/
void SCH_Manual_Timer0_Reload()
{
// Stop timer
TCNT0=0X83; //64分频下1ms
}
/*
********************************************************************************************************
*
* 任务调度器内核
*
********************************************************************************************************
*/
/*
************************************************************
*
* void SCH_RUN_Tasks(void)
*
************************************************************
*/
void SCH_RUN_Tasks(void)
{
uint8_t 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);
}
}
}
}
/*
************************************************************
*
* uchar SCH_Add_Task
*
*************************************************************
*/
uint8_t SCH_Add_Task( const void (*pFunction)(void),
uint16_t DELAY,
uint16_t PERIOD)
{
uint8_t Index = 0;
while ((SCH_tasks_G[Index].pTask != 0) && (Index < SCH_MAX_TASKS))
{
Index++;
}
// Have we reached the end of the list?
if (Index == SCH_MAX_TASKS)
{
// Task list is full
return SCH_MAX_TASKS;
}
// If we're here, there is a space in the task array
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; // return position of task (to allow later deletion)
}
/*
************************************************************
*
* uint8_t SCH_Delete_Task(const uchar TASK_INDEX)
*
*************************************************************
*/
uint8_t SCH_Delete_Task( uint8_t TASK_INDEX)
{
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 0; // return status
} |
|