【瑞萨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]