生活随笔
收集整理的这篇文章主要介绍了
互斥信号量解决任务间资源共享问题
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
1 互斥信号量解决任务间资源共享问题
1.1 工作原理
实例:tinyOS中的实现
1.2 任务访问流程
代码:
#include "tinyOS.h"
#include "app.h"
#include "hal.h"static tTask task1
;
static tTask task2
;
static tTask task3
;
static tTask task4
; static tTaskStack task1Env
[TASK1_ENV_SIZE
];
static tTaskStack task2Env
[TASK2_ENV_SIZE
];
static tTaskStack task3Env
[TASK3_ENV_SIZE
];
static tTaskStack task4Env
[TASK4_ENV_SIZE
]; int task1Flag
;
int task2Flag
;
int task3Flag
;
int task4Flag
; static uint32_t shareCount
= 0; static tMutex shareCountMutex
;
void shareCountInit
(uint32_t count
) {shareCount
= count
;
}
static uint32_t realCount
= 0;
void shareCountIncrease
(uint32_t count
, int interrupt
) {realCount
+= count
;if (interrupt
== 0) {shareCount
+= count
;} else {uint32_t var
= shareCount
;var
= var
+ count
;interruptByOtherTask(); shareCount
= var
;}
}
uint32_t shareCountGet
(void) {return shareCount
;
}
void task1Entry
(void *param
) {uint32_t before
;#if 1tMutexWait(&shareCountMutex
, 0);shareCountIncrease(1, 1);tMutexNotify(&shareCountMutex
);xprintf("Task1 S1:%d/%d\n", shareCountGet(), realCount
);
#elsebefore
= shareCountGet();shareCountIncrease(1, 0);interruptByOtherTask(); xprintf("Task1 S2:%d/%d\n", before
+ 1, realCount
);
#endiffor (;;) {tTaskDelay(1);}
}
void task2Entry
(void *param
) {uint32_t before
;#if 1tMutexWait(&shareCountMutex
, 0);shareCountIncrease(1, 0);tMutexNotify(&shareCountMutex
);xprintf("Task2 S1:%d/%d\n", shareCountGet(), realCount
);
#elsebefore
= shareCountGet();shareCountIncrease(1, 0);xprintf("Task2 S2:%d/%d\n", before
+ 1, realCount
);
#endiffor (;;) {tTaskDelay(10);}
}
void task3Entry
(void *param
) {for (;;) {task3Flag
= 1;tTaskDelay(1);task3Flag
= 0;tTaskDelay(1);}
}
void task4Entry
(void *param
) {for (;;) {task4Flag
= 1;tTaskDelay(1);task4Flag
= 0;tTaskDelay(1);}
}
void tInitApp
(void) {halInit();tMutexInit(&shareCountMutex
);shareCountInit(0);tTaskInit(&task1
, task1Entry
, (void *) 0x0, TASK1_PRIO
, task1Env
, sizeof(task1Env
));tTaskInit(&task2
, task2Entry
, (void *) 0x0, TASK2_PRIO
, task2Env
, sizeof(task2Env
));tTaskInit(&task3
, task3Entry
, (void *) 0x0, TASK3_PRIO
, task3Env
, sizeof(task3Env
));tTaskInit(&task4
, task4Entry
, (void *) 0x0, TASK4_PRIO
, task4Env
, sizeof(task4Env
));
}
1.3 总结
参考资料:
手把手教你学用嵌入式操作系统
总结
以上是生活随笔为你收集整理的互斥信号量解决任务间资源共享问题的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。