|
void Application_Initialize(void *first_available_memory)
{
VOID *pointer;
NU_Create_Memory_Pool(&System_Memory, "SYSMEM", first_available_memory,
7*1024*1024, 10, NU_FIFO);
// Create task for IIC.
NU_Allocate_Memory(&System_Memory, &pointer, 100*1024, NU_NO_SUSPEND);
NU_Create_Task(&Task_IIC,"TASKIIC", task_IIC, 0, NU_NULL, pointer,
100*1024, 10 ,10, NU_PREEMPT, NU_START);
// Create task for Communication.
NU_Allocate_Memory(&System_Memory, &pointer, 2*1024*1024, NU_NO_SUSPEND);
NU_Create_Task(&Task_Comm,"TASKComm", task_Comm, 0, NU_NULL, pointer,
2*1024*1024, 20,10, NU_PREEMPT, NU_NO_START);
//Creat task for Main
NU_Allocate_Memory(&System_Memory, &pointer, 2*1020*1024, NU_NO_SUSPEND);
NU_Create_Task(&Task_Main,"TASKMain", task_Main, 0, NU_NULL, pointer,
2*1024*1024, 15, 10,NU_PREEMPT, NU_NO_START);
// Create task for DataRecv.
NU_Allocate_Memory(&System_Memory, &pointer, 10*1024, NU_NO_SUSPEND);
NU_Create_Task(&Task_Recv_Data,"TASKData", task_Recv_Data, 0, NU_NULL, pointer,
20*1024, 20,10, NU_PREEMPT, NU_NO_START);
// Create task for Storage.
NU_Allocate_Memory(&System_Memory, &pointer, 500*1024, NU_NO_SUSPEND);
NU_Create_Task(&Task_Storage,"TASKStore", task_Store, 0, NU_NULL, pointer,
500*1024, 20 ,20, NU_PREEMPT, NU_NO_START);
//-----------------------------------------------------------------
NU_Create_Timer(&Timer, "TIMER", expiration_routine, 0, 100, 50,NU_ENABLE_TIMER);
asm(" move.w #0x2000,SR "); //4 enable interrupt
};
以上是Nucleus中任务的创建,我所遇到的情况刚好涉及红色字体所创建的任务。
我在Task_IIC中其他任务刚启动的时候,添加了一下程序:
1、MainMSG aMSG;
2、aMSG.SetMsg(SET_TIME);
3、Adaptor.SendMainMessage(&aMSG);
4、while(false == TimeCount)
{
}
为的是在Task_Main中通过按键设置时间,设置完以后将TimeCount付值为true,跳出while循环,进行以后的程序。
问题出现了,在第3行程序执行完以后,并非如预期的进入Task_Main,而是反复的执行第4行语句。为什么呢?
注意蓝色字体,表示的是各个任务的优先级。问题就在这儿。
我想当然的认为任务按时间片运行,却忽略了任务的优先级。在抢占式的任务调度当中,优先级高的任务抢占优先级低的任务来执行。而while使得Task_IIC始终有任务要处理,这样,系统就没有时间执行其他任务,在while这儿进入了死循环。
要解决这个问题,有以下方法:
1、 将while改为NU_Sleep(time),time表示想挂起的时间,用这段时间通过按键来设置时间。缺点是:设置的过程有时间限制。
2、 根本就不在乎其他任务也在同时运行,为避免干扰,可在设置的时候加入不可中断的语句。 |
|