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