RT-Thread Nano版本在STM32F103RB上的快速移植

目录

概述

1 RT-Thread Nano

1.1 Nano版本介绍

1.2 RT-Thread Nano的特点

2 STM32Cube 创建工程

2.1 STM32Cub配置板卡参数

2.2 项目程序架构 

3 移植RT-Thread

3.1 Keil IDE加载RT-Thread

3.2 解决上面两个ERROR

3.2.1 ERROR-1:

3.2.2 ERROR-2

3.3 移植FINSH

 3.4 添加OSTick

4 测试

4.1 线程测试

4.2 控制台验证


源代码下载地址:

RT-ThreadNano版本在STM32F103RB上的快速移植资源-CSDN文库

概述

本文主要介绍RT-Thread Nano版本在NUCLEO-F13RB上的移植方法,包括RT-Thread的版本信息,各个版本的差异,Keil下RT-Thread的安装,以及结合STM32Cube创建工程的方法。文中还详细记录了修改代码的内容和修改方法。还编写具体的案例验证代码,验证RT-Thread的功能。

1 RT-Thread Nano

1.1 Nano版本介绍

RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用32 位 ARM 入门级 MCU 。

下图是 RT-Thread Nano 的软件框图,包含支持的 CPU 架构与内核源码,还有可拆卸的 FinSH 组件:

1.2 RT-Thread Nano的特点

RT-Thread Nano 在使用上也非常简单,带给开发者友好的开发体验。

  • 易裁剪:Nano 的配置文件为 rtconfig.h,该文件中列出了内核中的所有宏定义,有些默认没有打开,如需使用,打开即可。具体的配置可见 Nano 版块的 RT-Thread Nano 配置 教程。
  • 易添加 FinSH 组件:FinSH 组件 可以很方便的在 Nano 上进行移植,而不再依赖 device 框架,只需要对接两个必要的函数即可完成 FinSH 移植。
  • 自选驱动库:可以使用厂商提供的固件驱动库,如 ST 的 STD 库、HAL 库、LL 库等,可以自行选择。
  • 完善的文档:包含 内核基础、线程管理 (例程)、时钟管理 (例程)、线程间同步 (例程)、线程间通信 (例程)、内存管理 (例程)、中断管理,以及 Nano 版块的移植教程。

2 STM32Cube 创建工程

2.1 STM32Cub配置板卡参数

step -1: 选择板卡

打开STM32Cube,在board选项面板搜索NUCLEO-F103RB,点击板卡Item配置项目参数

step -2:  配置参数

点击板卡后,STM32Cube会自动配置板卡上外围资源。

 

step -3:  禁止如下两项配置

step -4:  配置项目相关参数

2.2 项目程序架构 

完成项目参数配置后,就可以生成代码,生成代码框架结构如下:

3 移植RT-Thread

3.1 Keil IDE加载RT-Thread

在Keil IDE上,依照如下步骤添加RT-Thread的源代码包。

 配置完成后,IDE会自动加载RT-Thread的源代码包

 初次编译代码,会出现如下错误信息:

详细log如下:

RTE/RTOS/board.c(47): error:  #35: #error directive: "TODO 1: OS Tick Configuration."
  #error "TODO 1: OS Tick Configuration."
RTE/RTOS/board.c: 0 warnings, 1 error
compiling thread.c...
compiling timer.c...
compiling finsh_port.c...


RTE/RTOS/finsh_port.c(14): error:  #35: #error directive: Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
  #error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
RTE/RTOS/finsh_port.c: 0 warnings, 1 error
compiling gpio.c... 

3.2 解决上面两个ERROR

3.2.1 ERROR-1:

RTE/RTOS/board.c(47): error:  #35: #error directive: "TODO 1: OS Tick Configuration."
  #error "TODO 1: OS Tick Configuration."
RTE/RTOS/board.c: 0 warnings, 1 error

这里提示,需要配置OS TICK 

配置代码如下:

 源代码

/**
 * This function will initial your board.
 */
void rt_hw_board_init(void)
{
   //#error "TODO 1: OS Tick Configuration."

   /* 1、系统、时钟初始化 */
    HAL_Init();                // 初始化 HAL 库
    SystemClock_Config();     // 配置系统时钟
 
    /* 2、OS Tick 频率配置,RT_TICK_PER_SECOND = 1000 表示 1ms 触发一次中断 */
    SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

                   
    /* 
     * TODO 1: OS Tick Configuration
     * Enable the hardware timer and call the rt_os_tick_callback function
     * periodically with the frequency RT_TICK_PER_SECOND. 
     */

    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

3.2.2 ERROR-2

RTE/RTOS/finsh_port.c(14): error:  #35: #error directive: Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
  #error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 

 错误位置如下:

修改方法:

step-1:  使能 "finsh_config.h"

step-2: 添加源代码

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 */

#include <rthw.h>
#include <rtconfig.h>

#include "usart.h"

#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
#endif

#ifdef RT_USING_FINSH

RT_WEAK char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
    int ch = -1;
 
    //#error "TODO 4: Read a char from the uart and assign it to 'ch'."
 
    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET)
    {
        ch = huart2.Instance->DR & 0xff;
    }
    else
    {
        if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_ORE) != RESET)
        {
            __HAL_UART_CLEAR_OREFLAG(&huart2);
        }
        rt_thread_mdelay(10);
    }
 
    return ch;
}

#endif /* RT_USING_FINSH */

3.3 移植FINSH

step -1: 控制台接口

 step -2: 添加接口函数

源代码

#ifdef RT_USING_CONSOLE

static int uart_init(void)
{
   //#error "TODO 2: Enable the hardware uart and config baudrate."
    MX_USART2_UART_Init();
    return 0;
}
INIT_BOARD_EXPORT(uart_init);

void rt_hw_console_output(const char *str)
{
   //#error "TODO 3: Output the string 'str' through the uart."
  rt_size_t i = 0, size = 0;
    char a = '\r';
 
    __HAL_UNLOCK(&huart2);
 
    size = rt_strlen(str);
    for (i = 0; i < size; i++)
    {
        if (*(str + i) == '\n')
        {
            HAL_UART_Transmit(&huart2, (uint8_t *)&a, 1, 1000);
        }
        HAL_UART_Transmit(&huart2, (uint8_t *)(str + i), 1, 1000);
    }
}

#endif

 3.4 添加OSTick

在stm32f1xx_it.c文件中调用rt_os_tick_callback

源代码

void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
  rt_os_tick_callback();
  /* USER CODE END SysTick_IRQn 1 */
}

4 测试

4.1 线程测试

RT-Thread默认会调用main()线程,在main()函数中添加一个断点验证其是否能进入

4.2 控制台验证

复位MCU,系统能正常打印log, 输入help命令后,MCU也能正常的响应该命令。说明系统已经移植成功。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/873979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

下载Mongodb 4.2.25 版本教程

1、MongoDB 安装包的下载链接 Download MongoDB Community Server | MongoDB 进入如下截图&#xff1a; 2、查找历史版本 往下拉&#xff0c;点击“...”,找到”Archived releases”,点击进入 、 3、下载Mongodb 4.2.25 版本 找到如下图4.2.25版本下载链接&#xff0c;点击就可…

LSP协议:打造流动性管理的市场新标杆

随着以太坊从 PoW&#xff08;工作量证明&#xff09;向 PoS&#xff08;权益证明&#xff09;的转型&#xff0c;PoS已然成为主流区块链共识机制的重要组成部分。再加上跨链技术的发展&#xff0c;包含比特币在内的不同生态之间进行资产质押与交换也催生出市场对于流动性管理的…

基于RP2350 MCU的树莓派Pico 2开发板及MicroPython编程使用

2021年1月21日,树莓派基金会同时发布了第1代RP2040 MCU芯片和基于RP2040 MCU的第1代树莓派Pico开发板(Raspberry Pi Pico/ Raspberry Pi Pico 1)。2024年8月8日,树莓派基金会又发布了第2代RP2350 MCU芯片并推出了基于RP2350 MCU的第2代树莓派Pico开发板(Raspberry Pi Pico 2)…

英文外链代发服务靠谱吗?

英文外链代发服务的可靠性因供应商和服务类型而异。外链代发服务的主要目标是提高网站在搜索引擎中的排名&#xff0c;通过增加指向目标网站的链接数量和质量来实现。然而&#xff0c;并不是所有的外链代发服务都是可靠的&#xff0c;很多外链都是只管发&#xff0c;但是发了有…

驾校预约学习系统的设计与实现

摘 要 伴随着信息技术与互联网技术的不断发展&#xff0c;人们进到了一个新的信息化时代&#xff0c;传统管理技术性没法高效率、容易地管理信息内容。为了实现时代的发展必须&#xff0c;提升管理高效率&#xff0c;各种各样管理管理体系应时而生&#xff0c;各个领域陆续进到…

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习&#xff1a;参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归&#xff08;SAheart.csv&#xff09; 【学习笔记】 陈强-机器学习-Python-…

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染&#xff1a;一项综述 文章目录 大规模语言模型的基准数据污染&#xff1a;一项综述摘要1 引言 摘要 大规模语言模型&#xff08;LLMs&…

海洋运输船5G智能工厂物联数字孪生平台,推进制造业数字化转型

海洋运输船5G智能工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。在当今全球制造业的浪潮中&#xff0c;数字化转型已成为不可逆转的趋势&#xff0c;它不仅重塑了生产流程&#xff0c;更深刻影响着企业的竞争力与可持续发展能力。其中&#xff0c;海洋运输船5G智能工…

LabVIEW中Request Deallocation 功能

此功能会在包含该功能的 VI 运行之后释放未使用的内存。 该功能仅适用于高级性能优化。在某些情况下&#xff0c;释放未使用的内存可以提高性能。然而&#xff0c;过于频繁地释放内存可能导致 LabVIEW 反复重新分配空间&#xff0c;而不是重用已有的内存分配。如果您的 VI 分配…

怎么修复松下相机死机视频只有0字节(0KB)的MDT文件【实测可修复】

死机后视频文件大小仅为0字节 松下S5相机录像死机&#xff0c;关机重新开机后有一个视频文件变成MDT&#xff0c;大小为0KB&#xff0c;录了30多分钟&#xff0c;本应为MOV格式的视频。0字节文件可以修复吗&#xff1f;怎么修复0字节的MDT文件为视频&#xff1f; 数据提取与视…

建造者模式builder

此篇为学习笔记&#xff0c;原文链接 https://refactoringguru.cn/design-patterns/builder 能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象

Centos7.9 安装Elasticsearch 8.15.1(图文教程)

本章教程,主要记录在Centos7.9 安装Elasticsearch 8.15.1的整个安装过程。 一、下载安装包 下载地址: https://www.elastic.co/cn/downloads/past-releases/elasticsearch-8-15-1 你可以通过手动下载然后上传到服务器,也可以直接使用在线下载的方式。 wget https://artifacts…

2024全国大学省数学建模竞赛A题-原创参考论文(部分+第一问代码)

一问题重述 1.1 问题背景 "板凳龙"&#xff0c;又称"盘龙"&#xff0c;是浙闽地区的传统地方民俗文化活动。这种独特的表演艺术形式融合了中国传统龙舞的精髓和地方特色&#xff0c;展现了人们对美好生活的向往和对传统文化的传承。 在板凳龙表演中&am…

如何正确选择防逆流监测多功能仪表?

安科瑞戴婷 什么是防回流&#xff1f; 什么是“逆流”&#xff1f;在电力系统中&#xff0c;电力通常从电网输送到负载&#xff0c;称为正向电流。安装光伏电站后&#xff0c;当光伏系统的功率大于本地负载的功率时&#xff0c;无法消耗的功率将被送至电网。由于电流方向与传…

【算法思想·二叉树】序列化

本文参考labuladong算法笔记[二叉树心法&#xff08;序列化篇&#xff09; | labuladong 的算法笔记] 要说序列化和反序列化&#xff0c;得先从 JSON 数据格式说起。 JSON 的运用非常广泛&#xff0c;比如我们经常将编程语言中的结构体序列化成 JSON 字符串&#xff0c;存入缓…

Unity面向对象补全计划 之 List<T>与class(非基础)

C# & Unity 面向对象补全计划 泛型-CSDN博客 关于List&#xff0c;其本质就是C#封装好的一个数组&#xff0c;是一个很好用的轮子&#xff0c;所以并不需要什么特别说明 问题描述 假设我们有一个表示学生的类 Student&#xff0c;每个学生有姓名和年龄两个属性。我们需要创…

MFC工控项目实例之十二板卡测试信号输出界面

承接专栏《MFC工控项目实例之十一板卡测试信号输入界面》 1、在BoardTest.h文件中添加代码 CButtonST m_btnStart[16],m_btnStart_O[16];2、在BoardTest.cpp文件中添加代码 UINT No_IDC_CHECK_O[16] {IDC_CHECK16,IDC_CHECK17,IDC_CHECK18,IDC_CHECK19,IDC_CHECK20,IDC_CH…

Apache Guacamole 安装及配置VNC远程桌面控制

文章目录 官网简介支持多种协议无插件浏览器访问配置和管理应用场景 Podman 部署 Apache Guacamole拉取 docker 镜像docker-compose.yml部署 PostgreSQL生成 initdb.sql 脚本部署 guacamole Guacamole 基本用法配置 VNC 连接 Mac 电脑开启自带的 VNC 服务 官网 https://guacam…

华为防火墙 nat64

如果设备接收到的IPv6报文的前缀是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv4网络&#xff0c;报文将经过NAT64处理后被转发至IPv4网络。 如果设备接收到的IPv6报文的前缀不是设备为NAT64定义的前缀&#xff0c;说明报文的目的地址是IPv6网络&#xff0c;报文…

大数据与人工智能:脑科学与人工神经网络ANN

文章目录 大数据与人工智能&#xff1a;脑科学与人工神经网络ANN一、引言ANN简介研究背景与应用领域发展背景应用场景 二、ANN背后的人脑神经网络人脑神经网络的专业描述神经元的结构信号处理 思考和认知过程认知功能的实现 对机器学习算法的启示 三、ANN的研究进展初始阶段&am…