clear sky . 2024-02-16 18:03 采纳率: 23.1%
浏览 2

freertos二值信号量任务之间通信时串口无输出


 #include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "freertos.h"

#include "task.h"
#include "Freertos.h"
#include "queue.h"
#include "usart.h"
#include "semphr.h"
TaskHandle_t myTaskHandle1;
TaskHandle_t myTaskHandle2;
SemaphoreHandle_t xBinarySemaphore ;

static void Task1( void *pvParameters );        
static void Task2( void *pvParameters );//static void TaskA( void *pvParameters );    
SemaphoreHandle_t xbinarySemaphore;
    
        
    
int main(void)
{
    vSemaphoreCreateBinary( xBinarySemaphore);
    
    USART_Config();
        
    
        
//    xTaskCreate(TaskA,"myTaskA",1000,NULL,2,NULL);    

    xTaskCreate(Task1,"myTask1",1000,NULL,2,NULL);
    xTaskCreate(Task2,"myTask2",1000,NULL,2,NULL);
    vTaskStartScheduler();

    while (1)
    {        
        
        
        
        
        
        
        
        
        
    
    
    

    }
}



//static void MyTask0(void* arg){
//        const char data0[20]="myTask0 running";
//        while(1){count0++;


//            taskENTER_CRITICAL(); 
//        //printf("count0=%d\n",count0);
//        taskEXIT_CRITICAL();
//            tasksign0=1;tasksign1=0;tasksign2=0;        
//            xQueueSend(myQueueHandler,data0,0);
//            //vTaskDelay(200);
//        }
//}


static void Task1( void *pvParameters ) 
{
    while (1)
    {      
        xSemaphoreTake(xbinarySemaphore, portMAX_DELAY); 
        taskENTER_CRITICAL();               
        printf("task1 running\n"); 
        taskEXIT_CRITICAL();
        xSemaphoreGive(xbinarySemaphore);
        vTaskDelay(200);//Delay_ms(20);        
    }
}









static void Task2(void *pvParameters)
{
    while (1)
    {
       
        
        xSemaphoreTake(xbinarySemaphore, portMAX_DELAY); // 等待二值信号量
            // 执行任务2的操作
            taskENTER_CRITICAL();
            printf("task2 running\n");
            taskEXIT_CRITICAL();           
            xSemaphoreGive(xbinarySemaphore);
            vTaskDelay(200);//Delay_ms(20);     
        
     }
}

为什么上述代码在使用MDK编译时不能在串口输出

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-02-16 18:06
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    问题分析:

    1. 代码中使用了信号量来实现任务之间的同步与通信。
    2. 在Task1中使用了二值信号量xSemaphoreTake,但是在Task2中使用了未初始化的binarySemaphore。
    3. 在Task1和Task2中都使用了taskENTER_CRITICAL和taskEXIT_CRITICAL来保护对串口的访问,但这可能会导致串口的阻塞。
    4. 可能的原因之一是串口输出的频率太高,导致一方无法及时输出。

    解决方案:

    1. 确保在使用信号量前对其进行正确的初始化。在main函数中创建二值信号量时,应使用xBinarySemaphore而不是binarySemaphore。
    2. 考虑使用更加灵活的信号量机制,如互斥信号量或计数信号量,以满足任务之间的同步与通信需求。
    3. 考虑降低串口输出的频率,或者使用更加高效的输出方式,以避免串口阻塞的问题。
    4. 确保任务的优先级设置合理,避免优先级反转等问题导致的任务无法执行的情况。

    修改后的代码如下所示:

    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    #include "freertos.h"
    #include "task.h"
    #include "usart.h"
    #include "semphr.h"
    
    TaskHandle_t myTaskHandle1;
    TaskHandle_t myTaskHandle2;
    SemaphoreHandle_t xBinarySemaphore;
    
    static void Task1(void *pvParameters);
    static void Task2(void *pvParameters);
    
    int main(void) {
        // 创建二值信号量
        xBinarySemaphore = xSemaphoreCreateBinary();
        if (xBinarySemaphore == NULL) {
            // 二值信号量创建失败,处理错误
        }
    
        USART_Config();
    
        // 创建任务
        xTaskCreate(Task1, "myTask1", 1000, NULL, 2, &myTaskHandle1);
        xTaskCreate(Task2, "myTask2", 1000, NULL, 2, &myTaskHandle2);
    
        vTaskStartScheduler();
    
        while (1) {
            // 主循环
        }
    }
    
    static void Task1(void *pvParameters) {
        while (1) {
            // 等待二值信号量
            if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
                // 执行任务1的操作
                taskENTER_CRITICAL();
                printf("task1 running\n");
                taskEXIT_CRITICAL();
    
                // 释放信号量
                xSemaphoreGive(xBinarySemaphore);
    
                vTaskDelay(20);
            }
        }
    }
    
    static void Task2(void *pvParameters) {
        while (1) {
            // 等待二值信号量
            if (xSemaphoreTake(xBinarySemaphore, portMAX_DELAY) == pdTRUE) {
                // 执行任务2的操作
                taskENTER_CRITICAL();
                printf("task2 running\n");
                taskEXIT_CRITICAL();
    
                // 释放信号量
                xSemaphoreGive(xBinarySemaphore);
    
                vTaskDelay(20);
            }
        }
    }
    

    这样修改后,应该可以解决串口无输出的问题。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 修改了问题 2月16日
  • 修改了问题 2月16日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 一道ban了很多东西的pyjail题
  • ¥15 关于#r语言#的问题:如何将生成的四幅图排在一起,且对变量的赋值进行更改,让组合的图漂亮、美观@(相关搜索:森林图)
  • ¥15 C++识别堆叠物体异常
  • ¥15 微软硬件驱动认证账号申请
  • ¥15 有人知道怎么在R语言里下载Git上的miceco这个包吗
  • ¥15 GPT写作提示指令词
  • ¥20 根据动态演化博弈支付矩阵完成复制动态方程求解和演化相图分析等
  • ¥20 关于DAC输出1.000V对分辨率和精度的要求
  • ¥15 华为超融合部署环境下RedHat虚拟机分区扩容问题
  • ¥15 哪位能做百度地图导航触点播报?