打印
[PIC®/AVR®/dsPIC®产品]

超小型的任务调度器(定时器版本)

[复制链接]
3105|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
逍遥派掌门|  楼主 | 2013-10-27 01:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 逍遥派掌门 于 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);                    
    }   
}
沙发
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):

使用特权

评论回复
5
逍遥派掌门|  楼主 | 2013-10-30 15:30 | 只看该作者
这样就可以了:

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


顶楼的代码运行通过,直接拿去用即可。

使用特权

评论回复
6
ghost_z| | 2013-10-30 23:15 | 只看该作者
好的,谢谢

使用特权

评论回复
7
ljm041128| | 2013-12-5 20:40 | 只看该作者
xc8 能用吗?

使用特权

评论回复
8
416775364TP| | 2013-12-18 19:36 | 只看该作者
没看到源码

使用特权

评论回复
9
逍遥派掌门|  楼主 | 2013-12-20 18:26 | 只看该作者
416775364TP 发表于 2013-12-18 19:36
没看到源码

顶楼不是贴了代码吗?

是不是手机看不到?

使用特权

评论回复
10
加油吧小鱼儿| | 2014-3-25 16:38 | 只看该作者
本帖最后由 加油吧小鱼儿 于 2014-3-25 16:39 编辑

玩过stc的,也即51的~,不过没什么用处,只是帮助了解任务调度的实现过程。。。放在16位、32位机应该好。。。个人观点~

使用特权

评论回复
11
zjxcml| | 2014-4-13 23:05 | 只看该作者
谢谢楼主分享的 宝贵思维 顶

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

528

帖子

2

粉丝