找回密码
 注册
搜索
查看: 789|回复: 2

[讨论] [转帖]任务抢占和时间片分配

[复制链接]
发表于 2008-3-26 22:00:20 | 显示全部楼层 |阅读模式
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、  根本就不在乎其他任务也在同时运行,为避免干扰,可在设置的时候加入不可中断的语句。
发表于 2008-3-27 09:31:44 | 显示全部楼层
关注一下,不是很明白!
点评回复

使用道具 举报

发表于 2008-12-18 20:21:16 | 显示全部楼层
谢谢楼主贴出来,学习了
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-10-6 06:51 , Processed in 0.047992 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表