/*优先级转置算法------ 使用互斥信号量时
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
*/
armprog.rar_VxWorks ARM_armprog
版权申诉
76 浏览量
2022-09-24
12:41:41
上传
评论
收藏 5KB RAR 举报
JonSco
- 粉丝: 74
- 资源: 1万+
最新资源
- DHCP+NAPT+RIP+ACL
- Qt实战Qt项目(7)Qt实现网页浏览器
- Unity-WebGL配置系统教程(含iis本地部署)
- GIS图幅号计算工具,用于计算图幅号
- Python中Hadoop MapReduce的一个简单示例.zip
- Panoply软件是大名鼎鼎的NASA下属的GISS研究所开发的可视化软件,该软件可以实现对地学常用数据的读取,其中包括netC
- 一些高质量的学习Ruby的资源清单.zip
- 基于STM32智能家居(智能云)
- 适合江苏地带的别墅小院子图纸D038-两层-11.04&11.94米-施工图.dwg
- 农村小别墅图纸四合院图纸D037-两层-13.20&12.90米-施工图.dwg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈