前两个帖子,介绍了编程的基本方法,瑞萨IDE的一个很大优点就是可以利用IDE搭建FreeRTOS,因此本贴就是对FreeRTOS编程进行介绍。
一、项目的建立
项目的建立方法与本人前两次发表的帖子步骤是基本相同的,就是在部分界面要选择操作系统,如下图两图所示。
一路点NEXT后,就可以建立项目,项目建立完成后,可以对FreeRTOS进行设置。
二、任务的建立
keil工程建立后,在keil的工程里面会自动包括FreeRTOS的源文件。下面再建立操作系统的线程。如下图所示。
建立步骤如下:
(1)点击Stacks
(2)点击New Thread,建立新的线程
(3)电机thread窗口,会显示下面的窗口③,该窗口的Common表示对FreeRTOS的设置,对应的是以前对FreeRTOSConfig.h文件的设置,在该软件中,直接在窗口进行设置就可以了,感觉方便了很多。
(4)对线程进行设置。点击窗口④的新建线程,可以对该线程进行设置,如下图所示。
图中的Symbol对应的是线程的句柄,Name对应的是该线程的名称,Stack Size对应的是该该线程的堆栈。这里和以前在keil中设置是不一样的,这里直接是以字节为单位,而在keil中自己建立线程时,堆栈是以4字节为单位的。此外,该软件默认将线程设置为静态内存管理。
按照上述方法,本人建立了两个线程,一个是led1_thread,一个是led2_thread,计划分别控制两个LED的闪烁。
三、任务的编写
生成任务后,再设置LED,其中LED1对应的P415,LED2对应的是P404,IO设置如下所示。
将两个IO设置完成后,点击“Generate Project Content”,便可以生成所需要的代码。生产完成后,打开项目所在目录中的keil文件,便可以看到生成的代码。
从图中可以看到,在Keil的文件目录中已经自动集成了FreeRTOS的源文件,而且自己生成了led1_thread_entry和led2_thead_entry两个C文件,在编程的时候直接在这两个文件中编写线程的程序即可。
以下分别是led1和led2的线程。
#include "led1_thread.h"
/* Led1 Thread entry function */
/* pvParameters contains TaskHandle_t */
void led1_thread_entry(void * pvParameters)
{
FSP_PARAMETER_NOT_USED(pvParameters);
/* TODO: add your own code here */
while(1)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_LOW);
vTaskDelay(1000);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_15, BSP_IO_LEVEL_HIGH);
vTaskDelay(1000);
}
}
#include "led2_thread.h"
/* Led2 Thread entry function */
/* pvParameters contains TaskHandle_t */
void led2_thread_entry(void * pvParameters)
{
FSP_PARAMETER_NOT_USED(pvParameters);
/* TODO: add your own code here */
while(1)
{
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_LOW);
vTaskDelay(2000);
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_04_PIN_04, BSP_IO_LEVEL_HIGH);
vTaskDelay(2000);
}
}
对于线程的建立、参数等设置,用户均不用关心。在主程序中也不用在编写代码。到这里,简单的两线程程序就编写完成了。
四、程序执行
程序编写完成后,下载进开发板,就会发现开发板上的两个LED按照不同的时间间隔进行闪烁,其中一个间隔是1s,一个间隔是2s。
通过上述的操作就可以完成一个嵌入式系统的建立,感觉是很方便了,这里凸显了瑞萨半导体开发的便捷性。
更多回帖