Syke894 2024-03-21 10:43 采纳率: 0%
浏览 63

vtaskdelay卡死程序


#include "stm32f10x.h"
#include <stdio.h>
#include "led.h"
#include "oled.h"
#include "bmp.h"
#include "kkey.h"
#include "drv_usart.h"
#include "FreeRTOS.h"
#include "task.h"  
#include "usart.h"
//#include "figner.h"
#include "usart3.h"
#include "as608.h"
#include "malloc.h"
#include "zhiwen_open.h"
#include "queue.h"
#include "delay.h"



//任务句柄
static TaskHandle_t start_task_handle = NULL;  //创建任务句柄
static TaskHandle_t Receive_Task_Handle  = NULL;     //Receive_Task_Handle任务句柄
static TaskHandle_t Send_Task_Handle  = NULL;    //Send_Task_Handle按键任务句柄


QueueHandle_t Test_Queue =NULL;


#define  QUEUE_LEN    4   /* 队列的长度,最大可包含多少个消息 */
#define  QUEUE_SIZE   4   /* 队列中每个消息大小(字节) */



static void start_task(void *arg);
static void Receive_Task(void *arg);
static void Send_Task(void *arg);


int flag = 1;


int main(void)
{
      
    
    BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */
    
     
    NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
    
                
    led_init();
    USART_Config();
    //usart_init();
    delay_init(SysTick_CLKSource_HCLK);
//    SysTick_Init(72);
    


    
     printf("这是一个freertos消息队列实验\n");
     printf("按下KEY1或者KEY2发送队列消息\n");
     printf("Receive任务接收到消息在串口回显\n\n");
    
    
//创建开始任务
    xTaskCreate(start_task, "start_task", 512, NULL, 1, &start_task_handle);

    
    
    /* 启动任务,开启调度 */
    if(pdPASS == xReturn)
    vTaskStartScheduler();   
  else
    return -1;
    
    while(1);  //一般不会执行到这里
    

}


void start_task(void *arg)
{
    

  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */


    //进入临界区
    taskENTER_CRITICAL();  
    
    //创建test_queue
    Test_Queue = xQueueCreate(QUEUE_LEN,QUEUE_SIZE);
    
    if(NULL != Test_Queue)
    printf("创建Test_Queue消息队列成功!\r\n");

    
    //创建任务一
    
    xTaskCreate(Receive_Task, "Receive_Task", 512, NULL, 2, &Receive_Task_Handle);
    if(pdPASS == xReturn)
    printf("创建Receive_Task成功!\r\n");
    
    
    //创建任务二
    
    xTaskCreate(Send_Task, "Send_Task", 512, NULL, 3, &Send_Task_Handle);
    if(pdPASS == xReturn)
    printf("创建Send_Task成功!\r\n");


    
    //删除开始任务
    vTaskDelete(start_task_handle);
    
    //退出临界区
    taskEXIT_CRITICAL();
  
}



static void Receive_Task(void* parameter)
{    
  BaseType_t xReturn = pdTRUE;/* 定义一个创建信息返回值,默认为pdTRUE */
  uint32_t r_queue;    /* 定义一个接收消息的变量 */
    UBaseType_t num = 0;
  UBaseType_t num1 = 0;
    
  while (1)
  {
        flag = 0;
    xReturn = xQueueReceive( Test_Queue,    /* 消息队列的句柄 */
                             &r_queue,      /* 发送的消息内容 */
                             portMAX_DELAY); /* 等待时间 一直等 */
        
        num = uxQueueMessagesWaiting(Test_Queue);
        num1 = uxQueueSpacesAvailable(Test_Queue);
        
        
    if(pdTRUE == xReturn){
      printf("本次接收到的数据是%d\n\n",r_queue);        
      printf("队列中可用数据的个数%d\n\n",num);
          printf("队列中可用用空间的个数%d\n\n",num1);
    }else{
      printf("数据接收出错,错误代码0x%lx\n",xReturn);
        }
    //    xQueueReset(Test_Queue);  清除队列里面的东西
        
        
        
   
  }
    
    
    
}




static void Send_Task(void* parameter)
{     
  BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为pdPASS */

    
  uint32_t send_data1 = 1;
  uint32_t send_data2 = 2;
    const TickType_t xDelay = 20 / portTICK_PERIOD_MS;
    TickType_t tick = xTaskGetTickCount();
  while (1)
  {
        flag  = 1;
    if( Key_get () == 1 )
    {/* K1 被按下 */
      printf("发送消息send_data1!\n");
            xReturn = xQueueSend( Test_Queue,&send_data1,0 );  //消息队列句柄,发送消息的内容,等待时间
      if(pdPASS == xReturn)
        printf("消息send_data1发送成功!\n\n");
    } 
    if( Key_get () == 2 )
    {/* K2 被按下 */
      printf("发送消息send_data2!\n");
      xReturn = xQueueSend( Test_Queue,&send_data2,0 );       
      if(pdPASS == xReturn)
        printf("消息send_data2发送成功!\n\n");
    }
        vTaskDelay(20); 

  }
}




调用vtaskdelay卡死怎么办 串口显示
[10:31:46.528]收←◆这是一个freertos消息队列实验
按下KEY1或者KEY2发送队列消息
Receive任务接收到消息在串口回显

创建Test_Queue消息队列成功!
创建Receive_Task成功!
创建Send_Task成功!

[10:31:49.673]收←◆发送消息send_data1!
消息send_data1发送成功!

[10:31:49.728]收←◆本次接收到的数据是1

队列中可用数据的个数0

队列中可用用空间的个数4

再按按键没反应了

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-21 10:43
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    题目:这段代码实现了什么功能? 这段代码实现了一个基于FreeRTOS的消息队列的实验,通过按键发送消息到队列中,Receive_Task任务接收到消息后通过串口回显输出。代码中使用了任务句柄、队列句柄和临界区的使用。具体实现包括:
    1. 创建一个长度为4,每个消息大小为4字节的队列Test_Queue。
    2. 创建三个任务,start_task任务、Receive_Task任务和Send_Task任务。其中start_task任务在进入临界区时创建了Test_Queue消息队列,并将Test_Queue队列的句柄传递给Receive_Task任务和Send_Task任务。创建成功后,start_task任务删除自身的任务。
    3. Receive_Task任务通过无限循环持续监听Test_Queue队列,如果收到队列消息,则通过串口回显输出消息内容,并统计队列中当前等待的消息数量和队列中剩余的可用空间。
    4. Send_Task任务通过监听按键输入,如果按下了KEY1或KEY2,则向Test_Queue中发送一个消息。
    5. main函数中初始化多个外设,并启动调度器开始运行任务。 代码示例: (部分关键代码)
    //创建任务句柄
    static TaskHandle_t start_task_handle = NULL;  //开始任务句柄
    static TaskHandle_t Receive_Task_Handle  = NULL;     //Receive_Task_Handle任务句柄
    static TaskHandle_t Send_Task_Handle  = NULL;    //Send_Task_Handle按键任务句柄
    QueueHandle_t Test_Queue = NULL;
    #define  QUEUE_LEN    4   /* 队列的长度,最大可包含多少个消息 */
    #define  QUEUE_SIZE   4   /* 队列中每个消息大小(字节) */
    static void start_task(void *arg);  //开始任务
    static void Receive_Task(void *arg);  //接收任务
    static void Send_Task(void *arg);  //发送任务
    int flag = 1;
    int main(void)
    {
        BaseType_t xReturn = pdPASS;  //定义一个创建信息返回值,默认为pdPASS
        NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
        led_init();
        USART_Config();
        delay_init(SysTick_CLKSource_HCLK);
        printf("这是一个freertos消息队列实验\n");
        printf("按下KEY1或者KEY2发送队列消息\n");
        printf("Receive任务接收到消息在串口回显\n\n");
        //创建开始任务
        xTaskCreate(start_task, "start_task", 512, NULL, 1, &start_task_handle); 
        /* 启动任务,开启调度 */
        if(pdPASS == xReturn)
            vTaskStartScheduler(); 
        else
            return -1;
        while(1);  //一般不会执行到这里
    }
    void start_task(void *arg)
    {
        BaseType_t xReturn = pdPASS;  //定义一个创建信息返回值,默认为pdPASS
        //进入临界区
        taskENTER_CRITICAL();          
        //创建test_queue
        Test_Queue = xQueueCreate(QUEUE_LEN,QUEUE_SIZE);       
        if(NULL != Test_Queue)
            printf("创建Test_Queue消息队列成功!\r\n");
        //创建任务一
        xTaskCreate(Receive_Task, "Receive_Task", 512, NULL, 2, &Receive_Task_Handle);
        if(pdPASS == xReturn)
            printf("创建Receive_Task成功!\r\n");
        //创建任务二
        xTaskCreate(Send_Task, "Send_Task", 512, NULL, 3, &Send_Task_Handle);
        if(pdPASS == xReturn)
            printf("创建Send_Task成功!\r\n");
        //删除开始任务
        vTaskDelete(start_task_handle); 
        //退出临界区
        taskEXIT_CRITICAL();
    }
    static void Receive_Task(void* parameter)
    {
        BaseType_t xReturn = pdTRUE;  //定义一个创建信息返回值,默认为pdTRUE
        uint32_t r_queue;    //定义一个接收消息的变量
        UBaseType_t num = 0;  //统计队列中当前等待的消息数量
        UBaseType_t num1 = 0;  //统计队列中剩余的可用空间
        while (1)
        {
            flag = 0;
            xReturn = xQueueReceive( Test_Queue,  /* 消息队列的句柄 */
                                     &r_queue,      /* 发送的消息内容 */
                                     portMAX_DELAY); /* 等待时间 一直等 */
            num = uxQueueMessagesWaiting(Test_Queue);
            num1 = uxQueueSpacesAvailable(Test_Queue);
            if(xReturn == pdPASS)
            {
                printf("Receive_Task receive Queue Message : %d\n",r_queue);
                printf("The num of message waiting is %d, the num of space left is %d\n",num,num1);
            }
        }
    }
    static void Send_Task(void *arg)
    {
        while(1)
        {
            if(!flag)
            {
                if(KEY1 == KEY_Scan(1))
                {
                    if(pdFALSE == xQueueSend(Test_Queue, &KEY1, portMAX_DELAY))
                        printf("Send message failed!\n");
                    else
                        printf("Send message success!\n");
                    flag = 1;
                }
                else if(KEY2 == KEY_Scan(2))
                {
                    if(pdFALSE == xQueueSend(Test_Queue, &KEY2, portMAX_DELAY))
                        printf("Send message failed!\n");
                    else
                        printf("Send message success!\n");
                    flag = 1;
                }
            }
        }
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 3月21日

悬赏问题

  • ¥20 关于游戏c++语言代码问题
  • ¥15 如何制作永久二维码,最好是微信也可以扫开的。(相关搜索:管理系统)
  • ¥15 delphi indy cookie 有效期
  • ¥15 labelme打不开怎么办
  • ¥35 按照图片上的两个任务要求,用keil5写出运行代码,并在proteus上仿真成功,🙏
  • ¥15 免费的电脑视频剪辑类软件如何盈利
  • ¥30 MPI读入tif文件并将文件路径分配给各进程时遇到问题
  • ¥15 pycharm中导入模块出错
  • ¥20 Ros2 moveit2 Windows环境配置,有偿,价格可商议。
  • ¥15 有关“完美的代价”问题的代码漏洞