RT-Thread编程指南 要点摘录(一)—— RTOS简述&内核基础

嵌入式系统,是指“嵌入对象体系中的专用计算机系统”

0 RT-Thread简介

RT-Thread是一款开源嵌入式实时操作系统(Real Time Operating System,RTOS),主要采用 C 语言编写。
实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理结果又能在规定的时间内来控制生产过程或对处理系统做出快速响应,并控制所有实时任务协调一致地运行的操作系统。

0.1为什么采用RTOS

一个典型的简单程序会被设计成一个串行的系统运行,按照准确的指令步骤一次一个指令的运行;
但是对于需要在固定的时间内“同时”处理多个输入输出的复杂实时应用则不可行:单线程的编程方式不但会使代码逻辑复杂、容易出错,同时也很难发挥出MCU的处理能力。因此,实时软件应用程序应该设计成一个并行的系统,让多线程并行,充分发挥系统资源的能力。

在嵌入式系统上开发程序,可以选择使用操作系统或者直接编写用户程序两种方式。是否选择操作系统,与项目的需求、硬件系统的规模及成本和开发者的编程习惯等因素有关。

提供即时响应和高可靠性是实时操作系统的主要特点。实时操作系统有硬实时软实时之分:
前者要求在规定的时间内必须完成操作;后者只要求按照任务的优先级别,尽可能快地完成操作即可。

实时操作系统和非实时操作系统的本质区别在于实时系统中的任务有时间限制,但是实时操作系统也可以用于不需要实时特性的场合。

目前大多数的嵌入式操作系统提供以下管理功能:

  1. 多任务管理
  2. 存储管理
  3. 周边资源管理
  4. 中断管理

0.2 IoT OS

物联网(Internet Of Things,IoT)操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台。
RT-Thread 就是一个 IoT OS。

0.3 RT-Thread的架构

  1. 内核层:RT-Thread 的核心部分
  2. 组件与服务层:基于 RT-Thread 内核之上的上层软件
  3. RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件
    在这里插入图片描述

1内核基础

内核由内核库实时内核组成。
内核库:是为了保证内核能够独立运行的一套小型的类似 C 库的函数实现子集;
实时内核:见图
在这里插入图片描述

1.1启动流程

一般执行顺序是:系统先从启动文件开始运行,然后进入 RT-Thread 的启动 rtthread_startup() 【RT-Thread 规定的统一启动入口】,最后进入用户入口 main();
在这里插入图片描述

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

1.2自动初始化机制

初始化函数只需要在函数定义处通过宏定义的方式进行申明,就会在系统启动过程中被执行。

1.3内核对象模型

此为本章重点部分

内核对象是系统提供的用户模式下代码与内核模式下代码进行交互的基本接口。
内核对象包括线程,信号量,互斥量,事件,邮箱,消息队列和定时器,内存池,设备驱动

1.3.1静态/动态内核对象

内核对象分为静态内核对象动态内核对象
在这里插入图片描述

静态对象会占用 RAM 空间,不依赖于内存堆管理器,内存分配时间确定;
动态对象则依赖于内存堆管理器,运行时申请 RAM 空间,当对象被删除后,占用的 RAM 空间被释放。

链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

1.3.2内核对象管理系统

RT-Thread 采用内核对象管理系统来访问 / 管理所有内核对象。
对象容器对象链表组成:
在这里插入图片描述

对象容器中包含了每类内核对象的信息;
对象容器给每类内核对象分配了一个链表,所有同一类型的内核对象都被链接到该链表上。

IPC:Inter-Process Communication,进程间通信。在 RT-Thread 实时操系统中,IPC对象的作用是进行线程间同步与通信。

各类内核对象具有派生和继承的关系。从面向对象的观点来看,每一种具体对象是抽象对象的派生,继承了基本对象的属性并在此基础上扩展了与自己相关的属性。
在这里插入图片描述

1.3.3对象控制块

对象控制块中,定义了通用的数据结构,用来保存各种对象的共同属性,各种具体对象只需要在此基础上加上自己的某些特别的属性,就可以清楚的表示自己的特征。

内核对象控制块的数据结构:

struct rt_object
{
     /* 内核对象名称     */
     char      name[RT_NAME_MAX];
     /* 内核对象类型     */
     rt_uint8_t  type;
     /* 内核对象的参数   */
     rt_uint8_t  flag;
     /* 内核对象管理链表 */
     rt_list_t   list;
};

对象控制块 rt_object 派生出来的有:线程对象、内存池对象、定时器对象、设备对象和 IPC对象;再由 IPC 对象派生出信号量、互斥量、事件、邮箱与消息队列、信号等对象。

1.3.4内核对象的管理方式

对于静态内核对象,通用的管理方式有:初始化、脱离
对于动态内核对象,通用的管理方式有:分配、删除
初始化和分配都会将相应的对象节点插入到对象容器的对象链表中,但是后者需要先从内存堆中分配对象所对应大小的内存空间,并进行初始化;
脱离和删除都会从从内核对象容器链表上删除相应的对象节点,但是前者不会释放对象占用的内存。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值