TLLED 发表于 2026-8-6 22:45:37

【瑞萨RA-eco-RA6M4评测】运行FreeRTOS

本帖最后由 TLLED 于 2026-8-7 16:34 编辑

测试在开发板上运行FreeRTOS系统。



一、创建工程
使用rasc软件创建工程。
1.1、选择芯片型号和编译软件



1.2、选择FreeRTOS系统



1.3、FreeRTOS项目

可以创建静态任务



二、配置工程

根据开发板硬件,配置工程。测试使用到调试串口,这里外设只配置串口。
2.1、配置串口



2.2、配置时钟
开发板晶振使用的是12MHz,这里要修改



三、添加文件

在创建的工程中添加测试程序。
3.1、在项目中添加测试文件



3.2、fun_task.c
#include "hal_data.h"
#include "FreeRTOS.h"
#include "task.h"

#define START_TASK_PRIO                1                                                                        /* 任务优先级 */
#define START_STK_SIZE                512                                                                /* 任务堆栈大小 */
StackType_t StartTaskStack; /* 任务堆栈 */
StaticTask_t            StartTaskTCB;       /* 任务控制块 */
TaskHandle_t            StartTask_Handler;/* 任务句柄 */
void start_task(void *pvParameters);      /* 任务函数 */


#define TASK1_PRIO      2                   /* 任务优先级 */
#define TASK1_STK_SIZE512               /* 任务堆栈大小 */
StackType_t Task1TaskStack; /* 任务堆栈 */
StaticTask_t            Task1TaskTCB;       /* 任务控制块 */
TaskHandle_t            Task1Task_Handler;/* 任务句柄 */
void task1(void *pvParameters);             /* 任务函数 */

#define TASK2_PRIO      3                   /* 任务优先级 */
#define TASK2_STK_SIZE512               /* 任务堆栈大小 */
StackType_t Task2TaskStack; /* 任务堆栈 */
StaticTask_t            Task2TaskTCB;       /* 任务控制块 */
TaskHandle_t            Task2Task_Handler;/* 任务句柄 */
void task2(void *pvParameters);             /* 任务函数 */

#define TASK3_PRIO      4                   /* 任务优先级 */
#define TASK3_STK_SIZE512               /* 任务堆栈大小 */
StackType_t Task3TaskStack; /* 任务堆栈 */
StaticTask_t            Task3TaskTCB;       /* 任务控制块 */
TaskHandle_t            Task3Task_Handler;/* 任务句柄 */
void task3(void *pvParameters);             /* 任务函数 */


void task_create(void)
{
      init_uart();
      //start_task
      StartTask_Handler = xTaskCreateStatic((TaskFunction_t   )start_task,      /* 任务函数 */
                                          (const char*      )"start_task",      /* 任务名称 */
                                          (uint32_t         )START_STK_SIZE,    /* 任务堆栈大小 */
                                          (void*            )NULL,            /* 传递给任务函数的参数 */
                                          (UBaseType_t      )START_TASK_PRIO,   /* 任务优先级 */
                                          (StackType_t*   )StartTaskStack,    /* 任务堆栈 */
                                          (StaticTask_t*    )&StartTaskTCB);    /* 任务控制块 */
    vTaskStartScheduler();
}

void start_task(void *pvParameters)
{
      FSP_PARAMETER_NOT_USED(pvParameters);
    taskENTER_CRITICAL();         /* 进入临界区 */
    /* 创建任务1 */
    Task1Task_Handler = xTaskCreateStatic((TaskFunction_t   )task1,         /* 任务函数 */
                                          (const char*      )"task1",       /* 任务名称 */
                                          (uint32_t         )TASK1_STK_SIZE,/* 任务堆栈大小 */
                                          (void*            )NULL,          /* 传递给任务函数的参数 */
                                          (UBaseType_t      )TASK1_PRIO,    /* 任务优先级 */
                                          (StackType_t*   )Task1TaskStack,/* 任务堆栈 */
                                          (StaticTask_t*    )&Task1TaskTCB);/* 任务控制块 */
    /* 创建任务2 */
    Task2Task_Handler = xTaskCreateStatic((TaskFunction_t   )task2,         /* 任务函数 */
                                          (const char*      )"task2",       /* 任务名称 */
                                          (uint32_t         )TASK2_STK_SIZE,/* 任务堆栈大小 */
                                          (void*            )NULL,          /* 传递给任务函数的参数 */
                                          (UBaseType_t      )TASK2_PRIO,    /* 任务优先级 */
                                          (StackType_t*   )Task2TaskStack,/* 任务堆栈 */
                                          (StaticTask_t*    )&Task2TaskTCB);/* 任务控制块 */
    /* 创建任务3 */
    Task3Task_Handler = xTaskCreateStatic((TaskFunction_t   )task3,         /* 任务函数 */
                                          (const char*      )"task3",       /* 任务名称 */
                                          (uint32_t         )TASK3_STK_SIZE,/* 任务堆栈大小 */
                                          (void*            )NULL,          /* 传递给任务函数的参数 */
                                          (UBaseType_t      )TASK3_PRIO,    /* 任务优先级 */
                                          (StackType_t*   )Task3TaskStack,/* 任务堆栈 */
                                          (StaticTask_t*    )&Task3TaskTCB);/* 任务控制块 */
    vTaskDelete(StartTask_Handler); /* 删除开始任务 */
    taskEXIT_CRITICAL();            /* 退出临界区 */
}


//task1
void task1(void *pvParameters)
{
      FSP_PARAMETER_NOT_USED(pvParameters);
    while (1)
    {
                        printf("task1 run ...\r\n");
                        //led0_tog();
      vTaskDelay(20);
    }
}

//task2
void task2(void *pvParameters)
{
                FSP_PARAMETER_NOT_USED(pvParameters);
    while (1)
    {      
                        printf("task2 run ...\r\n");
                        //led_blue_tog();
                        vTaskDelay(20);
    }
}

void task3(void *pvParameters)
{
                FSP_PARAMETER_NOT_USED(pvParameters);
    while (1)
    {      
                        printf("task3 run ...\r\n");
                        //led_blue_tog();
                        vTaskDelay(20);
    }
}


//void task4(void *pvParameters)
//{
//    while (1)
//    {      
//                        printf("task4 run ...\r\n");
//                        //led_blue_tog();
//                        vTaskDelay(350);
//    }
//}

//void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
//{
//      FSP_PARAMETER_NOT_USED(xTask);
//      FSP_PARAMETER_NOT_USED(pcTaskName);
//    // 在此处设置断点
//    // pcTaskName 即为发生溢出的任务名称
//      printf("task:%s Overflow\r\n",pcTaskName);
//    while(1);
//}

四、运行结果

下载程序后,串口输出测试的任务



页: [1]
查看完整版本: 【瑞萨RA-eco-RA6M4评测】运行FreeRTOS