1.刚创建的互斥量可以被成功"take"
2.“take"互斥量成功的任务,被称为"holder”,只能由它"give"互斥量;别的任务"give"不成功。
3.在 ISR 中不能使用互斥量。
4.本程序创建 2 个发送任务:故意发送大量的字符。 可以做 2 个实验:使用互斥量:可以看到任务 1、任务 2 打印的字符串没有混杂在一起。不使用互斥量:任务 1、任务 2 打印的字符串混杂在一起。
main函数
/* 互斥量句柄 */
SemaphoreHandle_t xMutex;
int main( void )
{
prvSetupHardware();
/* 创建互斥量 */
xMutex = xSemaphoreCreateMutex( );
if( xMutex != NULL )
{
/* 创建2个任务: 都是打印
* 优先级相同
*/
xTaskCreate( vSenderTask, "Sender1", 1000, (void *)1, 1, NULL );
xTaskCreate( vSenderTask, "Sender2", 1000, (void *)2, 1, NULL );
/* 启动调度器 */
vTaskStartScheduler();
}
else
{
/* 无法创建互斥量 */
}
return 0;
}
发送任务函数:
static void vSenderTask( void *pvParameters )
{
const TickType_t xTicksToWait = pdMS_TO_TICKS( 2UL );
int cnt = 0;
int task = (int)pvParameters;
int i;
char c;
/* 无限循环 */
for( ;; )
{
/* 获得互斥量: 上锁 */
xSemaphoreTake(xMutex, portMAX_DELAY);
printf("Task %d use UART count: %d, ", task, cnt++);
c = (task == 1 ) ? 'a' : 'A';
for (i = 0; i < 26; i++)
printf("%c", c + i);
printf("\r\n");
/* 释放互斥量: 开锁 */
xSemaphoreGive(xMutex);
vTaskDelay(xTicksToWait);
}
}
vSenderTask 函 数 的 for 循 环 中 xSemaphoreTake 和xSemaphoreGive 这 2 句代码保留、不保留。
保留:实验现象如下图左边,任务 1、任务 2 的打印信息没有混在一起
不保留:实验现象如下图右边,打印信息混杂在一起
原文链接:https://blog.youkuaiyun.com/qq_49864684/article/details/123255242