|
调用了avrxdelay函数之后不能返回
估计是bug
代码如下:
AVRX_GCC_TASK(task1, 20, 3);
AVRX_GCC_TASK(task2, 20, 1);
AVRX_GCC_TASK(task3, 20, 1);
AVRX_MUTEX(TimerSemaphore); //声明一个信号量
AVRX_TIMER(myTimer);
//TimerControlBlock myTimer,myTimer2,myTimer3;
int main(void)
{
AvrXSetKernelStack(0);
DS1302_Init();
GUI_Init();
GUI_VarInit();
Key_Init();
MCUCR = _BV(SE); // Initialize Timer Hardware
TCNT0 = TCNT0_INIT;
TCCR0 = TMC8_CK256;
TIMSK = _BV(TOIE0); // Enable Timer overflow interrupt
AvrXRunTask(&task1Tcb);
AvrXRunTask(&task2Tcb);
AvrXRunTask(&task3Tcb);
Epilog(); // Switch from AvrX Stack to first task
while (1);
}
AVRX_SIGINT(SIG_OVERFLOW0)
{
IntProlog();
TCNT0 = TCNT0_INIT;
AvrXTimerHandler(); // Call Time queue manager
// while (AvrXIntTestSemaphore(&TimerSemaphore) == SEM_WAIT)
// AvrXIntSetSemaphore(&TimerSemaphore); // Flush all waiting tasks
AvrXIntSetSemaphore(&TimerSemaphore); // Set Semaphore (short path)
Epilog();
}
NAKEDFUNC(task1)
{
uint myKey;
uchar Key; //按键
while (1)
{
AvrXWaitSemaphore(&TimerSemaphore);
AvrXWaitSemaphore(&TimerSemaphore);
if(GUI_Flash)
{
cli();
GUI_Clear(); //清空
str1=*(pMenu[Language].Text+Item);
str2=*(pMenu[Language].Text+Item+1);
GUI_PutStrAt(str1,0,0);
GUI_PutStrAt(str2,0,1);
if(Where<MaxDispY)
{
GUI_SetPos(15,Where);
GUI_PutStr("<");
}
GUI_Flash=0;
sei();
}
myKey=PINA;
AvrXDelay(&myTimer,20);//<-----------------------------程序会在这里死掉,诸君可以验证
Key=PINA;
if(Key!=myKey)continue;
while(myKey!=0xf0)
{
myKey=PINA;
myKey&=0xf0;
AvrXDelay(&myTimer,1);
}
if(myKey!=0xf0)continue;
Key&=0xf0;
/*
cli();
GUI_Clear(); //清空
GUI_PutStrAt("Key=",0,0);
GUI_PutNum(myKey&0xf0);
GUI_PutStrAt("Keytest",0,1);
GUI_SetPos(15,Where);
GUI_PutStr("<");
sei();
continue;
*/
switch (Key)
{
case UP: //向上键
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyUpState;
KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
break;
case DN: //向下键
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyDnState;
KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
break;
case ESC: //返回键
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEscState;
KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
break;
case ETR: //进入键
KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEtrState;
KeyFuncPtr=KeyTab[KeyFuncIndex].CurrentOperate;
(*KeyFuncPtr)();//执行当前按键的操作
break;
default:
break;
}
}
}
NAKEDFUNC(task2)
{
while (1)
{
AvrXWaitSemaphore(&TimerSemaphore);
}
}
NAKEDFUNC(task3)
{
while(1)
{
AvrXWaitSemaphore(&TimerSemaphore);
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|