大多数操作系统似乎能同时执行多个程序。这称为多任务处理。随着应用程序变得越来越复杂,[单片机]裸机开发已经无法满足对于复杂程序的需求。于是具有多任务调度和实时响应特性的FreeRTOS便越来越受工程师们青睐。
[瑞萨]RA系列[MCU]兼容[FreeRTOS]系统,开发环境rasc完美支持FreeRTOS,无需额外手动移植[FreeRTOS]系统。开发者只需要考虑进程和资源,相当容易使用。
以下介绍如何用瑞萨rasc创建RA-Eco-RA4E2-64PIN-V1.0开发板的FreeRTOS工程。
FreeRTOS 是作者 Richard Barry 于 2003 年推出的系统。作者加入了[亚马逊],之后推出的产品为Amazon FreeRTOS
本次实验要使用FreeRTOS10.6.1嵌入式实时操作系统,之前几个实验都是在裸机上跑的,但当我们要多线程操作时,就需要用到RTOS(Real-Time Operating System)。
通常我们裸机开发要做软件延时用的是FSP库R_BSP_SoftwareDelay函数,它是阻塞式运行的。而在FreeRTOS实时操作系统开发里面使用到vTaskDelay函数,它是对CPU的时分复用,系统将这个任务挂起,让CPU去执行其他任务,一旦时间到了,就再回到先前的任务继续执行。
续前【RA-Eco-RA4E2-64PIN-V1.0开发板试用】1、开发板开箱与环境搭建
STM32CUBEMX相似的KEIL初始化代码生成器** RA Smart Configurator软件可以在瑞萨官网进行下载,下载地址:https://www.renesas.cn
| setup_fsp_v5_4_0_rasc_v2024-04.exe
安装完成后在RenesasRAsc_v eclipse目录中运行rasc.exe
配置keil项目



可以进入片配置也可以关闭在keil项目项目中.
产生目录: 
打开lu.uvprojx

打开该文件配置的RA Smart Configurator

根据板图:
![]
加入2个113,207:

时钟图:![未标题-2 拷贝.png]
新增线程(Threads)
点击Stacks选项卡--在左侧的New Thread -- 点击新创建的Thread 属性 -- 修改Name和Symbol,下图所示的是LED1线程,LED2的同理。
选择堆算法
接着为堆选择算法,这里一共有1~5共5个算法可选,每种算法介绍如下:
Heap_1:这是最简单的内存分配实现,它不允许释放已分配的内存。这意味着一旦内存被分配出去,就不能被回收,这可能导致内存的快速耗尽。
Heap_2:与Heap_1相比,Heap_2允许内存的释放。但是,它不会合并相邻的空闲内存块,因此可能会导致内存碎片化。
Heap_3:Heap_3使用标准的malloc()和free()函数来管理内存,因此堆的大小由链接器配置决定,而不是由FreeRTOS的配置文件设置。
Heap_4:Heap_4在Heap_2的基础上进行了改进,它会合并相邻的空闲内存块,从而减少内存碎片化的可能性。Heap_4使用“第一次适应算法”来分配内存,通常建议作为内存管理的首选方案。
Heap_5:Heap_5与Heap_4类似,但它支持从多个非连续的内存块中分配内存,这对于系统内存不是连续块的情况非常有用。`
这里我选择Heap 4算法。其实只点灯的话不选择算法也可以的。
点击LED1 -- New Stack -- RTOS -- FreeRTOS Heap4
接下来可能会报错,要开启动态内存分配。点击LED1这个线程 -- 在属性里Support Dynamic Allocation 改为 Enabled
编写代码
保存配置文件,生成项目代码。
在FSP_Project\src会多出LED1_thread_entry.c和LED2_thread_entry.c,这两个文件是留给我们写线程具体功能的。
在LED1_thread_entry.c中的死循环中添加代码
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_13, BSP_IO_LEVEL_HIGH);
vTaskDelay (500);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_01_PIN_13, BSP_IO_LEVEL_LOW);
vTaskDelay (500);

在LED2_thread_entry.c中的死循环中添加代码
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_HIGH);
vTaskDelay (800);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_LOW);
vTaskDelay (800);
上面代码是让P113对应的LED灯亮灭各500ms,P207对应的LED灯亮灭各800ms
‘在hal_entry.c不需要加入任何代码,所有与os有关代码由[瑞萨]在生成项目时完成了.’

这次编译没有出错:
Program Size: Code=9276 RO-data=1948 RW-data=0 ZI-data=5660
FromELF: creating hex file...
After Build - User command #1: cmd /c "start "Renesas" /w cmd /c ""E:\lst\ra0e1-20240827154516\123\ra4e2-rt\FSP_Project\rasc_launcher.bat" "E:\lst\ra0e1-20240827154516\123\ra4e2-rt\FSP_Project\rasc_version.txt" -nosplash --launcher.suppressErrors --gensmartbundle --compiler ARMv6 --devicefamily ra "E:\lst\ra0e1-20240827154516\123\ra4e2-rt\FSP_Project\configuration.xml" "E:\lst\ra0e1-20240827154516\123\ra4e2-rt\FSP_Project\Objects\FSP_Project.axf" 2> "%TEMP%\rasc_stderr.out"""
".\Objects\FSP_Project.axf" - 0 Error(s), 68 Warning(s).
Build Time Elapsed: 00:00:32
设置出HEX文件

在C:RenesaslustObjects目录下生成lst.hex文件。
开发板是支持用串口工具来下载程序的,当然在MDK的环境下用串口是无法完成这个任务的,它必需借助工具软件Renesas Flash Programmer的支持,其软件版本为 V3.14。
在安装了Renesas Flash Programmer之后,该如何进行下载呢?
其步骤如下:
1)将开发板由运行模式切换为下载模式,即改变J1上引脚的连接方式,按图所示用短接子将引脚1和引脚3连接起来。

切换工作模式
2)串口连接
串口编程所用的引脚是P109和P110,其中P110是输入端要接串口的发送端TXD,而P109
是输出端接串口的接收端RXD 。

图3引脚功能
3)运行工具软件,先创建一个工程,见图4所示。然后选取待下载的*.hex文件,并按下开发板的复位键以进入下载状态。
用上次安装Renesas Flash Programmer _Package_V31400软件,

这次烧成功。

Target device : RA
Connecting the tool
Tool : COM port (COM3), Interface : 2 wire UART
Connecting to the target device
Setting the target device
Communication speed : 115200bps
Setting the target device
Erasing the selected blocks
[Code Flash 1] 0x00000000 - 0x0003FFFF size : 256 K
[Data Flash 1] 0x40100000 - 0x40101FFF size : 8 K
Writing data to the target device
[Code Flash 1] 0x00000000 - 0x00000DD7 size : 3.5 K
[Config Area] 0x01010018 - 0x01010033 size : 28
Verifying data
[Code Flash 1] 0x00000000 - 0x00000DD7 size : 3.5 K
[Config Area] 0x01010018 - 0x01010033 size : 28
Disconnecting the tool
Operation completed.
重新设boot引脚
reset达到预期状态。