首页 > 其他分享 >RT-THREAD的STM32F4系列移植

RT-THREAD的STM32F4系列移植

时间:2024-03-07 23:34:29浏览次数:31  
标签:RT rt CODE THREAD Thread void USER STM32F4

RT-Thread:

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,但允许多个任务同时运行并不意味着处理器在同一时刻真的执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),所以给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务是通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。

RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本(NANO 是 RT-Thread 官方于 2017 年 7 月份发布的一个极简版内核);而对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速地模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。

相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。虽然 32 位 MCU 是它的主要运行平台,实际上很多带有 MMU、基于 ARM9、ARM11 甚至 Cortex-A 系列级别 CPU 的应用处理器在特定应用场合也适合使用 RT-Thread。

Software_framework_diagram

RT-Thread官网介绍

避免弯路:教你RT-Thread完美移植!-电子工程专辑 (eet-china.com)

官方学习文档:新手指导 (rt-thread.org)

实时KEIL导入升级:

下载std链接中的rt-thread.pack安装;

百度网盘链接:https://pan.baidu.com/s/1ytMyePfxoB42inkKE_Qrwg?pwd=p9l0
提取码:p9l0

使用环境:keil5.28与STM32CubeMX

在已经写好的裸机程序中再次点击软件包管理,勾选RTOS- RT-THREAD下的kernel,内核必须选上,shell与device可选可不选,shell提供的是命令行的控制方式,device是rtt提供的设备接口

首先来看生成的RTOS目录中的文件都有哪些。我们会发现好多文件都有上锁图标,应该是只读,不允许修改,挺人性化的。所以移植修改的目标就很明确了,修改board.c和rtconfig.h。

添加完毕后编译一下,发现有报错,是rtt官方在这里留下的让你跳转来看的提示

void rt_hw_board_init(void) {

#error "TODO 1: OS Tick Configuration."

/* * 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. */

我们接下来需要将一些rtt的系统级的函数覆盖掉我们代码中功能冲突的函数

  1. rt_os_tick_callbackrtconfig.h中对外声明,在rtconfig.h中找个合适的地方添加如下语句
extern void rt_os_tick_callback(void);
  1. 打开处于Core目录下的stm32f1xx_it.c或者f4xxit,c文件,找到systick的中断服务函数(ctrl+F搜索这一行void SysTick_Handler(void)),如果使用hal库的代码,就能发现我们生成的代码中有调用HAL库的接口,此时只需将其屏蔽,替换成RT-Thread提供的板级移植函数rt_os_tick_callback即可。
/* USER CODE BEGIN Includes */
#include "rtconfig.h"
/* USER CODE END Includes */
/**
 1. @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */
#if 0
  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */
#endif
	rt_os_tick_callback();
  /* USER CODE END SysTick_IRQn 1 */
}
  1. 修改rt_hw_board_init,(ctrl+F搜索这一行)将官方留下的#error手动报错注释掉,将硬件初始化放至其中(就是你hal库的main函数中的初始化)
void rt_hw_board_init(void)
{
//#error "TODO 1: OS Tick Configuration."
    /* 
     * 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
		HAL_Init();
		SystemClock_Config();
		MX_GPIO_Init();
}

4.修改编译错误。此时编译会发现HardFault和PendSV报错,注释掉整个函数即可(ctrl+f找过去注释)。

 

5.修改led闪烁的操作。原先代码使用软件阻塞延时实现,由于阻塞会对任务调度造成影响,且会一直处于运行态,导致任务无法切换,对应延时函数RT-Thread也提供了,所以这里我们使用RT-Thread提供的接口-rt_thread_mdelay,一个提供ms级别延时的接口。

while (1) {

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

rt_thread_mdelay(1000);//Delay(1000);

HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);

rt_thread_mdelay(1000);//Delay(1000);

HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);

}

如此这般,裸机转rtt系统就成了

RT-Thread Stdio工具开发:

RT-Thread Studio下载

标签:RT,rt,CODE,THREAD,Thread,void,USER,STM32F4
From: https://www.cnblogs.com/POPCATER/p/18060037

相关文章

  • VUE+Echarts安装与配置01
    1、创建VUEnpminitvue@latest//初始化VUE,执行创建向导任务npminstall//安装相关依赖npmrundev//运行程序,查看创建结果2、创建Echartsnpminstallecharts//安装Echarts插件import*asechartsfromecharts//引用Echarts3、引......
  • 22_BKP备份寄存器&RTC实时时钟
    BKP备份寄存器&RTC实时时钟BKP简介BKP基本结构一个数据寄存器存2字节RTC简介选LSE的32.768kHZ的时钟频率,因为支持VBAT供电RTC框图RTC基本结构硬件电路供电方案RTC操作注意事项读写备份寄存器接线图代码main.c#include"stm32f10x.h"......
  • prometheus监控+alertmanager告警
    prometheus监控+alertmanager告警 配置告警规则1、创建规则目录mkdir/usr/local/prometheus/rules2、编写告警规则文件。vim/usr/local/prometheus/rules/rule.yml#添加以下配置groups:-name:instance-abnormalrules:-alert:POD新增告......
  • QQ 测试 AI 聊天搭子,再战 AI 社交;零一万物宣布开源 Yi-9B 模型丨 RTE 开发者日报 Vol.
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点......
  • day57 动态规划part14 代码随想录算法训练营 53. 最大子数组和
    题目:53.最大子数组和我的感悟:理解难点:递推公式想错了。听课笔记:我的错误的代码:通过截图:代码易错点:老师代码:扩展写法:资料:......
  • day57 动态规划part14 代码随想录算法训练营 1035. 不相交的线
    题目:1035.不相交的线我的感悟:换汤不换药理解难点:换了个壳子听课笔记:多理解这个题意我的代码:classSolution:defmaxUncrossedLines(self,nums1:List[int],nums2:List[int])->int:#因为强调顺序,所以跟1143最长公共子序列是一样的dp......
  • [转]mkcert 使用指南:如何快速创建自签名 SSL 证书
    原文地址:mkcert使用指南:如何快速创建自签名SSL证书-知乎我们平时在本地开发时,有时会要求通过HTTPS请求来访问。一个通用的做法是用OpenSSL生成自签证书,然后对Web服务进行配置。但OpenSSL的命令比较繁琐,参数也比较复杂,用起来不够方便。于是我找到了一个替代方案:mkce......
  • day57 动态规划part14 代码随想录算法训练营 1143. 最长公共子序列
    题目:1143.最长公共子序列我的感悟:你永远不知道自己有多厉害!加油!理解难点:递推公式如何想,通过图,来记忆。听课笔记:我的代码:classSolution:deflongestCommonSubsequence(self,text1:str,text2:str)->int:#假设text1为内层,text2为外层n......
  • CF1899G Unusual Entertainment 题解
    分析一眼树上启发式合并。定义\(x_i\)为节点\(i\)在序列\(p\)中的下标。则问题转化为:对于每组\(l,r,k\),询问以\(k\)为根的子树中是否有一个以上的节点,满足\(l\lex_j\ler\)。使用set存以\(i\)为根的子树中\(x_j\)的有序排列。则对于每个\(k=i\)的询问,去合......
  • npm报错:request to https://registry.npm.taobao.org failed, reason certificate ha
    NPM使用遇到错误:错误原因:淘宝镜像过期解决方案:​ 1.查看当前npm设置:npmconfiglist​ 2.清空缓存:npmcacheclean--force​ 3.修改npm为淘宝镜像:npmconfigsetregistryhttps://registry.npmmirror.com​ 4.再次查看npm设置,已经修改为淘宝镜像)​ 问题解决......