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

news2024/11/18 1:35:40

目录

概述

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也能正常的响应该命令。说明系统已经移植成功。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法-morris遍历

morris遍历的优点在于节省空间&#xff0c;因为不需要递归。 public class MorrisTraversal {public static void main(String[] args) {Node head new Node(4);head.left new Node(2);head.right new Node(6);head.left.left new Node(1);head.left.right new Node(3);h…

实验二 局域网与互联网的连接

一、实验目的 1.掌握网络工程中网络拓扑设计与设备选型 2.掌握局域网与互联网的连接技术。 3.掌握访问控制规则的设置方法。 二、实验描述 某中学校园网网络初步规划如下&#xff1a;学生机房使用192.168.10.0/24网段&#xff1b;办公主机使用192.168.20.64/29网段&#x…

基于JAVA+SpringBoot+Vue的企业级工位管理系统

基于JAVASpringBootVue的企业级工位管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; …

C++之运算符

除法 / 结果的数据类型与除数 被除数 保持一致 &#xff08;除数即分母 不能为0&#xff09; 取模取余数 % &#xff08;除数即分母 不能为0&#xff09; a a 赋值运算符 逻辑运算符&#xff1a;非 与 或 非&#xff1a; 与&#xff1a;同真为真&#xff0c;其余为假 或&am…

大模型背后的秘密武器:向量数据库引领数据革命

在探讨为何向量数据库会成为大模型热潮中的基础设施之前,我们首先需要深入理解非结构化数据的本质、其迅猛增长的动因,以及这一趋势如何驱动了数据存储与检索技术的革新。随着人工智能(AI)技术的飞速发展,特别是在自然语言处理(NLP)、计算机视觉(CV)等领域的突破性进展…

.net 调用海康SDK实现NVR录像视频的下载

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,最近一直被测试拿捏,痛苦的挣扎中… 我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯…

简单计算机网络概念

1.浏览器过程 输入url&#xff0c;解析url 1.协议http、https的区别&#xff1b;HTTPS就是在HTTP与TCP之间增加了SSL/TSL安全传输层 2.格式&#xff1a;协议//主机:端口/路径&#xff1b; 3.HTTP版本&#xff1a;1.0和1.1 4.HTTP/1.1&#xff1a;1. 持久连接&#xff1a;为了…

Windows子系统Ubuntu安装MySQL及windows的navicate连接

Windows子系统Ubuntu安装MySQL及局域网连接 MySQL8.0之前 mysql8.0版本

证件照背景替换软件有哪些?证照之星怎么换背景色

在照相馆拍的证件照不满意&#xff0c;自行在家拍摄了证件照&#xff0c;却不会处理复杂的照片背景怎么办呢&#xff1f;其实可以使用专业软件来替换证件照背景。这篇文章就告诉大家证件照背景替换软件有哪些&#xff0c;证件照背景替换怎么弄。 一、证件照背景替换软件有哪些…

4千6历年高考英语试题大全ACCESS\EXCEL数据库

《历年高#考英语试题大全ACCESS数据库》搜集了大量的全#国各#地高#考英语模拟试题&#xff0c;每道题目均有相应的答案和解析&#xff1b;这种数据虽然没有《一站到底》类的数据结构&#xff08;一个选项一个字段&#xff09;那么好&#xff0c;但是通过技术人员还是可以很简单…

基于SSM的图书馆管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的图书馆管理系统7拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;图书管理、类型管理、借阅管理、续借管理、归还管理、罚金管理、留言管理等 学生用户&#xff1a;借…

前端速通面经八股系列(八)—— React篇(上)

React目录 一、组件基础1. React 事件机制2. React的事件和普通的HTML事件有什么不同&#xff1f;3. React 组件中怎么做事件代理&#xff1f;它的原理是什么&#xff1f;4. React 高阶组件、Render props、hooks 有什么区别&#xff0c;为什么要不断迭代5. 对React-Fiber的理解…

眼科市场格局固化,排名靠后的光正眼科还能逆袭吗?

眼科是A股的热门领域&#xff0c;也是医疗的黄金赛道。或许也正因为如此&#xff0c;这条赛道已经习惯了通过并购&#xff0c;利用资本杠杆跑马圈地。以最大规模的龙头爱尔眼科为首&#xff0c;并购是眼科的常规操作。 然而&#xff0c;真正观察赛道腰部及以下的公司&#xff…

十八、计算机视觉-canny边缘检测

文章目录 前言一、canny检测的流程1.高斯滤波&#xff08;Gaussian Smoothing&#xff09;2.梯度计算&#xff08;Gradient Calculation&#xff09;3.非极大值抑制&#xff08;Non-maximum Suppression&#xff09;4.双阈值检测&#xff08;Double Thresholding&#xff09;5.…

6、Flume安装

按照采集通道规划&#xff0c;需在hadoop102&#xff0c;hadoop104两台节点分别部署一个Flume。可参照以下步骤先在hadoop102安装&#xff0c;然后再进行分发。 1. Flume安装部署 1.1 安装地址 &#xff08;1&#xff09; Flume官网地址&#xff1a;Welcome to Apache Flume…

COCI2016-2017#1 Kralj

目录 COCI2016-2017#1 Kralj题目描述背景输入输出数据范围 题解解法 打赏 COCI2016-2017#1 Kralj 题目描述 背景 精灵王将 n n n个精灵编号为 1 , ⋯ , n 1 , \cdots , n 1,⋯,n&#xff0c;矮人王将 n n n个矮人围成一个圆环&#xff0c;从某个矮人开始顺时针编号为 1 , ⋯…

Mysql高级篇(中)——SQL性能分析

Mysql高级篇&#xff08;中&#xff09;—— SQL性能分析 一、&#xff08;了解&#xff09;MySQL Query Optimizer 的主要功能和原理二、&#xff08;了解&#xff09;MySQL 常见瓶颈三、关键字 EXPLAIN1、是什么2、基本语法3、EXPLAIN 执行信息详解&#xff08;1&#xff09…

Windows--linux共享文件夹

1、如果共享文件夹设置在Windows上面 文件夹设置 个人家里电脑通常不设置用户名密码 linux端mount命令行 mount -t cifs -o usernamewade,vers3.0 //192.168.0.143/openvswitch-2.17.10 /root/windows

计算机专业选题推荐-基于python的岗位兼职招聘平台【python-爬虫-大数据定制】

&#x1f496;&#x1f525;作者主页&#xff1a;毕设木哥 精彩专栏推荐订阅&#xff1a;在 下方专栏&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; 实战项目 文章目录 实战项目 一、基于python的岗位兼职招聘平…

我的第3个AI项目-Advanced RAG with Gemma, Weaviate, and LlamaIndex

目录 一、项目简介概述时间kaggle地址&#xff08;代码和详细注解&#xff09;主要工作和收获技术栈数据集结果 二、bug修复在 Kaggle 使用模型时需要先同意该模型的使用条款使用 GPU 时显存不足把 Weaviate 从V3升级到V4改动一&#xff1a;创建client改动二&#xff1a;判断某…