打印

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

[复制链接]
2293|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
weilj123|  楼主 | 2010-8-31 23:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
互斥信号量为什么还是被优先级别高的打断了?是我理解错了吗?程序和运行结果如下:
/*
*************************************************************************************************************
**                           分配各任务的堆栈容量                              **
*************************************************************************************************************
*/
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的打断,但现在实际运行中被打断了,是我理解有误吗?希望大家能明白我的意思(有点乱).
希望前辈们给予指点.

相关帖子

沙发
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 也能解释了.

使用特权

评论回复
5
antlantic| | 2010-9-7 12:52 | 只看该作者
你问的应该是高优先级的互斥量被低优先级的任务给打断了?

使用特权

评论回复
6
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, 就能出现你想看到的打印输出.

使用特权

评论回复
7
senioryzc| | 2010-9-8 15:21 | 只看该作者
应该是楼上说的那样,从结果也能看来,只出现过task 1打断其他其他任务的printf

使用特权

评论回复
8
zhang__jacky| | 2010-10-10 09:40 | 只看该作者
我在调试程序的时候也发现,一个任务还没有释放互斥信号量,别的任务已经执行OSMutexPend()及下面的语句了,不是需得到互斥信号量才能向下执行的吗?在看

使用特权

评论回复
9
zhang__jacky| | 2010-10-10 11:08 | 只看该作者
问题解决了,我的问题是没有把OSMutexCreate()赋给互斥信号量

使用特权

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

本版积分规则

29

主题

126

帖子

0

粉丝