RT-Thread 操作系统介绍、移植及内核介绍

RT-Thread 操作系统介绍、移植及内核介绍做世界级的 OS 让万物互联 信息畅通无阻 成为未来 AIoT 领域最为主流的操作系统平台

大家好,欢迎来到IT知识分享网。


一、介绍

1.1、愿景

做世界级的 OS,让万物互联,信息畅通无阻,成为未来 AIoT 领域最为主流的操作系统平台。

1.2、简介

1.3、发展历史

1.4、RTT OS概述

1.5、RT-Thread 架构

二、RT-Thread移植

2.1、分类

2.1.1、标准版本

如上为标准版本

2.1.2、Nano版本

2.1.3、Smart版本

2.2、标准版RTT移植

下载安装RT-Thread_Studio,安装完成后注册并登录后方可创建RTT工程。

在这里插入图片描述
在这里插入图片描述

1、新建工程,打开 IDE,点击【文件】-【新建】-【RT-Thread 项目】

在这里插入图片描述

3、工程创建完毕,连接硬件,可直接进行编译下载,如下所示:

在这里插入图片描述

4、通过修改 board.c 的 SystemClock_Config() 更改系统时钟

在这里插入图片描述

5、由于在创建工程向导中配置了控制台串口号及其引脚号,所以工程中已经实现了 uart 的驱动以及 rt_hw_console_output() ,默认可以进行打印。打开串口终端,可以发现在终端中执行了打印

在这里插入图片描述

在这里插入图片描述

7、链接硬件,编译下载后,在串口终端中按下 Tab 键,可查看系统中的命令:

在这里插入图片描述

三、RT-Thread内核介绍

3.1、内核框架

内核是操作系统最基础也是最重要的部分。下图为 RT-Thread 内核架构图,内核处于硬件层之上,内核部分包括内核库、实时内核实现。

在这里插入图片描述

3.1.1、线程调度

线程是 RT-Thread 操作系统中最小的调度单位,线程调度算法是基于优先级的全抢占式多线程调度算法,即在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身。支持 256 个线程优先级(也可通过配置文件更改为最大支持 32 个或 8 个线程优先级,针对 STM32 默认配置是 32 个线程优先级),0 优先级代表最高优先级,最低优先级留给空闲线程使用;同时它也支持创建多个具有相同优先级的线程,相同优先级的线程间采用时间片的轮转调度算法进行调度,使每个线程运行相应时间;另外调度器在寻找那些处于就绪状态的具有最高优先级的线程时,所经历的时间是恒定的,系统也不限制线程数量的多少,线程数目只和硬件平台的具体内存相关。

3.1.2、时钟管理

3.1.3、线程间同步

RT-Thread 采用信号量、互斥量与事件集实现线程间同步。线程通过对信号量、互斥量的获取与释放进行同步;互斥量采用优先级继承的方式解决了实时系统常见的优先级翻转问题。线程同步机制支持线程按优先级等待或按先进先出方式获取信号量或互斥量。线程通过对事件的发送与接收进行同步;事件集支持多事件的 “或触发” 和“与触发”,适合于线程等待多个事件的情况。

3.1.4、线程间通信

RT-Thread 支持邮箱和消息队列等通信机制。邮箱中一封邮件的长度固定为 4 字节大小;消息队列能够接收不固定长度的消息,并把消息缓存在自己的内存空间中。邮箱效率较消息队列更为高效。邮箱和消息队列的发送动作可安全用于中断服务例程中。通信机制支持线程按优先级等待或按先进先出方式获取。

3.1.5、内存管理

3.1.6、I/O 设备管理

RT-Thread 将 PIN、I2C、SPI、USB、UART 等作为外设设备,统一通过设备注册完成。实现了按名称访问的设备管理子系统,可按照统一的 API 界面访问硬件设备。在设备驱动接口上,根据嵌入式系统的特点,对不同的设备可以挂接相应的事件。当设备事件触发时,由驱动程序通知给上层的应用程序。

3.2、RTT内核启动流程

3.2.1、汇编阶段

在这里插入图片描述

Reset_Handler: //复位 /* Copy the data segment initializers from flash to SRAM */ movs r1, #0 b LoopCopyDataInit CopyDataInit: ldr r3, =_sidata ldr r3, [r3, r1] str r3, [r0, r1] adds r1, r1, #4 LoopCopyDataInit: ldr r0, =_sdata ldr r3, =_edata adds r2, r0, r1 cmp r2, r3 bcc CopyDataInit ldr r2, =_sbss b LoopFillZerobss /* Zero fill the bss segment. */ FillZerobss: movs r3, #0 str r3, [r2], #4 LoopFillZerobss: ldr r3, = _ebss cmp r2, r3 bcc FillZerobss /* Call the clock system intitialization function.*/ bl SystemInit /* Call static constructors */ /* bl __libc_init_array */ /* Call the application's entry point.*/ bl entry bx lr 

3.2.2、C阶段

在这里插入图片描述

使用外部高速时钟,时钟源晶振8MHz,系统时钟72MHz

【2】entry入口

int entry(void) { 
     rtthread_startup(); return 0; } 

3.2.2、rtthread_startup函数

int rtthread_startup(void) { 
     rt_hw_interrupt_disable(); //关闭硬件中断 /* * board level initialization */ rt_hw_board_init(); /* show RT-Thread version */ rt_show_version(); /* timer system initialization */ rt_system_timer_init(); /* scheduler system initialization */ rt_system_scheduler_init(); #ifdef RT_USING_SIGNALS /* signal system initialization */ rt_system_signal_init(); #endif /* create init_thread */ rt_application_init(); /* timer thread initialization */ rt_system_timer_thread_init(); /* idle thread initialization */ rt_thread_idle_init(); #ifdef RT_USING_SMP rt_hw_spin_lock(&_cpus_lock); #endif /*RT_USING_SMP*/ /* start scheduler */ rt_system_scheduler_start(); return 0; } 

3.2.3、创建主线程

//创建线程,线程函数main_thread_entry tid = rt_thread_create("main", main_thread_entry, RT_NULL, RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20); //开启线程 —— 将线程加入到系统的线程队列中,等待系统线程调度器遍历队列调用  rt_thread_startup(tid); 

开启线程调度器

//选择优先级最高的线程开始调度 rt_system_scheduler_start(); 
void main_thread_entry(void *parameter) { 
     extern int main(void); extern int $Super$$main(void); #ifdef RT_USING_COMPONENTS_INIT /* RT-Thread components initialization */ rt_components_init(); #endif  #ifdef RT_USING_SMP rt_hw_secondary_cpu_up(); #endif /* invoke system main function */ #if defined(__CC_ARM) || defined(__CLANG_ARM) $Super$$main(); /* for ARMCC. */ //进入用户的main函数入口 #elif defined(__ICCARM__) || defined(__GNUC__) main(); #endif } 

注意:

S u b Sub Sub f o o :定义的新功能函数,在 f o o ( ) 函数之前 / 后使用 foo :定义的新功能函数,在foo()函数之前/后使用 foo:定义的新功能函数,在foo()函数之前/后使用Sub$ $foo 可以添加一些新的程序代码。
S u p e r Super Super f o o :就是原始的未修补的 f o o 函数,使用这个 foo :就是原始的未修补的foo函数,使用这个 foo:就是原始的未修补的foo函数,使用这个Super$ $foo函数将直接跳转到foo()函数。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/119021.html

(0)
上一篇 2025-11-08 16:26
下一篇 2025-11-08 16:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信