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

极简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中断中执行的。内容包括:先检查时间片是否超时,修改线程状态,是否进行线程调度,检查定时器链表等。

定时器

硬件定时器

精度高,可达纳秒级,且为中断触发方式。

硬件定时器模式下,定时器超时函数需要在中断的上下文环境下执行。和中断服务函数的要求一致,执行时间要短,执行时不能挂起线程,不能去申请和释放动态内存。

软件定时器

软件定时器是操作系统提供的一类系统接口,构建在硬件定时器基础之上(例如系统的Tick中断),所以不受数量限制。

相当于启动了一个定时执行的线程。

定时器的工作机制

与RTT定时器模块十分重要的两个全局变量:

1. rt_tick(记录系统运行时间的变量,单位一般为ms,可自行设置)

2. 定时器链表rt_timer_list。新创建和激活的定时器会按照超时时间排序插入到该链表中。

定时器在定时时间到了后会从该定时器链表移除,但是周期性定时器移除后又会重新添加到链表中。此处涉及RTT源码的解读

定时器相关API

具体API可在RTT官方手册中查找,这里只介绍API。

创建和删除定时器:要使用定时器,得先创建。使用完后也可以删除。

初始化定时器和脱离定时器:想重新设置定时器参数,可以对定时器进行初始化。

启动定时器和停止定时器:定时器创建后要先启动才能够使用。如果不想用了,可以手动停止。

   

高精度延时

us级的延时函数

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

相关文章:

  • 高等数学第六章---定积分(§6.1元素法6.2定积分在几何上的应用1)
  • XILINX原语之——xpm_fifo_async(异步FIFO灵活设置位宽、深度)
  • vscode远程服务器连接----过程尝试写入的管道不存在
  • javascript Map 和对象使用
  • echarts报错问题initialize failed:invalid dom
  • AI技术下研发体系重构
  • Vue项目Git提交流程集成
  • Leetcode 刷题记录 07 —— 链表
  • excel表数据导入数据库
  • Selenium模拟人类,操作网页的行为(全)
  • Pointpillars(三)工程实践
  • 新手SEO基础操作入门精要
  • Java学习手册:Base64 编码概念和应用场景
  • 解锁创意显示,强力巨彩软模组引领柔性显示技术创新
  • 随机快速排序算法
  • GAN模型
  • 总结七种提示优化方案的核心实现流程
  • 第15章 Python数据类型详解之分解理解:基础数据类型常见易错点和性能优化篇
  • Visual Studio 快捷键更改和设置
  • 【C++游戏引擎开发】第30篇:物理引擎(Bullet)—软体动力学系统
  • Java开发 自定义注解(更新中)
  • MySQL 常用函数分类
  • 编程日志4.25
  • 十分钟了解 @MapperScan
  • 盛元广通动物表型分析数字管理平台
  • framebuffer框架与示例
  • 保障企业的数据安全需要做什么?
  • npm下载插件无法更新package.json和package-lock.json文件的解决办法
  • 脑机接口:从科幻到现实,它将如何改变医疗未来?
  • 岳冉RFID手持式读写器专业研发+模块定制双驱动