分享到:
这是转载的一个网友的小调度器,是根据Protothread的思想编写的片轮调度器,
初步具有多任务的思想,占用资源极少,适合小资源的单片机使用,已经量产验证过,比较稳定,不过编写代码时还是有些注意事项
作者的github:https://github.com/smset028/tiny-scheduler
代码如下:有兴趣可以一起讨论
/****begin of scheduler ********************************************/
#define MAXTASKS 2
volatile unsigned short timers[MAXTASKS];
#define _SS static unsigned char _lc=0; switch(_lc){default:
#define _EE ;}; _lc=0; return 65535;
#define WaitX(tickets) do {_lc=(__LINE__%255)+1; return tickets ; case (__LINE__%255)+1: ;} while(0)
#define InitTasks() {unsigned char i; for(i=MAXTASKS;i>0 ;i--) timers[i-1]=0; }
#define RunTask(TaskName,TaskID) do { if (timers[TaskID]==0) timers[TaskID]=TaskName(); } while(0)
#define CallSub(SubTaskName) do {unsigned short currdt; _lc=(__LINE__%255)+1; return 0; case (__LINE__%255)+1: currdt=SubTaskName(); if(currdt!=65535) return currdt;} while(0)
#define UpdateTimers() {unsigned char i; for(i=MAXTASKS;i>0 ;i--){if((timers[i-1]!=0)&&(timers[i-1]!=65535)) timers[i-1]--;}}
/*--end of scheduler-------------------------------------------------*/
unsigned short task1(){
_SS
pinMode(BUILTIN_LED, OUTPUT);
while(1){
digitalWrite(BUILTIN_LED,HIGH);
WaitX(50);
digitalWrite(BUILTIN_LED,LOW);
WaitX(50);
}
_EE
}
unsigned short task2(){
_SS
pinMode(14, OUTPUT);
while(1){
digitalWrite(13,HIGH);
WaitX(100);
digitalWrite(13,LOW);
WaitX(100);
}
_EE
}
void setup() {
// put your setup code here, to run once:
InitTasks();
}
void loop() {
// put your main code here, to run repeatedly:
delay(10);
UpdateTimers();
RunTask(task1,0);
RunTask(task2,1);
}
(1 )
(1 )
回复
举报
-
- xiaomiking
-
1147 发帖6357 回复18609 积分
- 私信他 +关注
回复于 2018-01-30
2#
此文章来源于融创芯城(www.digiic.com)—— 半导体电子领域共享平台
https://github.com/smset028/tiny-scheduler
https://github.com/smset028/tiny-scheduler
(0 )
-
- 0000000000000000
-
1888 发帖7917 回复34980 积分
- 私信他 +关注
-
- phoenix20111116
-
124 发帖361 回复1671 积分
- 私信他 +关注
-
- xiaomiking
-
1147 发帖6357 回复18609 积分
- 私信他 +关注
发表回复
版
块
导
航
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖

发帖
回复
楼主