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

超小型的任务调度器(通杀型版本)

[复制链接]
3965|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
逍遥派掌门|  楼主 | 2013-10-31 00:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 逍遥派掌门 于 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的实测效果与定时器版本是一样的。


沙发
wangch_sh| | 2013-10-31 09:11 | 只看该作者
哪里有源码?手册?

使用特权

评论回复
板凳
huangxz| | 2013-10-31 10:27 | 只看该作者
是什么系统啊?

使用特权

评论回复
地板
ayb_ice| | 2013-10-31 14:23 | 只看该作者
主循环调用还更简单点

使用特权

评论回复
5
逍遥派掌门|  楼主 | 2013-11-1 00:00 | 只看该作者
wangch_sh 发表于 2013-10-31 09:11
哪里有源码?手册?

1楼就是源码。

使用特权

评论回复
6
逍遥派掌门|  楼主 | 2013-11-1 00:01 | 只看该作者
huangxz 发表于 2013-10-31 10:27
是什么系统啊?

PIC单片机

使用特权

评论回复
7
wangch_sh| | 2013-11-1 10:08 | 只看该作者
我是说调度器的源码。

使用特权

评论回复
8
逍遥派掌门|  楼主 | 2013-11-1 16:45 | 只看该作者
wangch_sh 发表于 2013-11-1 10:08
我是说调度器的源码。

拜托,看看1楼的是什么。

使用特权

评论回复
9
与时俱进| | 2013-11-2 11:55 | 只看该作者
这么简单?

使用特权

评论回复
10
逍遥派掌门|  楼主 | 2013-11-6 14:38 | 只看该作者
与时俱进 发表于 2013-11-2 11:55
这么简单?

简单易懂,容易上手使用。

使用特权

评论回复
11
zjxcml| | 2014-4-13 23:10 | 只看该作者
看了您要出书 应该和这个有关吧 顶您希望书快点出来

使用特权

评论回复
12
shuidi_wangdan| | 2014-4-15 07:52 | 只看该作者
output_bit(LED1,i);是怎么来的?

使用特权

评论回复
13
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__什么意思?能否给讲一下,谢谢

使用特权

评论回复
14
逍遥派掌门|  楼主 | 2014-4-15 16:52 | 只看该作者
shuidi_wangdan 发表于 2014-4-15 07:52
output_bit(LED1,i);是怎么来的?

output_bit 是CCS 定义的函数。

使用特权

评论回复
15
逍遥派掌门|  楼主 | 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; 这不是很清楚了吗?

使用特权

评论回复
16
shuidi_wangdan| | 2014-4-15 17:06 | 只看该作者
逍遥派掌门 发表于 2014-4-15 16:56
static int8 lc; 这不是很清楚了吗?

没注意到!呵呵,谢谢

使用特权

评论回复
17
416775364TP| | 2014-10-26 09:42 | 只看该作者
没太看明白有什么意义,ptask.h里面的东西乱。

使用特权

评论回复
18
Rain_King| | 2014-10-26 11:49 | 只看该作者
很简单的,是一个主循环,让后每个任务里面是状态来判断是否运行,其实也是进入了这个函数.....只能说是一个写代码的思路,一个程序的架构吧,说调度,有点大了....

使用特权

评论回复
19
Rain_King| | 2014-10-26 11:50 | 只看该作者
如果这样调度,还不如用函数指针.....更加方便点....

使用特权

评论回复
20
逍遥派掌门|  楼主 | 2014-11-4 09:22 | 只看该作者
416775364TP 发表于 2014-10-26 09:42
没太看明白有什么意义,ptask.h里面的东西乱。

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

应该是没有看懂的原因吧?

使用特权

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

本版积分规则

14

主题

524

帖子

2

粉丝