Free RTOS-11信号量4递归互斥量
创建一个互斥变量,每次用一个资源就上一次锁,再用一个资源就再上一次锁。释放也是如此。和裸机 的运行差不多。
SemaphoreHandle_t xMutexHandle; // 互斥锁和二进制信号量都由 SemaphoreHandle_t 类型的变量引用
void vTaskCode1(void *pvParam) // 任务
{
while (1)
{
printf("----------!\n");
printf("vTaskCode1\n");
xSemaphoreTakeRecursive(xMutexHandle, portMAX_DELAY); //
printf("GET A\n");
for (int i = 0; i < 10; i++)
{
printf("vTask1 i A%d\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
xSemaphoreTakeRecursive(xMutexHandle, portMAX_DELAY); //
for (int i = 0; i < 10; i++)
{
printf("vTask i B%d\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("vTaskCode B OVER\n");
xSemaphoreGiveRecursive(xMutexHandle);
vTaskDelay(3000 / portTICK_PERIOD_MS);
printf("vTaskCode A OVER\n");
xSemaphoreGiveRecursive(xMutexHandle);
vTaskDelay(3000 / portTICK_PERIOD_MS);
}
}
void vTaskCode2(void *pvParam) // 任务
{
vTaskDelay(1000 / portTICK_PERIOD_MS);
while (1)
{
printf("----------!\n");
printf("vTaskCode2\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
xSemaphoreTakeRecursive(xMutexHandle, portMAX_DELAY); //
printf("GET B\n");
for (int i = 0; i < 10; i++)
{
printf("vTask2 i A%d\n", i);
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
printf("vTaskCode2 B OVER\n");
xSemaphoreGiveRecursive(xMutexHandle);
vTaskDelay(3000 / portTICK_PERIOD_MS);
}
}
void app_main(void)
{
xMutexHandle = xSemaphoreCreateRecursiveMutex(); // 创建一个递归互斥锁
vTaskSuspendAll();
xTaskCreate(vTaskCode1, // 任务函数
"task1", // 名字
4096, // 分配内存
NULL, // 传参数
2, // 任务优先级
NULL); // 句柄
xTaskCreate(vTaskCode2, "task2", 4096, NULL, 3, NULL);
xTaskResumeAll();
}
更多推荐


所有评论(0)