高级会员
主题
帖子
积分174
阅读权限30
注册时间2014-8-25
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2014-9-1 16:17
|
显示全部楼层
本帖最后由 smsetyl 于 2014-9-1 16:20 编辑
在IAR6.7下编译通过。(选用:Misra C 2004)
/****小小调度器开始**********************************************/
#define MAXTASKS 2U
volatile static unsigned char timers[MAXTASKS];
#define _SS static unsigned char _lc=0U; switch(_lc){case 0U:
#define _EE break; default:break;} _lc=0U; return 255U;
#define WaitX(tickets) _lc=(unsigned char)(__LINE__)%255U+1U; if(_lc){return (tickets);} break; case ((unsigned char)(__LINE__)%255U)+1U:
#define RunTask(TaskName,TaskID) do {if (timers[(TaskID)]==0U){ timers[(TaskID)]=(TaskName)(); } } while(0)
#define RunTaskA(TaskName,TaskID) { if (timers[(TaskID)]==0U) {timers[(TaskID)]=(TaskName)(); continue;} } /*前面的任务优先保证执行*/
#define CallSub(SubTaskName) do {unsigned char currdt; _lc=(unsigned char)(__LINE__)%255U+1U; if(_lc) {return 0U;} break; case (unsigned char)(__LINE__)%255U+1U: currdt=(SubTaskName)(); if(currdt!=255U) {return currdt;}} while(0);
#define InitTasks() do {unsigned char i; for(i=MAXTASKS;i>0U ;i--) {timers[i-1U]=0U;} } while(0)
#define UpdateTimers() do { unsigned char i; for(i=MAXTASKS;i>0U ;i--){ if(timers[i-1U]!=0U){ if(timers[i-1U]!=255U) { timers[i-1U]--;} } }} while(0)
#define SEM unsigned int
/*初始化信号量*/
#define InitSem(sem) (sem)=0;
/*等待信号量*/
#define WaitSem(sem) do{ (sem)=1; WaitX(0); if ((sem)>0) return 1;} while(0);
/*等待信号量或定时器溢出, 定时器tickets 最大为0xFFFE*/
#define WaitSemX(sem,tickets) do { (sem)=(tickets)+1; WaitX(0); if((sem)>1){ (sem)--; return 1;} } while(0);
/*发送信号量*/
#define SendSem(sem) do {(sem)=0;} while(0);
static unsigned char task1(void);
static unsigned char task11(void);static unsigned char task2(void);
/*****小小调度器结束*******************************************************/
static unsigned char task11(void){
static int i;
_SS
for(i=0;i<11;i++){
WaitX(10U);
}
_EE
}
static unsigned char task1(void){
_SS
while(1){
WaitX(10U);
CallSub(task11);
}
_EE
}
static unsigned char task2(void){
_SS
while(1){
WaitX(10U);
}
_EE
}
int main(void)
{
InitTasks();
while(1){
UpdateTimers();
RunTask(task1,0);
RunTask(task2,1);
}
}
|
|