打印

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

[复制链接]
2109|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
weilj123|  楼主 | 2010-8-31 23:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

互斥信号量为什么还是被优先级别高的打断了?是我理解错了吗?程序和运行结果如下:
/*
*************************************************************************************************************
**                           分配各任务的堆栈容量                              **
*************************************************************************************************************
*/
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的打断,但现在实际运行中被打断了,是我理解有误吗?希望大家能明白我的意思(有点乱).
希望前辈们给予指点.



相关帖子

沙发
xinzha| | 2010-9-1 10:13 | 只看该作者
task_1没有被任何东西阻塞,三个时间片之后就要拿回cpu。

使用特权

评论回复
板凳
weilj123|  楼主 | 2010-9-1 18:04 | 只看该作者
谢谢xinzha了,task_1任务是等级最高的,在它运行中,其它任何是没有办法拿回CPU,其它的在运行的时候又会将等级提到高于task_1,所以也没有办法拿回CPU,

使用特权

评论回复
地板
weilj123|  楼主 | 2010-9-1 18:05 | 只看该作者
问题找到了,是因为我Uart_printf这个函数没有用互斥信号量保护起来

使用特权

评论回复
5
gtekled| | 2012-2-10 17:01 | 只看该作者
来看看,学习一下!

使用特权

评论回复
6
ledmary| | 2013-6-28 16:26 | 只看该作者
在学校是,还会写点。现在完全忘完了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

126

帖子

0

粉丝