重开一贴:UCOS中关于信号量的问题!!!
原来的问题有些错误,现在重开一贴。板子是万利199的板子/*检测按键1*/
staticvoidApp_TaskKbd (void *p_arg)
{
INT8Ub1,b2;
INT8Uerr;
(void)p_arg;
while (DEF_TRUE) {
OSSemPend(InfoSem,0,&err);
b1 = BSP_PB_GetStatus(BSP_PB_ID_KEY1);
if (b1 == 1) {
App_DispScr_SignOn();/*按键1按下刷新串口*/
}
OSSemPost(InfoSem);
OSTimeDlyHMSM(0, 0, 0, 10);
}
}
/*检测按键2*/
staticvoidApp_TaskJoystick (void *p_arg)
{
INT8Ub1,b2;
INT8Uerr;
(void)p_arg;
while (DEF_TRUE) {
//OSSemPend(InfoSem,0,&err);/*问题出在这(为什么申请信号量后KEY1和KEY2都无法刷新??)*/
b2 = BSP_PB_GetStatus(BSP_PB_ID_KEY2);
if (b2 == 2) {
App_DispScr_SignOn();/*按键2按下刷新串口*/
}
OSSemPost(InfoSem);
OSTimeDlyHMSM(0, 0, 0, 10);
}
}
App_TaskKbd的优先级高,现在的问题是,在App_TaskJoystick 函数中申请信号量OSSemPend(InfoSem,0,&err)后,按下KEY1和KEY2串口都不刷新;而在App_TaskJoystick 去掉OSSemPend(InfoSem,0,&err)后KEY1和KEY 2可以正常刷新??
一:按书上说高优先级任务获得执行权,那么App_TaskKbd申请信号量后应该是KEY 1获得执行权可以进行刷新,但是现在按下KEY 1也无反应;
二:而在KEY 1执行完后,通过OSTimeDlyHMSM(0, 0, 0, 10)使当前任务App_TaskKbd延时进入等待状态,App_TaskJoystick (KEY 2)如若申请执行权应该可以获得才对,但是现在我在KEY 2中申请执行权后KEY 1 KEY 2按键都无法执行刷新;
三:如果App_TaskJoystick (KEY 2)不申请执行权,该任务是不是就一直处于运行状态,所以可以完成串口刷新?但UCOS不是使高优先级任务先运行吗,为什么可以使另一个任务一直在运行??是不是当高优先级需要运行时使高优先级任务先完成,然后再运行剩下的??
问题有些琐碎,麻烦大家不吝指教解答下,看了书但对信号量的理解还是不是很懂,谢谢了 在操作系统开始运行前使用下面的语句建立一个信号量。
RandomSem = OSSemCreate(1); /* 建立随机数信号量 */
这样,我们就建好了一个叫RandomSem的信号量,可以使用它对共享资源进行管理。假设有两个任务Task1和Task2都需要产生随机数,则必须按照下面的格式进行代码编写。
任务一:
voidTask1(void *pdata)
{
INT8Ux;
INT8U err;
for (;;)
{
OSSemPend(RandomSem, 0, &err);/*请求信号量*/
x = random(80); /* 获取80以内的一个随机数*/
OSSemPost(RandomSem); /*释放信号量*/
/* 其他代码 */
}
}
任务二:
voidTask2(void *pdata)
{
INT8Ux;
INT8U err;
for (;;)
{
OSSemPend(RandomSem, 0, &err);/*请求信号量*/
x = random(20); /* 获取20以内的一个随机数*/
OSSemPost(RandomSem); /*释放信号量*/
/* 其他代码 */
}
}
页:
[1]