创建一个互斥变量,每次用一个资源就上一次锁,再用一个资源就再上一次锁。释放也是如此。和裸机 的运行差不多。

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();

}

Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐