收集小资源下的简单调度器
https://github.com/sigma318/TOS/tree/master
https://github.com/smset028/xxddq
#include <stdio.h>
int main()
{
int src[32];
int dst[32];
int *to=dst;
int* from=src;
int count=24;
int n=(count+7)/8;
printf("n=%d\n",n);
switch( count%8)
{
case 0:
do{*to++ = *from++;
case 7:*to++ = *from++;
case 6:*to++ = *from++;
case 5:*to++ = *from++;
case 4:*to++ = *from++;
case 3:*to++ = *from++;
case 2:*to++ = *from++;
case 1:*to++ = *from++;
}while(--n >0);
}
return 0;
}
//duff device copy 这里面精髓就是如果count能整除8,那就会执行case0,否则的话,第一轮会直接跳转到余数的case 开始执行。
//比如余数是2,第一轮执行的时候,会从 case2开始执行,而且case后面没有break,会把 case2,case1,后面的语句都执行掉。
这个调度器里面也是这个情况,直接跳转到了case __LINE__的地方。
下面是小小调度器的一个task,
task3是task2的宏展开。
unsigned short task2(){
_SS
while(1){
WaitX(TICKS_PER_SEC*5);
//LED0_TOG;
//GPIO_WriteReverse(GPIOA, GPIO_PIN_2);
}
_EE
}
unsigned short task3(){
static unsigned char _lc=0; switch(_lc){default:
while(1){
do { _lc=(__LINE__%255)+1; return (TICKS_PER_SEC*5) ;case (__LINE__%255)+1:;} while(0);
///xxxx
}
;}; _lc=0; return 65535;
}
这里我的分析是 第一次进入task的时候,完成了对 _lc的赋值,然后return了。
再一次进入的时候, switch case起作用,直接进入了 case语句,然后顺序执行到 while0 后面的语句。