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

RT-Thread自用记录(暂定)

此文章为理论居多,以及和FreeRTOS的对比。

想看代码实操,可以去看基于RT-Thread Studio的RT-Thread入门教程_rt-thread studio 开发threadx系统教程-CSDN博客

FreeRTOS和RTT的简单对比

RTOS与裸机对比

裸机程序架构

裸机的程序结构一般为前后台系统。程序包括一个死循环和若干个中断服务函数。简单来说前台系统就是中断服务程序。

总结下就是,前后台:死循环+中断。中断服务程序为前台系统。大循环为后台系统。

RTOS架构

主要通过优先级抢占和时间片轮转机制进行调度。可以保证高优先级的任务先执行。

内核基础

RT-Thread的启动流程

1.系统先从启动文件开始运行。2.进入RT-Thread启动函数,rtthread_startup()。3.进入用户的main函数

启动函数的作用

主要包括禁用系统中断,板级初始化,系统定时器和调度器的初始化。

stm32启动文件的作用

由下图可得知,启动文件有以下作用。

1.初始化SP指针

2.初始化PC指针,指向Reset_Handler。也就是执行复位中断服务函数

3.设置中断向量表

4.初始化时钟

5.调用main函数

启动文件执行完SystemInit后会跳转到entry函数,然后在entry函数中调用rtthtrad_startup()。

内核的配置方法

1.如果是用的RT-Thread Studio 的IDE则是配置RT-Thread Seting

2.直接配置rtcconfig.h文件,根据需求,修改里面的宏定义即可。

线程管理

概念介绍

线程是RT-Thread中最基本的调度单位。

FreeRTOS中的“任务”在RT-Thread中则称为”线程“。二者叫法不同,但是实际指代的对象是一样的。

线程控制块

每个线程都有直接的线程控制块。线程控制块存放着线程的基本信息,如:优先级,线程名称,线程状态等。

在FreeRTOS中则叫做”任务控制块“。

线程的状态

RT-Thread中线程的状态5钟有:初始态,就绪态,运行态,关闭态,挂起态。

FreeRTOS中,任务的状态有4种:就绪态,运行态,阻塞态,挂起态。

RT-Thread的状态比FreeRTOS多一个初始状态。所以RTT中的线程创建好后需要我们手动开启才能运行。

线程创建

RTT中的线程创建分为动态和静态。

区别:静态创建需要自己指定线程栈的起始地址(需要自己创建线程栈和定义线程控制块)。动态创建则是系统分配。此外,动态创建函数的返回值是线程控制块,静态创建函数的返回值是错误码。

简单来说就是创建参数不同,函数返回值不同。

空闲线程和空闲钩子函数

 空闲线程是RTT中优先级最低的线程。用来处理一些非紧急任务,常用于系统指示灯的运行和CPU使用率的统计。

空闲钩子函数就是空闲线程执行时运行的函数。

时钟管理

时钟节拍介绍

时钟节拍(OSTick)是RTT的最小时间单位。系统采用时钟节拍进行周期性的中断,一般在1ms到100ms之间,可以自己设置。时钟节拍设置的越快的,实时响应旧越快,但是系统的开销就越大。

简单理解就是,每经过一个时钟节拍就会执行一个时钟节拍的中断。假设设置为1ms,则每1ms都会进行执行中断,就像STM32中的SysTick_Handler中断一样。

如何配置时钟节拍?

在rtconfig.h中,修改RT_TICK_PER_SECOND这个宏定义即可。

 

内核通过全局变量rt_tick记录当前的时钟节拍值。类似STM32HAL库中的uwTick。

全局变量rt_tick在每次时钟节拍中断时都会自加一次。我们也可以通过API获取当前时钟节拍值。

获取当前时钟节拍值的API:rt_tick_t rt_tick_get(void)

(这个地方面试容易问到)

同时和FreeRTOS一样,线程的调度也是在OS Tick中断中执行的。内容包括:先检查时间片是否超时,修改线程状态,是否进行线程调度,检查定时器链表等。

定时器

硬件定时器

软件定时器

定时器的工作机制

http://www.xdnf.cn/news/303607.html

相关文章:

  • 第四章-初始化Direct3D
  • 餐饮部绩效考核管理制度与综合评估方法
  • 【java】程序设计基础 八股文版
  • 开放的力量:新零售生态的共赢密码
  • 每日算法-250506
  • weapp-vite - 微信小程序工具链的另一种选择
  • OpenGL超大分辨率图像显示
  • Windows玩游戏的时候,一按字符键就显示桌面
  • imapal sql优化之hint
  • Codeforces Round 1023 (Div. 2) (A-D)
  • USB学习【2】通讯的基础-反向不归零编码
  • 优势演员-评论家A2C详解:python从零实现
  • 【KWDB 创作者计划】一文掌握KWDB的时序表管理
  • 计算机中的逻辑运算
  • DVWA靶场保姆级通关教程--03CSRF跨站请求伪造
  • 碰一碰发视频源码搭建的定制化开发实践
  • 代码随想录算法训练营第九天 |【字符串】151.翻转字符串里的单词、卡码网55.右旋转字符串、28.实现strStr、459.重复的子字符串
  • Ubuntu 22.04 安装配置远程桌面环境指南
  • K8s 常用命令、对象名称缩写汇总
  • Mysql group by 用法
  • ResNet50应用于农业保险现场照片作物种类核验
  • 【coze】故事卡片(图片、音频、文字)
  • 【漫话机器学习系列】242.欠拟合(Underfitting)
  • 端口隔离 实验 讲解
  • UE5 GAS开发P47 游戏标签
  • Kotlin 中 List 和 MutableList 的区别
  • 网络自动化与可观测性:构建自愈型智能网络体系
  • 什么是进程,如何管理进程
  • 【2025】Visio 2024安装教程保姆级一键安装教程(附安装包)
  • Java基础学完,继续深耕(0506)SQL--多表关系