RT-Thread简介

RT-Thread简介

RT-Thread是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。经过16个年头的沉淀,伴随着物联网的兴起,它正演变成一个功能强大、组件丰富的物联网操作系统。

RT-Thread概述

RT-Thread,全称是Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。

事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短,任务与任务之间通过任务调度器进行非常快地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。

在RT-Thread系统中,任务通过线程实现的,RT-Thread中的线程调度器也就是以上提到的任务调度器。

RT-Thread主要采用C语言编写浅显易懂方便移植
它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。

  • 针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要3KB Flash、1.2KB RAM内存资源的NANO版本。
  • 对于资源丰富的物联网设备,RT-Thread又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似Android的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。

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

许可协议

RT-Thread系统完全开源,遵循Apache License 2.0开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码,没有潜在商业风险。

RT-Thread的架构

近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。

终端联网使得软件复杂性大幅增加,传统的RTOS内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。

物联网操作系统是指以操作系统内核为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台。

RT-Thread就是一个IoT OS。

RT-Thread与其他很多RTOS如FreeRTOS、uC/OS的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间件组件

在这里插入图片描述
它具体包括以下部分:

  • 内核层:RT-Thread内核,是RT-Thread的核心部分,包括了内核系统中对象的实现,例如多线程及其调度,信号量,邮箱,消息队列,内存管理,定时器等。libcpu/BSP(芯片移植相关文件/板级支持包)与硬件密切相关,由外设驱动和CPU移植构成。
  • 组件与服务层:组件是基于RT-Thread内核之上的上层软件,例如虚拟文件系统、FinSH命令行、网络框架、设备框架等。做到组件内部高内聚,组件之间低耦合。
  • RT-Thread软件包:运行于RTT物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。

RT-Thread提供了开放的软件包平台,这里存放了官方提供或者开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择。

软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 400+,如下举例:
物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。
脚本语言相关的软件包:目前支持 Lua、JerryScript、MicroPython、PikaScript。
多媒体相关的软件包:Openmv、mupdf。
工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。
外设库与驱动类软件包:RealTek RTL8710BN SDK。
其他。

Keil模拟器STM32F103上手指南

一般嵌入式操作系统因为它的特殊性,往往和硬件平台密切相关连,具体的嵌入式操作系统往往只能在特定的硬件上运行。
对于刚接触RT-Thread操作系统的读者并不容易马上就获得一个和RT-Thread操作系统相配套的硬件模块,但随着计算机技术的发展,我们可以采用软件方式来模拟一个能够运行RT-Thread操作系统的硬件模块,这就是ARM公司的MDK-ARM仿真模拟环境。

MDK-ARM(MDK-ARM Microcontroller Development Kit)是一套完整的集成开发环境(IDE),它出自 ARM 公司,包括了针对 ARM 芯片(ARM7,ARM9,Cortex-M 系列,Cortex-R 系列等)的高效 C/C++ 编译器;针对各类 ARM 设备、评估板的工程向导,工程管理;用于软件模拟运行硬件平台的模拟器;以及与市面上常见的如 ST-Link,JLink 等在线仿真器相连接以配合调试目标板的调试器。MDK-ARM 软件中的软件仿真模拟器,采用完全软件模拟方式解释执行 ARM 的机器指令,并实现外围的一些外设逻辑,从而构成一套完整的虚拟硬件环境,使得用户能够不借助真实的硬件平台就能够在电脑上执行相应的目标程序。

MDK-ARM集成开发环境因为其完全的STM32F103软件仿真环境,也让我们有机会在不使用真实硬件环境的情况下直接在电脑上运行目标代码。

这套软件仿真模拟器能够完整地虚拟出 ARM Cortex-M3 的各种运行模式、外设,如中断异常,时钟定时器,串口等,这几乎和真实的硬件环境完全一致。实践也证明,本文使用到的这份 RT-Thread 入门例程,在编译成二进制代码后,不仅能够在模拟器上软件模拟运行,也能够不需要修改地在真实硬件平台上正常运行。

MDK-ARM正式版是收费的,如果希望能够编译出更大体积的二进制文件,需要购买正式版。
RTT也支持自由软件基金会的GNU GCC编译器,这是一款开源的编译器。

初始RT-Thread

在这里插入图片描述

  • applications:应用程序

rt-thread:源文件

  • conponents:组件目录
  • include:内核头文件
  • libcpu:各类芯片的移植代码,此处包含了STM32的移植文件
  • src:内核源文件

系统启动代码

一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。

以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中。

系统启动后先从汇编代码startup_stm32f103xe.s开始运行,然后跳转到C代码,进行系统功能初始化,最后进入用户程序入口main()。

在conponents.c里定义的代码:

int $Sub$$main(void)
{
	rt_hw_interrupt_disable();
	rtthread_startup();
	return 0;
}

RTT支持多种平台和多种编译器,rtthread_startup()函数是规定的统一入口点。

int rtthread_startup(void)
{
    rt_hw_interrupt_disable();

    /* board level initalization
     * NOTE: please initialize heap inside board 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();

    /* start scheduler */
    rt_system_scheduler_start();

    /* never reach here */
    return 0;
}

这部分启动代码,大致可以分为四个部分:

  • 初始化与系统相关的硬件
  • 初始化系统内核对象,例如定时器,调度器
  • 初始化系统设备,这个主要是为RT-Thread的设备框架做的初始化
  • 初始化各个应用线程,并启动调度器

用户入口代码

上面的启动代码基本上可以说都是和RT-Thread系统相关的,但main函数作为了用户代码入口,只需要在main函数里添加自己的代码即可。

为了在进入main程序之前,完成系统功能初始化,可以使用 s u b sub sub 和 和 super$$函数标识符在进入主程序之前调用另外一个例程,这样可以让用户不用去管main()之前的系统初始化操作。

03-26
### 关于 RT-Thread 的技术文档与实现 RT-Thread 是一种广泛应用于嵌入式设备和物联网场景中的开源实时操作系统 (RTOS)[^1]。其设计目标在于提供高效的任务调度机制以及丰富的中间件支持,从而满足现代嵌入式系统的复杂需求。 #### 官方资源推荐 对于深入学习 RT-Thread 的技术细节,最权威的参考资料来自官方文档站点[^2]。该网站不仅涵盖了基础概念介绍,还包含了详细的 API 文档、系统架构解析以及实际案例教程等内容。特别是关于系统启动流程的部分,开发者可以从中了解 RT-Thread 如何初始化硬件资源并建立运行环境。 #### 数据接收处理流程详解 在 RT-Thread 中,网络数据包的接收过程涉及多个层次的合作完成。具体来说,当外部数据到达时会触发相应的硬件中断事件,随后进入预定义好的中断服务程序 HAL_ETH_RxCpltCallback()[^3]。此阶段的主要工作是对原始帧进行初步封装并通过消息队列提交给专门负责后续操作的应用层线程 eth_rx_thread_entry 进一步处理。 在此过程中值得注意的是以下几个关键环节: 1. **缓冲区管理**: 使用 pbuf 结构体作为载体存储待解析的数据片段; 2. **协议栈分发**: 调用 `device->netif->input()` 方法将接收到的内容送至更高层面继续分析判断属于哪种类型的通信单元(如 IP 或 ARP 请求响应等); 3. **高层逻辑执行**: 根据不同类别分别交由对应的子模块去实施特定功能——比如 TCP/IP 协议族下的四种主要分支路径(即 UDP/TCP/ICMP/IGMP 处理链路)或者是针对地址解析协议(ARP)所特有的两种情形处置方式。 下面展示了一段简化版伪代码用于演示上述提到的核心部分如何协作运作: ```c // 假设这是某个网卡驱动内部定义的一个典型回调函数实现样例 void HAL_ETH_RxCpltCallback(void){ struct net_buf *p = allocate_pbuf(); // 创建一个新的缓冲对象实例 if(fill_data_into_pbuf(p)){ post_to_mailbox(&rx_queue, &p); // 将填充好后的数据项放入共享信箱等待消费端提取 rt_event_send(rx_event_flag); // 发布信号通知关联任务有新事务到来可被取走处理 } } // 对应消费者角色扮演者也就是之前提及过的那个独立线程入口点声明形式如下所示: int eth_rx_thread_entry(void* parameter){ while(1){ wait_for_signal_or_timeout(rx_event_flag); process_received_packet(fetch_from_mailbox(&rx_queue)); } } ``` 以上仅作示意用途并不代表真实源码结构布局情况,请参照正式发行版本获取最新且完整的解决方案说明文件查阅更详尽的技术指导材料链接已附带于开头处供参考访问使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼干饼干圆又圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值