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

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

这个PIC的调度器可以看作是51小型任务调度器的移植。

本调度器的说明:
  (1) 使用本调度器的CPU必须有一个(或以上)定时器中断资源。
  (2) 使用CCS编译器。

以下为具体的代码:
1、文件名:main.h
  1. #include <16C66.h>

  2. ///// 以下为CCS自动生成,确实方便

  3. #FUSES NOWDT                    // Watch Dog Timer
  4. #FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
  5. #FUSES NOPUT                    //No Power Up Timer
  6. #FUSES NOBROWNOUT               //No brownout reset
  7. #FUSES PROTECT                //Code not protected from reading

  8. #use delay(clock=4000000)
2、文件名: Ptask.h
  1. // 最大任务数,要根据主程序的具体任务数来确定
  2. #define MAXTASKS 3                     

  3. int8 Timers[MAXTASKS];

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

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

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

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

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

  14. // 调度
  15. #define UpdateTimers()              int8 i; for(i = MAXTASKS; i > 0; i--){ if(Timers[i-1]) Timers[i-1]--; }
3、文件名:main.c
  1. #include "main.h"

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


  3. ///// 演示实际效果用的LED   /////
  4. #define LED1      PIN_A0
  5. #define LED2      PIN_A1
  6. #define LED3      PIN_A2



  7. void init()
  8. {
  9.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);  
  10.    enable_interrupts(INT_TIMER1);
  11.    
  12.    enable_interrupts(GLOBAL);
  13. }


  14. //////    定时器1中断  /////
  15. #int_TIMER1
  16. void  TIMER1_isr(void)
  17. {
  18.    UpdateTimers();     // 任务调度
  19. }


  20. ////////// 任务1 //////////
  21. BEGIN_TASK(Task1)                           
  22.    static boolean i;
  23.    
  24.    i=~i;
  25.    output_bit(LED1,i);
  26.    Wait(1);
  27. END_TASK


  28. ////////// 任务2 //////////
  29. BEGIN_TASK(Task2)                           
  30.    static boolean i;
  31.    
  32.    i=~i;
  33.    output_bit(LED2,i);
  34.    Wait(5);
  35. END_TASK


  36. ////////// 任务3 //////////
  37. BEGIN_TASK(Task3)                           
  38.    static boolean i;
  39.    
  40.    i=~i;
  41.    output_bit(LED3,i);  
  42.    Wait(12);
  43. END_TASK


  44. void main()
  45. {   
  46.     init();
  47.    
  48.     for(;;)
  49.     {
  50.            RunTask(task1,0);
  51.            RunTask(task2,1);
  52.            RunTask(task3,2);                    
  53.     }   
  54. }
chen3bing 发表于 2013-10-27 09:58 | 显示全部楼层
这个任务调度器叫什么名字?
 楼主| 逍遥派掌门 发表于 2013-10-27 23:22 | 显示全部楼层
名字嘛,就叫 PIC的超小型任务调度器(CCS版)
ghost_z 发表于 2013-10-29 20:32 | 显示全部楼层
这个定义CCS中编译不过,不知什么原因
#define WaitX(tickets)  do {_lc=__LINE__+((__LINE__%256)==0); return tickets ;} while(0); case __LINE__+((__LINE__%256)==0):
 楼主| 逍遥派掌门 发表于 2013-10-30 15:30 | 显示全部楼层
这样就可以了:

#define Wait(Ticks)   {lc = __LINE__; return Ticks; } case __LINE__:


顶楼的代码运行通过,直接拿去用即可。
ghost_z 发表于 2013-10-30 23:15 | 显示全部楼层
好的,谢谢
ljm041128 发表于 2013-12-5 20:40 | 显示全部楼层
xc8 能用吗?
416775364TP 发表于 2013-12-18 19:36 来自手机 | 显示全部楼层
没看到源码
 楼主| 逍遥派掌门 发表于 2013-12-20 18:26 | 显示全部楼层
416775364TP 发表于 2013-12-18 19:36
没看到源码

顶楼不是贴了代码吗?

是不是手机看不到?
加油吧小鱼儿 发表于 2014-3-25 16:38 | 显示全部楼层
本帖最后由 加油吧小鱼儿 于 2014-3-25 16:39 编辑

玩过stc的,也即51的~,不过没什么用处,只是帮助了解任务调度的实现过程。。。放在16位、32位机应该好。。。个人观点~
zjxcml 发表于 2014-4-13 23:05 | 显示全部楼层
谢谢楼主分享的 宝贵思维 顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

528

帖子

2

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

14

主题

528

帖子

2

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