本帖最后由 逍遥派掌门 于 2013-10-31 00:02 编辑
此版本适用于任何型号的PIC芯片,只要RAM和ROM足够即可。
如何知道RAM和ROM是否够用呢?这么简单的问题就不用浪费字数。
仍然使用CCS编译器。
直接上菜:
1、ptask.h- // 最大任务数
- #define MAXTASKS 3
- // 信号槽
- int16 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]--; }
2、main.h
- #include <16C61.h>
- #FUSES NOWDT //Watch Dog Timer
- #FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
- #FUSES PROTECT //Code protected from reads
- #use delay(clock=4000000)
3、main.c
- #include "main.h"
- #include "Ptask.h" // 调度相关的定义
- #define LED1 PIN_A0
- #define LED2 PIN_A1
- #define LED3 PIN_A2
- // 可根据实际的需要调用不同的延时函数
- #define time_devide(tick) delay_us(tick)
- ////////// 任务1 //////////
- BEGIN_TASK(Task1)
- static boolean i;
-
- i=~i;
- output_bit(LED1,i);
- Wait(100);
- END_TASK
- ////////// 任务2 //////////
- BEGIN_TASK(Task2)
- static boolean i;
-
- i=~i;
- output_bit(LED2,i);
- Wait(2000);
- END_TASK
- ////////// 任务3 //////////
- BEGIN_TASK(Task3)
- static boolean i;
-
- i=~i;
- output_bit(LED3,i);
- Wait(30000);
- END_TASK
- void main()
- {
- for(;;)
- {
- // 将任务0,1,2 分别装到信号槽 0,1,2里
- RunTask(task1,0);
- RunTask(task2,1);
- RunTask(task3,2);
-
- UpdateTimers(); // 任务调度
-
- time_devide(10); // 可根据需要进行调整
- }
- }
接上LED的实测效果与定时器版本是一样的。
|