尝试写个voidtask,没有空闲任务。 空闲时运行主函数。 移植atmega16+iaravr,atmega16+winavr,stm32+iararm
#include "config.h"
TTask TaskA,TaskB,TaskC;
void TaskAProc(void) { sei(); //任务开始开中断 while(1) { PORTD^=_BV(7); TSK_Delay(VT_TICKS_PER_SEC/2); } }
void TaskBProc(void) { sei(); //任务开始开中断 while(1) { PORTD^=_BV(6); TSK_Delay(VT_TICKS_PER_SEC/3); } }
void TaskCProc(void) { sei(); //任务开始开中断 while(1) { PORTD^=_BV(5); TSK_Delay(VT_TICKS_PER_SEC/4); } }
int main() { cli(); //任务开始调度前,要关中断 DDRD=_BV(7)|_BV(6)|_BV(5); PORTD=_BV(7)|_BV(6)|_BV(5); TCNT2 = 0; TCCR2=_BV(WGM21) | T2_CLK_DIV_128; OCR2=OCR2_INIT; TIFR|=_BV(OCF2); TIMSK=_BV(OCIE2);
#if STACK_DOUL==1 //AVRIAR 双堆栈 TSK_Init(&TaskA,TaskAProc,0,64,32); TSK_Init(&TaskB,TaskBProc,1,64,32); TSK_Init(&TaskC,TaskCProc,2,64,32); #else //AVRGCC 单堆栈 TSK_Init(&TaskA,TaskAProc,0,64+32); TSK_Init(&TaskB,TaskBProc,1,64+32); TSK_Init(&TaskC,TaskCProc,2,64+32); #endif TSK_Start(); sei(); //主程序开中断 while(1) { SleepIdle(); //任务空闲时休眠 } }
SIGNAL(TIMER2_COMP_vect) { VT_TicksHandler(); TSK_Swap(); }
相关链接:https://bbs.21ic.com/upfiles/img/20096/2009623113629274.rar |