我们要多线程操作时,就需要用到RTOS(Real-Time Operating System)。FreeRTOS实时操作系统开发里面使用到vTaskDelay函数,它是对CPU的时分复用,系统将这个任务挂起,让CPU去执行其他任务,一旦时间到了,就再回到先前的任务继续执行。
1 建立工程
类似Renesas e2studio建立工程的步骤,先来创建工程 ,但注意在页面RTOS这里选择FreeRTOS,见下图。
按以前的方法配置P113和P207均为Output Mode(initial HIGH)。见下图。
2 新增线程(Threads)
点击Stacks选项卡--在左侧的New Thread -- 点击新创建的Thread 属性 -- 修改Name和Symbol,下图所示的是LED1线程,同样LED2也是这样操作。
3 选择堆算法
这里选择Heap 4算法。
点击LED1 -- New Stack -- RTOS -- FreeRTOS Heap4。一共有1~5共5个算法可选:
Heap_4:Heap_4在Heap_2的基础上进行了改进,它会合并相邻的空闲内存块,从而减少内存碎片化的可能性。Heap_4使用“第一次适应算法”来分配内存,通常建议作为内存管理的首选方案。
其它四个Heap算法意思可以查阅相关资料,这里从略。
接下来可能会报错,要开启动态内存分配。点击LED1这个线程 -- 在页面下方的属性里Support Dynamic Allocation 改为 Enabled。见下图。
保存配置文件,点击生成项目代码。
4 编写多线程FreeRTOS代码
在左侧工程文件下的SRC中会多出LED1_thread_entry.c和LED2_thread_entry.c,这两个文件是留给我们写线程具体功能的。
在LED1_thread_entry.c中的while循环里添加代码
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中的while循环里添加代码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);
在hal_entry.c的hal_entry函数中添加代码,用来开启线程
LED1_thread_entry();
LED2_thread_entry();
hal_entry.c全部代码如下:
#include"hal_data.h"
FSP_CPP_HEADER
voidR_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER
voidhal_entry(void)
{
LED1_thread_entry();
LED2_thread_entry();
#if BSP_TZ_SECURE_BUILD
R_BSP_NonSecureEnter();
#endif
}
voidR_BSP_WarmStart(bsp_warm_start_event_t event)
{
if (BSP_WARM_START_RESET == event)
{
#if BSP_FEATURE_FLASH_LP_VERSION != 0
R_FACI_LP->DFLCTL = 1U;
#endif
}
if (BSP_WARM_START_POST_C == event)
{
R_IOPORT_Open (&IOPORT_CFG_CTRL, &IOPORT_CFG_NAME);
#if BSP_CFG_SDRAM_ENABLED
R_BSP_SdramInit(true);
#endif
}
}
#if BSP_TZ_SECURE_BUILD
FSP_CPP_HEADER
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();
BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
{
}
FSP_CPP_FOOTER
#endif
5 演示效果

通过编译后,Renesas Flash Programmer烧录程序到开发板单片机芯片里。
两颗LED的亮灭时间并不相同,LED1闪亮500ms,LED2闪亮800ms,也就是每隔8s会LED1和2会同时亮一下。详见视频。