[PIC®/AVR®/dsPIC®产品] 超小型的任务调度器(通杀型版本)

[复制链接]
 楼主| 逍遥派掌门 发表于 2013-10-31 00:01 | 显示全部楼层 |阅读模式
本帖最后由 逍遥派掌门 于 2013-10-31 00:02 编辑

    此版本适用于任何型号的PIC芯片,只要RAM和ROM足够即可。

    如何知道RAM和ROM是否够用呢?这么简单的问题就不用浪费字数。

    仍然使用CCS编译器。

直接上菜:

1、ptask.h
  1. // 最大任务数
  2. #define MAXTASKS 3                     

  3. // 信号槽
  4. int16 Timers[MAXTASKS];


  5. // 调度开始
  6. #define BEGIN_TASK(TaskName)        int8 TaskName(){ static int8 lc; switch(lc){case 0:

  7. // 调度结束
  8. #define END_TASK                    } lc = 0; return 0;}

  9. // 任务内延时
  10. #define Wait(Ticks)                 {lc = __LINE__; return Ticks; } case __LINE__:

  11. // 装配任务
  12. #define RunTask(TaskName, TaskID)   { if (Timers[TaskID] == 0){ Timers[TaskID] = TaskName(); }}

  13. // 调用子程序
  14. #define CallSub(SubTaskName)        {lc = __LINE__; case __LINE__:{ int8 subTime = SubTaskName(); if(subTime) return subTime;}}  

  15. // 调度
  16. #define UpdateTimers()              int8 i; for(i = MAXTASKS; i > 0; i--){ if(Timers[i-1]) Timers[i-1]--; }
2、main.h
  1. #include <16C61.h>

  2. #FUSES NOWDT                      //Watch Dog Timer
  3. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  4. #FUSES PROTECT                  //Code protected from reads

  5. #use delay(clock=4000000)
3、main.c
  1. #include "main.h"

  2. #include "Ptask.h"           // 调度相关的定义

  3. #define LED1      PIN_A0
  4. #define LED2      PIN_A1
  5. #define LED3      PIN_A2

  6. // 可根据实际的需要调用不同的延时函数
  7. #define time_devide(tick)  delay_us(tick)


  8. ////////// 任务1 //////////
  9. BEGIN_TASK(Task1)                           
  10.    static boolean i;
  11.    
  12.    i=~i;
  13.    output_bit(LED1,i);
  14.    Wait(100);
  15. END_TASK


  16. ////////// 任务2 //////////
  17. BEGIN_TASK(Task2)                           
  18.    static boolean i;
  19.    
  20.    i=~i;
  21.    output_bit(LED2,i);
  22.    Wait(2000);
  23. END_TASK


  24. ////////// 任务3 //////////
  25. BEGIN_TASK(Task3)                           
  26.    static boolean i;
  27.    
  28.    i=~i;
  29.    output_bit(LED3,i);  
  30.    Wait(30000);
  31. END_TASK


  32. void main()
  33. {   
  34.     for(;;)
  35.     {
  36.            // 将任务0,1,2 分别装到信号槽 0,1,2里
  37.            RunTask(task1,0);
  38.            RunTask(task2,1);
  39.            RunTask(task3,2);   
  40.            
  41.            UpdateTimers();     // 任务调度
  42.            
  43.            time_devide(10);    // 可根据需要进行调整
  44.     }   
  45. }

接上LED的实测效果与定时器版本是一样的。


wangch_sh 发表于 2013-10-31 09:11 | 显示全部楼层
哪里有源码?手册?
huangxz 发表于 2013-10-31 10:27 | 显示全部楼层
是什么系统啊?
ayb_ice 发表于 2013-10-31 14:23 | 显示全部楼层
主循环调用还更简单点
 楼主| 逍遥派掌门 发表于 2013-11-1 00:00 | 显示全部楼层
wangch_sh 发表于 2013-10-31 09:11
哪里有源码?手册?

1楼就是源码。
 楼主| 逍遥派掌门 发表于 2013-11-1 00:01 | 显示全部楼层
huangxz 发表于 2013-10-31 10:27
是什么系统啊?

PIC单片机
wangch_sh 发表于 2013-11-1 10:08 | 显示全部楼层
我是说调度器的源码。
 楼主| 逍遥派掌门 发表于 2013-11-1 16:45 | 显示全部楼层
wangch_sh 发表于 2013-11-1 10:08
我是说调度器的源码。

拜托,看看1楼的是什么。
与时俱进 发表于 2013-11-2 11:55 | 显示全部楼层
这么简单?
 楼主| 逍遥派掌门 发表于 2013-11-6 14:38 | 显示全部楼层
与时俱进 发表于 2013-11-2 11:55
这么简单?

简单易懂,容易上手使用。
zjxcml 发表于 2014-4-13 23:10 | 显示全部楼层
看了您要出书 应该和这个有关吧 顶您希望书快点出来
shuidi_wangdan 发表于 2014-4-15 07:52 | 显示全部楼层
output_bit(LED1,i);是怎么来的?
shuidi_wangdan 发表于 2014-4-15 08:03 | 显示全部楼层
本帖最后由 shuidi_wangdan 于 2014-4-15 08:08 编辑

#define BEGIN_TASK(TaskName)        int8 TaskName(){ static int8 lc; switch(lc){case 0:

lc怎么来的?__LINE__什么意思?能否给讲一下,谢谢
 楼主| 逍遥派掌门 发表于 2014-4-15 16:52 | 显示全部楼层
shuidi_wangdan 发表于 2014-4-15 07:52
output_bit(LED1,i);是怎么来的?

output_bit 是CCS 定义的函数。
 楼主| 逍遥派掌门 发表于 2014-4-15 16:56 | 显示全部楼层
shuidi_wangdan 发表于 2014-4-15 08:03
#define BEGIN_TASK(TaskName)        int8 TaskName(){ static int8 lc; switch(lc){case 0:

lc怎么来的 ...

static int8 lc; 这不是很清楚了吗?
shuidi_wangdan 发表于 2014-4-15 17:06 | 显示全部楼层
逍遥派掌门 发表于 2014-4-15 16:56
static int8 lc; 这不是很清楚了吗?

没注意到!呵呵,谢谢
416775364TP 发表于 2014-10-26 09:42 | 显示全部楼层
没太看明白有什么意义,ptask.h里面的东西乱。
Rain_King 发表于 2014-10-26 11:49 | 显示全部楼层
很简单的,是一个主循环,让后每个任务里面是状态来判断是否运行,其实也是进入了这个函数.....只能说是一个写代码的思路,一个程序的架构吧,说调度,有点大了....
Rain_King 发表于 2014-10-26 11:50 | 显示全部楼层
如果这样调度,还不如用函数指针.....更加方便点....
 楼主| 逍遥派掌门 发表于 2014-11-4 09:22 | 显示全部楼层
416775364TP 发表于 2014-10-26 09:42
没太看明白有什么意义,ptask.h里面的东西乱。

书写清楚,注释也齐备,还说“乱”?!

应该是没有看懂的原因吧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

528

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部