|
我刚学uc/os 系统,遇到问题,请各位大侠帮忙
我在44b0 上运行中断程序,发现进中断返回后,其他任务就不再运行了,只能等待中断
源程序如下:
int Main(int argc, char **argv)
{
ARMTargetInit(); //初始化运行环境
OSInit(); //初始化OS
MBox=OSMboxCreate((void*)0);
//Sem_F=OSFlagCreate(0,&err); //创建信号量集
OSTaskCreate(StartTask,(void *)0,&StartTaskStk[STACKSIZE-1],0); //创建起始任务
OSStart(); //运行任务
return 0;
}
void StartTask(void *pdata)
{
pdata=pdata;
ARMTargetStart(); //配置和打开中断,系统时钟开始运行
OSTaskCreate(Led1Task,(void *)s1,&Led1TaskStk[STACKSIZE-1],3); //创建起任务
OSTaskCreate(Led2Task,(void *)s2,&Led2TaskStk[STACKSIZE-1],4); //创建起任务
OSTaskCreate(Led3Task,(void *)s3,&Led3TaskStk[STACKSIZE-1],5); //创建任务
do{
OSTaskDel(0); //删除此任务
}while(1);
}
void Led1Task(void *pdata)
{ char temp;
for(;;)
{
temp =(unsigned int)OSMboxPend(MBox,0,&err);
//OSFlagPend(Sem_F,(OS_FLAGS)3,OS_FLAG_WAIT_SET_ALL,0,&err); //请求信号量集的第0和第1位且都置1。
rPDATC=0x02;
Uart_Printf(pdata);
OSMboxAccept(MBox);
//init_eint4567();
OSTimeDlyHMSM(0,0,1,0); //延时2秒
}
}
void Led2Task(void *pdata)
{ char you='h';
for(;;)
{
Uart_Printf(pdata);
rPDATC=0x04;
// OSTimeDlyHMSM(0,0,2,0); //延时8秒
OSMboxPost(MBox,&you);
// OSFlagPost(Sem_F,(OS_FLAGS)2,OS_FLAG_SET,&err); //发送信号量集。使信号量集的第1位置1
OSTimeDlyHMSM(0,0,4,0); //延时2秒
}
}
void Led3Task(void *pdata)
{
for(;;)
{
Uart_Printf(pdata);
rPDATC=0x08;
OSFlagPost(Sem_F,(OS_FLAGS)1,OS_FLAG_SET,&err); //发送信号量集。使信号量集的第0位置1
OSTimeDlyHMSM(0,0,5,0); //延时1秒
}
}
volatile char KeyMsg = 0 ;
/*void init_eint4567()
{
rPCONG = rPCONG | ( 0x3f << 10 ); //EINT7~5
rPUPG = rPUPG & (~(7 << 5)) ; //pull up resister is enable
rEXTINT = 0x22222222;//rEXTINT & (~(0x0fff << 20)) ; //EINT567低电平触发中断0fff
pISR_EINT4567 = (unsigned)Exint4567_Exception ;
}*/
void Exint4567_Exception(void)
{
OS_ENTER_CRITICAL();
KeyMsg = rEXTINPND ;
rEXTINPND = 0xf ; //clear EXTINTPND reg.
rI_ISPC = BIT_EINT4567 ; //clear pending_bit
rPCONG = rPCONG & (~(0x3f << 10)); //GPC567 is input
OSMboxPost(MBox,(void *)&KeyMsg);
switch (KeyMsg)
{
case 1:
Uart_Printf("\nEINT4 had been occured...\n");
KeyMsg = 0;
break;
case 2:
Uart_Printf("\nEINT5 had been occured...\n");
KeyMsg = 0;
break;
case 4:
Uart_Printf("\nEINT6 had been occured...\n");
KeyMsg = 0;
break;
case 8:
Uart_Printf("\nEINT7 had been occured...\n");
KeyMsg = 0;
break;
default :
break;
}
while ( (rPDATG&0x00e0) != 0x00e0 ) ;
Delay( 100 ) ;
rPCONG = rPCONG | ( 0x3f << 10 ); //EINT7~5
OS_EXIT_CRITICAL();
}
运行结果为:
Hello!uCOS-II Systerm !
led2 on !
led1 on !
led3 on !
led2 on !
led1 on !
led3 on !
EINT5 had been occured...
EINT5 had been occured...
EINT6 had been occured...
EINT6 had been occured...
。。。。。。。 |
|