本教程基于韋東山百問(wèn)網(wǎng)出的 DShanMCU-RA6M5開(kāi)發(fā)板 進(jìn)行編寫(xiě),需要的同學(xué)可以在這里獲取: https://item.taobao.com/item.htm?id=728461040949
配套資料獲?。篽ttps://renesas-docs.100ask.net
瑞薩MCU零基礎(chǔ)入門(mén)系列教程匯總: https://blog.csdn.net/qq_35181236/article/details/132779862
第27章 freeRTOS實(shí)驗(yàn)
本章目標(biāo)
- 學(xué)會(huì)使用RASC創(chuàng)建一個(gè)基于freertos的工程;
- 學(xué)會(huì)使用RASC創(chuàng)建freertos任務(wù),體驗(yàn)RTOS的多任務(wù)調(diào)度;
27.1 創(chuàng)建基于FreeRTOS的工程
使用RASC工具創(chuàng)建基于freertos的MDK工程非常的簡(jiǎn)單快捷,在前文創(chuàng)建MDK工程《3.5.1 使用RASC創(chuàng)建MDK工程》的最后一步那里,在“RTOS Selection”中選“FreeRTOS(v10.4.6+fsp.4.3.0)”即可,如下圖所示:
接下來(lái)會(huì)默認(rèn)勾選“FreeRTOS-Minimal-Static Allocation”:
到這一步后直接點(diǎn)擊下方的“Finish”即可創(chuàng)建一個(gè)帶有FreeRTOS的RA6M5 MDK工程了。
27.2 FreeRTOS初體驗(yàn)
27.2.1 新建線程
在RASC中新建線程非常簡(jiǎn)單,在其配置界面的“Stacks”中右側(cè)界面的“Threads”處點(diǎn)擊“New Thread”,即可新建一個(gè)FreeRTOS的線程,也就是任務(wù),如下圖所示:
上圖中已經(jīng)添加了兩個(gè)線程“l(fā)og_thread”和“l(fā)ed_thread”。
27.2.2 添加堆分配算法模塊
添加完線程之后還需要添加堆分配算法,F(xiàn)reeRTOS支持5種堆算法:heap1~heap5。本實(shí)驗(yàn)選擇的是heap4,首先選中任意一個(gè)FreeRTOS線程,比如“l(fā)ed_thread”,然后點(diǎn)擊配置界面的“New
Stack”,找到“RTOS”后選擇要使用的算法即可,如下圖所示:
FreeRTOS中,只能選擇一種堆算法。雖然上圖里是在“l(fā)ed_thread”中為它選擇了某個(gè)堆算法,但是這個(gè)堆算法不是“屬于”某個(gè)線程,而是屬于整個(gè)FreeRTOS的。你不能在另一線程里選擇另一種堆算法。
27.2.3 配置FreeRTOS通用參數(shù)
要使用FreeRTOS,需要配置內(nèi)核相關(guān)的許多參數(shù),比如時(shí)鐘基準(zhǔn),時(shí)鐘頻率,任務(wù)棧大小,分配內(nèi)存時(shí)使用靜態(tài)分配還是動(dòng)態(tài)分配等等,這些參數(shù)在FSP種點(diǎn)擊任意一個(gè)FreeRTOS線程即可看到關(guān)于內(nèi)核的通用參數(shù)配置,然后根據(jù)自己的實(shí)際需求進(jìn)行設(shè)置:
- Common-General
在此處設(shè)置RTOS內(nèi)核運(yùn)行的時(shí)鐘頻率、任務(wù)最大優(yōu)先級(jí)等參數(shù),如下圖所示:
- Common-Memory Allocation
在此處設(shè)置內(nèi)存分配相關(guān)的參數(shù),比如是否支持靜態(tài)內(nèi)存分配、堆的大小,如下圖所示:
- 其它通用參數(shù)
還有很多參數(shù),比如是否支持任務(wù)通知、互斥量等等,F(xiàn)reeRTOS是一個(gè)可以高度定制的內(nèi)核,要想弄清楚這些參數(shù),需要對(duì)它比較熟悉。
27.2.4 配置線程參數(shù)
對(duì)于某個(gè)線程,需要設(shè)置它的名稱(chēng)、棧大小、優(yōu)先級(jí)等參數(shù),如下圖所示:
27.2.5 驅(qū)動(dòng)程序
本實(shí)驗(yàn)使用的是串口和LED的驅(qū)動(dòng)程序,請(qǐng)讀者自行移植。
27.2.6 線程程序
- LED線程
在LED的線程入口函數(shù)中,本實(shí)驗(yàn)先對(duì)LED設(shè)備進(jìn)行初始化,然后每隔300ms改變一次LED的狀態(tài)以實(shí)現(xiàn)閃爍效果,代碼如下:
#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內(nèi)核的延時(shí)函數(shù),它讓當(dāng)前線程進(jìn)入阻塞狀態(tài),讓出處理器資源。
- 串口打印線程
在串口打印線程的入口函數(shù)中,首先初始化了串口,然后每隔100ms計(jì)數(shù)一次并打印出來(lái),代碼如下:
#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啟動(dòng)分析
FreeRTOS的啟動(dòng)過(guò)程,看main函數(shù)即可。創(chuàng)建2個(gè)線程后,啟動(dòng)調(diào)度器。代碼如下:
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_ALLOCATION
xSemaphoreCreateCountingStatic(
#else
xSemaphoreCreateCounting(
#endif
256,
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行:創(chuàng)建了一個(gè)計(jì)數(shù)型信號(hào)量;
- 第25~26行:創(chuàng)建線程;
- 第29行:開(kāi)啟FreeRTOS的調(diào)度器,如果開(kāi)啟成功則不會(huì)走到30行的“return 0”;
對(duì)于RASC創(chuàng)建的FreeRTOS工程,它不會(huì)調(diào)用hal_entry()函數(shù)。
27.2.8 測(cè)試結(jié)果
將編譯出來(lái)的二進(jìn)制可執(zhí)行文件燒錄到板子上運(yùn)行,可以觀察到LED在閃爍,而且串口在打印如下圖這樣的信息:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-708981.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-708981.html
到了這里,關(guān)于第27章_瑞薩MCU零基礎(chǔ)入門(mén)系列教程之freeRTOS實(shí)驗(yàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!