首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

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

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

互斥信号量为什么还是被优先级别高的打断了?是我理解错了吗?程序和运行结果如下:
/*
*************************************************************************************************************
**                          
分配各任务的堆栈容量                            **
*************************************************************************************************************
*/
OS_STK Stack_Task_0[STACKSIZE];
OS_STK Stack_Task_1[STACKSIZE];
OS_STK Stack_Task_3[STACKSIZE];
OS_STK Stack_Task_4[STACKSIZE];
OS_STK Stack_Task_5[STACKSIZE];
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[STACKSIZE - 1], 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的打断,但现在实际运行中被打断了,是我理解有误吗?希望大家能明白我的意思(有点乱).
希望前辈们给予指点.
task_1没有被任何东西阻塞,三个时间片之后就要拿回cpu。
做人要做懒羊羊啊!
返回列表