weilj123 发表于 2010-8-31 23:21

互斥信号量为什么还是被优先级别高的打断了?

互斥信号量为什么还是被优先级别高的打断了?是我理解错了吗?程序和运行结果如下:
/*
*************************************************************************************************************
**                           分配各任务的堆栈容量                              **
*************************************************************************************************************
*/
OS_STK Stack_Task_0;
OS_STK Stack_Task_1;
OS_STK Stack_Task_3;
OS_STK Stack_Task_4;
OS_STK Stack_Task_5;
void open(void)
{
Uart_Printf(0,"XXXXX XXXXX XXXXX");
}
/*
*************************************************************************************************************
- 函数名称 : Task_1
- 函数说明 : 无
- 输入参数 : pdata
- 输出参数 : 无
*************************************************************************************************************
*/
void Task_1(void *pdata)
{
INT8U err;
    for(;;)
    {
   Uart_Printf(0,"\r\nTask1:");
open();
OSTimeDly(3);
    }
}
/*
*************************************************************************************************************
- 函数名称 : Task_1
- 函数说明 : 无
- 输入参数 : pdata
- 输出参数 : 无
*************************************************************************************************************
*/
void Task_3(void *pdata)
{
INT8U err;
    for(;;)
    {
   Uart_Printf(0,"\r\nTask2:");
   OSMutexPend(Sem_Int_Disp,0,&err);
   if(err == OS_NO_ERR)
      {
   open();
}
OSMutexPost(Sem_Int_Disp);
OSTimeDly(3);   
    }
}
/*
*************************************************************************************************************
- 函数名称 : Task_1
- 函数说明 : 无
- 输入参数 : pdata
- 输出参数 : 无
*************************************************************************************************************
*/
void Task_4(void *pdata)
{
INT8U err;
    for(;;)
    {
      Uart_Printf(0,"\r\nTask3:");
   OSMutexPend(Sem_Int_Disp,0,&err);
   if(err == OS_NO_ERR)
      {
   open();
}
OSMutexPost(Sem_Int_Disp);
   OSTimeDly(3);   
    }
}
/*
*************************************************************************************************************
- 函数名称 : Task_Nrf
- 函数说明 : 系统启动后运行的第一个任务,读卡片信息优先级为3
- 输入参数 : pdata
- 输出参数 : 无
*************************************************************************************************************
*/
void Task_5(void *pdata)
{
INT8U err;
    for (;;)
    {
   Uart_Printf(0,"\r\nTask4:");
   OSMutexPend(Sem_Int_Disp,0,&err);
   if(err == OS_NO_ERR)
      {
      open();
}
OSMutexPost(Sem_Int_Disp);
OSTimeDly(3);
    }
}
/*
*************************************************************************************************************
- 函数名称 : Task_START
- 函数说明 : 系统启动后运行的第一个任务,读卡片信息优先级为3
- 输入参数 : pdata
- 输出参数 : 无
*************************************************************************************************************
*/
void Task_Start(void *pdata)
{
INT8U err;
    Rtc_Tick_Init();                     //打开时钟节拍,让操作系统跑起来      
Sem_Int_Disp= OSMutexCreate(9,&err); //显示用的互斥信号量
OSTaskCreate(Task_1, (void *)0, (OS_STK *)&Stack_Task_1[(STACKSIZE) - 1], 11);   //等待按键任务 KEY
OSTaskCreate(Task_3, (void *)0, (OS_STK *)&Stack_Task_3[(STACKSIZE) - 1], 12);   //等待打卡扣钱操作
OSTaskCreate(Task_4, (void *)0, (OS_STK *)&Stack_Task_4[(STACKSIZE) - 1], 13);   //等待计算价格
OSTaskCreate(Task_5, (void *)0, (OS_STK *)&Stack_Task_5[(STACKSIZE) - 1], 14);   //在任务里创建另一个任务
    for(;;)
    {
   Uart_Printf(0,"\r\nTask5:");
   OSMutexPend(Sem_Int_Disp,0,&err);
   if(err == OS_NO_ERR)
      {
   open();
}
OSMutexPost(Sem_Int_Disp);
OSTimeDly(3);   
    }
}
/*
*************************************************************************************************************
- 函数名称 : Main(void)
- 函数说明 : 系统的主程序入口
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void Main(void)                           
{
unsigned char i;
unsigned short j;
   Target_Init();                  //ARMII实验系统的初始化,包括CPU板
   BEEP_H();         
   BEEP_L();
OSInit();                           // 操作系统的初始化
OSTaskCreate(Task_Start, (void *)0, (OS_STK *)&Stack_Task_0, 15);   //创建任务一
   OSStart();
}

以上程序建立了5个任务,再建了一个互斥信号量等级为9,其它任务级别分别为:11-15.
我的理解是虽然它们都共用了一个函数open();但是由于加了互斥信号量,运行结果应该是:
Task1:XXXXX XXXXX XXXXX
Task2:XXXXX XXXXX XXXXX
Task3:XXXXX XXXXX XXXXX
Task4:XXXXX XXXXX XXXXX
Task1:XXXXX XXXXX XXXXX
Task2:XXXXX XXXXX XXXXX
Task5:XXXXX XXXXX XXXXX
Task3:XXXXX XXXXX XXXXX
总之XXXXX应该是连续的(XXXXX XXXXX XXXXX),因为有互斥信号量
但实际运行结果是:
Task1:XXXXX XXXXX XXXXX
Task2:XXXXX XXXXX XXXXX
Task3:XXX
Task1:XXXXX XXXXX XXXXXXX XX
Task2:XXX XXXXXXXXXX XXXXX X
Task1:XXXXX XXXXX XXXXXXXXX
Task4:XXXXX XXXXX XXXXX
Task
Task1:XXXXX XXXXX XXXXX
Task2:XXXXX XXXXX XXXXX
Task3:XX
Task1:XXXXX XXXXX XXXXXXXX X
Task2:XXXX XXXXXXXXXX XXXXX
Task1:XXXXX XXXXX XXXXXXXXXX
Task4:XXXXX XXXXX XXXXX5:XXX
也就是说,当我运行到Task3:XXX应该是Task3:XXXXX XXXXX XXXXX
而不会被任务一打断,造成结果为Task3:XXX
Task1:XXXXX XXXXX XXXXXXX XX,因为此时任务3的级别被互斥信号量提高到9,不会被级别为11的打断,但现在实际运行中被打断了,是我理解有误吗?希望大家能明白我的意思(有点乱).
希望前辈们给予指点.

weilj123 发表于 2010-9-1 18:02

晕,总感觉21IC的不热情

computer00 发表于 2010-9-1 19:57

啥子操作系统?跟一下源码吧~~~

airwill 发表于 2010-9-7 12:34

本人认为系统运行地很正常.
task1 没有申请 互斥量, 它的优先级高于 task3, 当然可以在task3时, 占先而执行.
task2 在没有申请互斥量时, 也能显示字符串 "task2", 所以 TASK1 后面的那行 TASK2 也能解释了.

antlantic 发表于 2010-9-7 12:52

你问的应该是高优先级的互斥量被低优先级的任务给打断了?

antlantic 发表于 2010-9-8 12:38

回家翻了翻书, 互斥量使用优先级继承的方法来保护共享资源.当资源被低优先级task占用, 高优先级task过来抢, 内核就会把低优先级task提升上去.
Task1:XXXXX XXXXX XXXXX    // prio= 11
Task2:XXXXX XXXXX XXXXX    // prio= 12
Task3:XXX                              // prio= 13
Task1:XXXXX XXXXX XXXXXXX XX// prio= 11
Task2:XXX XXXXXXXXXX XXXXX X   // prio= 12
Task1:XXXXX XXXXX XXXXXXXXX    // prio= 11
Task4:XXXXX XXXXX XXXXX            // prio= 14

由于task1没有用互斥量, 那在时间中断过后, 内核就会调用优先级最高的task1。
注意这时并没有出现抢资源而提升优先级的现象.

所以去掉Task1, 就能出现你想看到的打印输出.

senioryzc 发表于 2010-9-8 15:21

应该是楼上说的那样,从结果也能看来,只出现过task 1打断其他其他任务的printf

zhang__jacky 发表于 2010-10-10 09:40

我在调试程序的时候也发现,一个任务还没有释放互斥信号量,别的任务已经执行OSMutexPend()及下面的语句了,不是需得到互斥信号量才能向下执行的吗?在看

zhang__jacky 发表于 2010-10-10 11:08

问题解决了,我的问题是没有把OSMutexCreate()赋给互斥信号量
页: [1]
查看完整版本: 互斥信号量为什么还是被优先级别高的打断了?