比神乐 发表于 2024-12-9 16:07

【AT-START-L021测评】FREERTOS之队列实验

代码:
#include "at32l021_board.h"
#include "at32l021_clock.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
#include "stdio.h"
/** @addtogroup UTILITIES_examples
* @{
*/
int cnt=0;
QueueHandle_t Key_Queue;
#define KEYMSG_Q_NUM 1
/** @addtogroup FreeRTOS_demo
* @{
*/

//unsigned char const mainSENDER_1=30;
//unsigned char const mainSENDER_2=50;
button_type at32_button_press(void);
void task1(void *pvParameters)
{
    //uint8_t key;
                BaseType_t err;
                button_type key=0;
    while(1)
    {
                                cnt++;
                               
                                        err=xQueueOverwrite(Key_Queue,&cnt);
                                        //err=xQueueSend(Key_Queue,&key,10);
                                        if(err!=pdTRUE)
                                        {
                                                printf("Queue Send Failed!\r\n");
                                        }
                                        else
                                        {
                                                printf("Queue Send Succeed!\r\n");
                                        }

      //LED0_TOGGLE();                                                /* LED0闪烁 */
      vTaskDelay(1000);                                             /* 延时1000ticks */
    }
}

/**
* @brief       task2
* @param       pvParameters : 传入参数(未用到)
* @retval      无
*/

void Keyprocess_task(void *pvParameters)
{
    uint8_t key;
    BaseType_t err;
    while(1)
    {
                                                        /* 更新数值 */
      //printf("task3正在运行!!!\r\n");/* 打印数值 */
      
                                if(Key_Queue!=NULL)
                                {
                                        err=xQueueReceive(Key_Queue,&key,portMAX_DELAY);
                                        if(err==pdTRUE)
                                        {
                                                printf("cnt value=%d\r\n",cnt);
                                        }
                                }
//                                else
//                                {
//                               
//                                        vTaskDelay(1000);                           /* 延时1000ticks */
//                                }
    }
}


/**
* @briefmain function.
* @paramnone
* @retval none
*/
int main(void)
{
system_clock_config();
        delay_init();
/* init led2 and led3 */
at32_led_init(LED2);
at32_led_init(LED3);
        at32_button_init();
/* init usart1 */
uart_print_init(115200);


        Key_Queue=xQueueCreate(KEYMSG_Q_NUM,sizeof(uint8_t));
       
                /* create led2 task */
                xTaskCreate(task1,
               "vTask1",
               512,
                (void *)30,
               
                                                               3,
                NULL);
               
                xTaskCreate(Keyprocess_task,
               "vTask2",
               128,
               NULL,
               3,
               NULL);


                /* start scheduler */
                vTaskStartScheduler();
       
}

运行效果图:

问天少年 发表于 2024-12-10 18:44

FREERTOS怎么实现us的延时,可以回一下吗?vTaskDelay是毫秒级的

比神乐 发表于 2024-12-10 19:55

问天少年 发表于 2024-12-10 18:44
FREERTOS怎么实现us的延时,可以回一下吗?vTaskDelay是毫秒级的

不知道

呐咯密密 发表于 2024-12-12 10:07

稍微讲解一下啊,这太简略了

比神乐 发表于 2024-12-12 22:25

主程序创建队列,task1发送队列,Keyprocess_task接收队列
页: [1]
查看完整版本: 【AT-START-L021测评】FREERTOS之队列实验