当前位置: 首页 > news >正文

第27章_瑞萨MCU零基础入门系列教程之freeRTOS实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id=728461040949

配套资料获取: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.6+fsp.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线程即可看到关于内核的通用参数配置,然后根据自己的实际需求进行设置:

  1. Common-General

在此处设置RTOS内核运行的时钟频率、任务最大优先级等参数,如下图所示:

  1. Common-Memory Allocation

在此处设置内存分配相关的参数,比如是否支持静态内存分配、堆的大小,如下图所示:

  1. 其它通用参数

还有很多参数,比如是否支持任务通知、互斥量等等,FreeRTOS是一个可以高度定制的内核,要想弄清楚这些参数,需要对它比较熟悉。

27.2.4 配置线程参数

对于某个线程,需要设置它的名称、栈大小、优先级等参数,如下图所示:

27.2.5 驱动程序

本实验使用的是串口和LED的驱动程序,请读者自行移植。

27.2.6 线程程序

  1. 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内核的延时函数,它让当前线程进入阻塞状态,让出处理器资源。

  1. 串口打印线程

在串口打印线程的入口函数中,首先初始化了串口,然后每隔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在闪烁,而且串口在打印如下图这样的信息:


本章完

相关文章:

第27章_瑞萨MCU零基础入门系列教程之freeRTOS实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…...

Java学习之--类和对象

&#x1f495;粗缯大布裹生涯&#xff0c;腹有诗书气自华&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;Java学习之--类和对象 类和对象 类的实例化&#xff1a; 1.什么叫做类的实例化 利用类创建一个具体的对象就叫做类的实例化&#xff01; 当我们创建了…...

Unity技术手册-UGUI零基础详细教程-Canvas详解

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…...

破天荒呀!小杜微信有名额了

写在前面 小杜粉&#xff0c;众所周知前面加小杜微信为好友的基本都是由名额限制的。一般都是付费进入社群且进行备注&#xff0c;小杜才会长期保留微信好友。主要由于&#xff0c;添加的人数太多了&#xff0c;微信账号人数名额有限。因此&#xff0c;小杜过一段时间&#xf…...

领域驱动设计:领域模型与代码模型的一致性

文章目录 领域对象的整理从领域模型到微服务的设计领域层的领域对象应用层的领域对象 领域对象与微服务代码对象的映射典型的领域模型非典型领域模型 DDD 强调先构建领域模型然后设计微服务&#xff0c;以保证领域模型和微服务的一体性&#xff0c;因此我们不能脱离领域模型来谈…...

TypeScript命名空间和模块

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 命名空间&#xff08;Namespace&#xff09; 命名空间&#xff08;Namespace&#xff09;使用场景 第三方库 兼容…...

C++学习笔记--函数重载(1)

文章目录 序言一、洞悉函数重载决议1.1、重载决议的基本流程1.2、Name Lookup1.2.1、Qualified Name Lookup1.2.1.1、Class Member Lookup1.2.1.2、Namespace Member Lookup 1.2.2、Unqualified Name Lookup1.2.2.1、Usual Unqualified Lookup1.2.2.2、Argument Dependant Look…...

交叉编译poco-1.9.2

目录 一、文件下载二、编译三、可能遇到的问题和解决方法3.1 error "Unknown Hardware Architecture."3.2 error Target architecture was not detected as supported by Double-Conversion一、文件下载 下载地址:poco-1.9.2 二、编译 解压目录后打开build/config/…...

C++中如何处理超长的数字(long long类型的整数都无法存储的)

C中如何处理超长的数字&#xff08;long long类型的整数都无法存储的&#xff09; 在 C中&#xff0c;如果数字超出了 long long 类型的范围&#xff0c;可以考虑使用字符串或第三方库&#xff08;如 Boost.Multiprecision&#xff09;来表示和处理超长数字。要使用第三方库需…...

RabbitMQ MQTT集群方案官方说明

RabbitMQ MQTT 官方网说明 官方地址: https://www.rabbitmq.com/mqtt.html 从3.8开始&#xff0c;该MQTT插件要求存在一定数量的群集节点。这意味着三分之二&#xff0c;五分之三&#xff0c;依此类推。 该插件也可以在单个节点上使用&#xff0c;但不支持两个节点的集群。 如…...

深圳唯创知音电子将参加IOTE 2023第二十届国际物联网展•深圳站

​ 2023年9月20~22日&#xff0c;深圳唯创知音电子将在 深圳宝安国际会展中心&#xff08;9号馆9B1&#xff09;为您全面展示最新的芯片产品及应用方案&#xff0c;助力传感器行业的发展。 作为全球领先的芯片供应商之一&#xff0c;深圳唯创知音电子一直致力于为提供高质量、…...

《TCP/IP网络编程》阅读笔记--I/O复用

目录 1--基于I/O复用的服务器 2--select()函数 3--基于I/O复用的回声服务器端 4--send()和recv()函数的常用可选项 5--readv()和writev()函数 1--基于I/O复用的服务器 多进程服务器端具有以下缺点&#xff1a;当有多个客户端发起连接请求时&#xff0c;就会创建多个进程来…...

[C#] 允许当前应用程序通过防火墙

通常在一台装有防火墙的电脑上运行程序的场合&#xff0c;往往会弹出对话框提示&#xff1a;是否允许执行该应用程序。 我们在开发软件的时候&#xff0c;可以事先在软件里面设置当前软件为防火墙允许通过的软件。这样&#xff0c;用户在使用时就可以避开前面提到的弹框了。 在…...

帆软FineReport决策报表Tab实现方案

最近有个需求是要做首页展示&#xff0c;为了减少前端工作量&#xff0c;利用采购的帆软FineReport来实现&#xff0c;记录过程&#xff0c;方便备查。 需求 做个Tab页&#xff0c;实现多个页切换。 方案一、利用帆软自带切换 帆软自带的有Tab控件&#xff0c;可实现切换&a…...

只打印文名

CMakeLists.txt set(CMAKE_C_FLAGS "-O0 -ggdb -D__NOTDIR_FILE__$(notdir $<)") // set(CMAKE_C_FLAGS "-O0 -ggdb -D__NOTDIR_FILE__$(notdir $<) -D__FILENAME__$(subst $(dir $<),,$<)")C文件 #include <stdio.h>#ifdef __NOTDIR_…...

【经典小练习】JavaSE—拷贝文件夹

&#x1f38a;专栏【Java小练习】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f384;效果&#x1f33a;代码&#x1f6f8;讲解&#x…...

FPGA-结合协议时序实现UART收发器(六):仿真模块SIM_uart_drive_TB

FPGA-结合协议时序实现UART收发器&#xff08;六&#xff09;&#xff1a;仿真模块SIM_uart_drive_TB 仿真模块SIM_uart_drive_TB&#xff0c;仿真实现。 vivado联合modelsim进行仿真。 文章目录 FPGA-结合协议时序实现UART收发器&#xff08;六&#xff09;&#xff1a;仿真模…...

Spring Boot集成EasyExcel实现数据导出

在本文中&#xff0c;我们将探讨如何使用Spring Boot集成EasyExcel库来实现数据导出功能。我们将学习如何通过EasyExcel库生成Excel文件&#xff0c;并实现一些高级功能&#xff0c;如支持列下拉和自定义单元格样式&#xff0c;自适应列宽、行高&#xff0c;动态表头 &#xff…...

EasyExcel3.0读(日期、数字或者自定义格式转换)

EasyExcel 3.0读(日期、数字或者自定义格式转换) 依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>对象 package com.xiaobu.entity.vo;import …...

浅谈C++|STL之vector篇

一.vector的基本概念 vector是C标准库中的一种动态数组容器&#xff0c;提供了动态大小的数组功能&#xff0c;能够在运行时根据需要自动扩展和收缩。vector以连续的内存块存储元素&#xff0c;可以快速访问和修改任意位置的元素。 以下是vector的基本概念和特点&#xff1a; 动…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...