本帖最后由 逍遥派掌门 于 2013-10-29 10:10 编辑
这个PIC的调度器可以看作是51小型任务调度器的移植。
本调度器的说明:
(1) 使用本调度器的CPU必须有一个(或以上)定时器中断资源。
(2) 使用CCS编译器。
以下为具体的代码:
1、文件名:main.h#include <16C66.h>
///// 以下为CCS自动生成,确实方便
#FUSES NOWDT // Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES PROTECT //Code not protected from reading
#use delay(clock=4000000)
2、文件名: Ptask.h// 最大任务数,要根据主程序的具体任务数来确定
#define MAXTASKS 3
int8 Timers[MAXTASKS];
// 调度开始
#define BEGIN_TASK(TaskName) int8 TaskName(){ static int8 lc; switch(lc){case 0:
// 调度结束
#define END_TASK } lc = 0; return 0;}
// 任务内延时
#define Wait(Ticks) {lc = __LINE__; return Ticks; } case __LINE__:
// 装配任务
#define RunTask(TaskName, TaskID) { if (Timers[TaskID] == 0){ Timers[TaskID] = TaskName(); }}
// 调用子程序
#define CallSub(SubTaskName) {lc = __LINE__; case __LINE__:{ int8 subTime = SubTaskName(); if(subTime) return subTime;}}
// 调度
#define UpdateTimers() int8 i; for(i = MAXTASKS; i > 0; i--){ if(Timers[i-1]) Timers[i-1]--; }
3、文件名:main.c#include "main.h"
#include "Ptask.h" // 调度相关的定义
///// 演示实际效果用的LED /////
#define LED1 PIN_A0
#define LED2 PIN_A1
#define LED3 PIN_A2
void init()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
}
////// 定时器1中断 /////
#int_TIMER1
void TIMER1_isr(void)
{
UpdateTimers(); // 任务调度
}
////////// 任务1 //////////
BEGIN_TASK(Task1)
static boolean i;
i=~i;
output_bit(LED1,i);
Wait(1);
END_TASK
////////// 任务2 //////////
BEGIN_TASK(Task2)
static boolean i;
i=~i;
output_bit(LED2,i);
Wait(5);
END_TASK
////////// 任务3 //////////
BEGIN_TASK(Task3)
static boolean i;
i=~i;
output_bit(LED3,i);
Wait(12);
END_TASK
void main()
{
init();
for(;;)
{
RunTask(task1,0);
RunTask(task2,1);
RunTask(task3,2);
}
}
|