最强大的搜索引擎,新企业网站应该怎么做SEO优化,多玩游戏网 wordpress,嘉兴高档网站建设本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写#xff0c;需要的同学可以在这里获取#xff1a; https://item.taobao.com/item.htm?id728461040949
配套资料获取#xff1a;https://renesas-docs.100ask.net
瑞萨MCU零基础入门系列教程汇总#xff1a; ht…本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写需要的同学可以在这里获取 https://item.taobao.com/item.htm?id728461040949
配套资料获取https://renesas-docs.100ask.net
瑞萨MCU零基础入门系列教程汇总 https://blog.csdn.net/qq_35181236/article/details/132779862 第27章 freeRTOS实验
本章目标
学会使用RASC创建一个基于freertos的工程学会使用RASC创建freertos任务体验RTOS的多任务调度
27.1 创建基于FreeRTOS的工程
使用RASC工具创建基于freertos的MDK工程非常的简单快捷在前文创建MDK工程《3.5.1 使用RASC创建MDK工程》的最后一步那里在“RTOS Selection”中选“FreeRTOS(v10.4.6fsp.4.3.0)”即可如下图所示 接下来会默认勾选“FreeRTOS-Minimal-Static Allocation” 到这一步后直接点击下方的“Finish”即可创建一个带有FreeRTOS的RA6M5 MDK工程了。
27.2 FreeRTOS初体验
27.2.1 新建线程
在RASC中新建线程非常简单在其配置界面的“Stacks”中右侧界面的“Threads”处点击“New Thread”即可新建一个FreeRTOS的线程也就是任务如下图所示 上图中已经添加了两个线程“log_thread”和“led_thread”。
27.2.2 添加堆分配算法模块
添加完线程之后还需要添加堆分配算法FreeRTOS支持5种堆算法heap1~heap5。本实验选择的是heap4首先选中任意一个FreeRTOS线程比如“led_thread”然后点击配置界面的“New Stack”找到“RTOS”后选择要使用的算法即可如下图所示 FreeRTOS中只能选择一种堆算法。虽然上图里是在“led_thread”中为它选择了某个堆算法但是这个堆算法不是“属于”某个线程而是属于整个FreeRTOS的。你不能在另一线程里选择另一种堆算法。
27.2.3 配置FreeRTOS通用参数
要使用FreeRTOS需要配置内核相关的许多参数比如时钟基准时钟频率任务栈大小分配内存时使用静态分配还是动态分配等等这些参数在FSP种点击任意一个FreeRTOS线程即可看到关于内核的通用参数配置然后根据自己的实际需求进行设置
Common-General
在此处设置RTOS内核运行的时钟频率、任务最大优先级等参数如下图所示 Common-Memory Allocation
在此处设置内存分配相关的参数比如是否支持静态内存分配、堆的大小如下图所示 其它通用参数
还有很多参数比如是否支持任务通知、互斥量等等FreeRTOS是一个可以高度定制的内核要想弄清楚这些参数需要对它比较熟悉。
27.2.4 配置线程参数
对于某个线程需要设置它的名称、栈大小、优先级等参数如下图所示 27.2.5 驱动程序
本实验使用的是串口和LED的驱动程序请读者自行移植。
27.2.6 线程程序
LED线程
在LED的线程入口函数中本实验先对LED设备进行初始化然后每隔300ms改变一次LED的状态以实现闪烁效果代码如下
#include led_thread.h
#include drv_gpio.h
#include hal_data.h
/* LedThread entry function */
/* pvParameters contains TaskHandle_t */
void led_thread_entry(void * pvParameters)
{FSP_PARAMETER_NOT_USED(pvParameters);/* TODO: add your own code here */struct IODev *pLedDev IOGetDecvice(UserLed);if(NULL ! pLedDev)pLedDev-Init(pLedDev);bool state false;while(1){pLedDev-Write(pLedDev, state);state !state;vTaskDelay(300);}
}需要注意的是这里使用的是RTOS内核的延时函数它让当前线程进入阻塞状态让出处理器资源。
串口打印线程
在串口打印线程的入口函数中首先初始化了串口然后每隔100ms计数一次并打印出来代码如下
#include log_thread.h
#include drv_uart.h
#include hal_data.h
#include stdio.h
/* LogThread entry function */
/* pvParameters contains TaskHandle_t */
void log_thread_entry(void * pvParameters)
{FSP_PARAMETER_NOT_USED(pvParameters);/* TODO: add your own code here */UARTDrvInit();uint32_t count 0;while(1){printf(\r\nLog: %d\r\n, count);vTaskDelay(100);}
}27.2.7 FreeRTOS启动分析
FreeRTOS的启动过程看main函数即可。创建2个线程后启动调度器。代码如下
int main(void)
{g_fsp_common_thread_count 0;g_fsp_common_initialized false;/* Create semaphore to make sure common init is done before threads start running. */g_fsp_common_initialized_semaphore #if configSUPPORT_STATIC_ALLOCATIONxSemaphoreCreateCountingStatic(#elsexSemaphoreCreateCounting(#endif256,1#if configSUPPORT_STATIC_ALLOCATION, g_fsp_common_initialized_semaphore_memory#endif);if (NULL g_fsp_common_initialized_semaphore) {rtos_startup_err_callback(g_fsp_common_initialized_semaphore, 0);}/* Init RTOS tasks. */led_thread_create();log_thread_create();/* Start the scheduler. */vTaskStartScheduler();return 0;
}第07~22行创建了一个计数型信号量第25~26行创建线程第29行开启FreeRTOS的调度器如果开启成功则不会走到30行的“return 0”
对于RASC创建的FreeRTOS工程它不会调用hal_entry()函数。
27.2.8 测试结果
将编译出来的二进制可执行文件烧录到板子上运行可以观察到LED在闪烁而且串口在打印如下图这样的信息 本章完