📄 7seminversion.c
字号:
/*优先级转置算法------ 使用互斥信号量时
high 阻塞时间长,但没有media长,low资源正常情况下会被media 占用
但是low占用信号量资源时不情愿被media抢占
这时如果high因为此信号量阻塞,就被迫延长等待时间
采用“优先级转置”
low此时优先级与阻塞在次资源的任务的最高优先级相同
semId=semMCreate(SEM_Q_PRIORITY | SEM_INVERSION_SAFE)*/
#include "vxWorks.h"
#include "taskLib.h"
#include "semLib.h"
void prioHigh(void);
void prioMedium(void);
void prioLow(void);
#define ITER 3
#define HIGH 102
#define MEDIUM 103
#define LOW 104
#define LONG_TIME 3000000
SEM_ID semMutex;
void inversion(void)
{
printf("\n\n....................#####running###..................\n\n\n");
semMutex=semMCreate(SEM_Q_PRIORITY|SEM_INVERSION_SAFE);
// semMutex=semMCreate(SEM_Q_PRIORITY);
if(taskSpawn("task1",LOW,0x100,20000,prioLow,0,0,0,0,0,0,0,0,0,0)==ERROR)
printf("taskspawn prio low failed\n");
if(taskSpawn("task2",MEDIUM,0x100,20000,prioMedium,0,0,0,0,0,0,0,0,0,0)==ERROR)
printf("taskspawn prio medium failed\n");
if(taskSpawn("task3",HIGH,0x100,20000,prioHigh,0,0,0,0,0,0,0,0,0,0)==ERROR)
printf("taskspawn prio high failed\n");
}
/*
void timing()
{
FUNCPTR function_ptr=prioLow;
semMutex=semMCreate(SEM_Q_PRIORITY|SEM_INVERSION_SAFE);
timexN(function_ptr,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
}
//*/
void prioLow(void)
{
int i,j;
printf("taskspawn prioLow\n");
for(i=0;i<ITER;i++)
{
semTake(semMutex,WAIT_FOREVER);
printf("low priority task locks semaphore\n");
for(j=0;j<LONG_TIME;j++);
printf("low priority task unlocks semaphore\n");
semGive(semMutex);/*give up semaphore*/
}
printf(".............................low priority task exit\n");
}
void prioMedium(void)
{
int i;
printf("taskspawn prioMedium\n");
taskDelay(2); /*allow time for task with the lowest priority to seize semaphore */
for(i=0;i<LONG_TIME*10;i++)
{
if(i%LONG_TIME==0)
printf("medium task running \n");
}
printf(".............................medium priority task exit\n");
}
void prioHigh(void)
{
int i,j;
printf("taskspawn prioHigh\n");
taskDelay(3);
for(i=0;i<ITER;i++)
{
printf("high priority task try to lock semaphore\n");
semTake(semMutex,WAIT_FOREVER);
printf("high priority task locks semaphore\n");
for(j=0;j<LONG_TIME;j++)
semGive(semMutex);/*give up*/
}
printf(".............................high priority task exit\n");
}
/* semMutex=semMCreate(SEM_Q_PRIORITY);
....................#####running###..................
taskspawn prioHigh
taskspawn prioMedium
taskspawn prioLow
low priority task locks semaphore
low priority task unlocks semaphore
low priority task locks semaphore
low priority task unlocks semaphore
medium task running
high priority task try to lock semaphore
medium task running
medium task running
medium task running
medium task running
medium task running
medium task running
medium task running
medium task running
medium task running
.............................medium priority task exit
high priority task locks semaphore
high priority task try to lock semaphore
high priority task locks semaphore
high priority task try to lock semaphore
high priority task locks semaphore
.............................high priority task exit
low priority task locks semaphore
low priority task unlocks semaphore
.............................low priority task exit
*/
/* semMutex=semMCreate(SEM_Q_PRIORITY|SEM_INVERSION_SAFE);
....................#####running###..................
taskspawn prioHigh
taskspawn prioMedium
taskspawn prioLow
low priority task locks semaphore
medium task running
high priority task try to lock semaphore
low priority task unlocks semaphore
high priority task locks semaphore
high priority task try to lock semaphore
high priority task locks semaphore
high priority task try to lock semaphore
high priority task locks semaphore
.............................high priority task exit
medium task running
medium task running
medium task running
medium task running
medium task running
medium task running
medium task running
medium task running
medium task running
.............................medium priority task exit
low priority task locks semaphore
low priority task unlocks semaphore
low priority task locks semaphore
low priority task unlocks semaphore
.............................low priority task exit
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -