目录
[1 FSP配置FreeRTOS](#1 FSP配置FreeRTOS)
[1.1 软件版本信息](#1.1 软件版本信息)
[1.2 配置FreeRTOS](#1.2 配置FreeRTOS)
[2 FreeRTOS的Task](#2 FreeRTOS的Task)
[2.1 FSP下的项目结构](#2.1 FSP下的项目结构)
[2.2 Task代码](#2.2 Task代码)
[2.2.1 Task测试案例配置](#2.2.1 Task测试案例配置)
[2.2.2 测试代码实现](#2.2.2 测试代码实现)
[3 自定义Task](#3 自定义Task)
[3.1 编写代码](#3.1 编写代码)
[3.2 测试函数](#3.2 测试函数)
[4 测试](#4 测试)
[4.1 Task断点测试](#4.1 Task断点测试)
[4.2 板卡运行测试](#4.2 板卡运行测试)
概述
本文主要介绍在Renesas MCU中使用FreeRTOS,包括使用FSP配置FreeRTOS的方法,包括使用FSP创建Task,用户自定义task。还通过改变两个LED的状态来验证task的工作流程。
1 FSP配置FreeRTOS
1.1 软件版本信息
软硬件信息 | 版本信息 |
---|---|
Renesas MCU | R7FA4M2AD3C |
Keil | MDK ARM 5.38 |
FSP 版本 | 5.3.0 |
调试工具:st-link | ST-LINK/V2-1 |
注意:
在Keil MDK中可以更改FSP的版本,方法如下
1.2 配置FreeRTOS
1)打开配置项目界面,选择FreeRTOS的版本和FSP的版本
配置完成后,进入到该页面,只能选择静态内存,完成基本配置项目。
2) 在Stacks面板上创建一个线程
在Thread面板上修改task的名称,使其符合工程的应用特性。
完成以上参数配置之后,就可以生成项目
2 FreeRTOS的Task
2.1 FSP下的项目结构
1)生成项目
点击Generate Project content,就能生成项目,在Console界面看见项目相关的信息
生成项目之后,就可以编译项目
2 )Task相关的代码
FSP配置项目之后,如果在FSP中配置了thread,会在Flex Software库文件中生成task相关的代码
2.2 Task代码
2.2.1 Task测试案例配置
在main_task_entry.c下的代码时FSP自动生成的,user可以在该task中添加和项目相关的代码,笔者以控制一个LED为例,验证Task的运行状态。
1)IO相关的配置,笔者的板卡上使用P405,P404,P002
2)FSP配置IO
2.2.2 测试代码实现
在main_task_entry中实现500ms控制LED1的状态翻转功能。
代码第2行: 引用LED相关配置的头文件
代码第12行:触发LED翻转
代码第13行:实现500ms延时
实例代码:
cpp
#include "main_task.h"
#include "bsp_led.h"
/* Main Task entry function */
/* pvParameters contains TaskHandle_t */
void main_task_entry(void * pvParameters)
{
FSP_PARAMETER_NOT_USED(pvParameters);
/* TODO: add your own code here */
while(1)
{
LED1_TOGGLE;
vTaskDelay(500);
}
}
3 自定义Task
3.1 编写代码
代码功能介绍:
1)定义task相关的栈,thread的object
2)定义Task执行函数
3)创建task函数
cpp
/*
FILE NAME : user_task.c
Description: user task library
Author : tangmingfei2013@126.com
Date : 2024/06/03
*/
#include "user_task.h"
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "bsp_led.h"
static TaskHandle_t mainThread;
static StaticTask_t mainThread_memory;
#if defined(__ARMCC_VERSION) /* AC6 compiler */
static uint8_t mainThread_stack[1024] BSP_PLACE_IN_SECTION(BSP_UNINIT_SECTION_PREFIX ".stack.thread") BSP_ALIGN_VARIABLE(BSP_STACK_ALIGNMENT);
#else
static uint8_t mainThread_stack[1024] BSP_PLACE_IN_SECTION(BSP_UNINIT_SECTION_PREFIX ".stack.mainThread") BSP_ALIGN_VARIABLE(BSP_STACK_ALIGNMENT);
#endif
static const rm_freertos_port_parameters_t userThread_parameters =
{
.p_context = (void *) NULL,
};
static void userThread_func(void * pvParameters)
{
FSP_PARAMETER_NOT_USED(pvParameters);
/* TODO: add your own code here */
while(1)
{
vTaskDelay(200);
LED2_TOGGLE;
}
}
void user_createTask( void )
{
mainThread = xTaskCreateStatic(
userThread_func,
(const char *)"user_createTask",
1024/4, // In words, not bytes
(void *) &userThread_parameters, //pvParameters
1,
(StackType_t *)&mainThread_stack,
(StaticTask_t *)&mainThread_memory);
}
/* End of this file */
3.2 测试函数
代码33行:延时200ms
代码34行:实现LED2状态翻转
4 测试
4.1 Task断点测试
在userThread_func中添加一个断点,快速运行程序,观察断点情况
4.2 板卡运行测试
下载代码到板卡中,快速运行代码,观察板卡上LED的运行情况
1)task触发led状态一
2)task触发led状态二