[信息]

嵌入式操作系统基础知识总结

[复制链接]
楼主: junpeng324
手机看帖
扫描二维码
随时随地手机跟帖
junpeng324|  楼主 | 2018-6-17 20:29 | 显示全部楼层
中断优先级
当几个中断同时产生时,首先响应哪个中断是个值得考虑的问题。当前绝大多数的处理
器都支持中断优先级的概念,也就是说,为不同的中断源配置不同的优先级,优先级是固定
的或者可以通过软件配置。当多个中断同时产生(或者说需要处理)时,首先响应优先级高
的中断,这样就能优先处理高优先级的事件。不同的处理器可能有不同的中断优先级策略。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-17 20:30 | 显示全部楼层
中断嵌套
与中断相关的另一个重要的问题是中断嵌套。当处理器正在处理某个中断时,如果有其
他中断发生,那么就得仔细考虑如何处理新的中断。对于简单的处理器来说,可能本身并不
支持中断嵌套,在中断响应阶段就把中断给关闭了。而当前大多数的处理器是支持中断嵌套
的,方案基本是结合中断优先级的嵌套方式。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-17 20:30 | 显示全部楼层
Trochili RTOS 介绍
Trochili RTOS 是一个全新的适用于嵌入式领域的实时操作系统,主要用 C 语言开发,支
持多任务、多优先级、抢占式调度。英文名称 TROCHILI 取善鸣的小鸟之意,意味着体积小
巧、动作灵敏。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-17 20:31 | 显示全部楼层
主要特点如下:
1.支持抢占式调度多任务模型。
2.最多支持 32 个任务优先级,多个任务可以拥有同优先级。
3.不同优先级任务采用优先级调度,相同优先级任务间采用时间片调度。
4.支持用户回调定时器和任务定时器。操作系统内置用户定时器守护线程。
5.支持常见 IPC 机制,如 semaphore、mailbox、message、mutex、flag。
6.充分总结各种机制的共性和特性,基于通用 IPC 控制结构和操作流程,做了完整简洁
的实现。
7.可配置的 IPC 调度机制,支持 FIFO 和优先级两种方式的线程阻塞队列。紧急消息操
作优先普通消息操作。
8. 大量 API 支持在 ISR 中调用。
9. 代码实现简洁,注释完备,有十分详尽的中文注释。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-17 20:41 | 显示全部楼层
Trochili RTOS 基本实现了上面介绍的 RTOS 的知识点,并且有自己的独特实现。目前还
不能说它是一套成熟稳定的商业代码,但作为学习和理解 RTOS 确实是不可多得的好资料。
从代码、注释和文档上看,都提供了大量的图表和大段的中文注释,这些是在别的 RTOS 代
码中看不到。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-17 20:42 | 显示全部楼层
Trochili RTOS 主要实现了以下几个功能:
❏ 线程管理和调度
❏ 信号量和互斥量
❏ 邮箱和消息队列
❏ 事件集合
❏ 定时器和其守护线程
❏ RTOS 移植和启动
❏ 调试选项

使用特权

评论回复
junpeng324|  楼主 | 2018-6-17 20:42 | 显示全部楼层
线程结构设计
Trochili RTOS 目前的版本没有明确提供进程机制,而是以线程来代表用户任务,线程同
时作为资源分配和任务调度的基本单位。从整体上考虑,可以把操作系统和用户任务看作是
一个大的进程,而整个系统内则有多个用户线程。我们可以把 Trochili RTOS 定义为基于轻
量级多线程的多任务系统。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 10:54 | 显示全部楼层
线程的结构设计
Trochili RTOS 是通过线程结构管理线程的,每个线程都存在一个线程结构。线程结构定
义在文件 include\kernel\thread.h 中,其中包括操作系统用来管理线程的全部信息。作为操作
系统的一种核心数据结构,线程结构决定了操作系统的很多特点。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 10:56 | 显示全部楼层
线程主要包括 5 种状态
❏ 休眠态:处于此状态的线程不再参与线程调度。线程初始化后即处于此状态。
❏ 就绪态:代表线程正在参与内核调度,随时可能被内核加载到处理器中运行。当前内
核并没有单独设置一个运行态来代表正在处理器上运行的线程,而是以一个内核全局
变量“当前线程”来代替。
❏ 阻塞态:说明线程因为某些条件不允许而无法完成一些具体操作,只好暂停运行,等
待条件满足后继续运行。
❏ 延时态:线程因为在时间方面的要求,暂停运行,延时一段时间继续运行。
❏ 挂起态:处于此状态的线程不再参与线程调度,直到解除挂起为止。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 10:56 | 显示全部楼层
线程初始化操作
线程被初始化后就处于休眠状态,置于内核线程辅助队列中。此时它并不参与线程调度,只是安静地待在队列中等待内核激活。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 10:57 | 显示全部楼层
线程激活操作
通过线程激活操作将线程转为就绪状态,并置于内核线程就绪队列中,等待内核调度。
在内核中某一时刻可能多个线程处于就绪状态,但是只有一个线程在运行,称为当前线程。
当前线程保持在内核线程就绪队列中。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 11:16 | 显示全部楼层
线程休眠操作
通过线程休眠操作可以将处于任何状态的线程(包括当前线程)返回到休眠状态。这意
味着被休眠的线程不再参与线程调度,直到再次激活。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 11:31 | 显示全部楼层
线程阻塞操作
如果线程尝试访问某些资源但是由于某些原因而没能成功,根据访问规则,如果是非阻
塞的访问方式,那么线程返回失败结果后继续运行;如果是阻塞的访问方式,那么线程就会
被内核阻塞在该资源的线程阻塞队列上(每个拥有线程阻塞特性的资源都存在相关的线程阻
塞队列,用来保存那些希望得到资源但又不能得到资源的线程)。随后,内核发起线程调度,
使得当前线程放弃处理器,内核会加载其他线程来运行。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 11:32 | 显示全部楼层
线程阻塞解除操作
在线程释放资源时,假如该资源的线程阻塞队列上有线程被阻塞,那么当前线程会通过
内核从这些被阻塞的线程中唤醒一个线程,并使它得到该资源,随后内核将该线程加入内核
中的线程就绪队列。(因为有新的线程可以运行,所以此时内核尝试发起线程调度。但是这样
也只是给了新线程一个参与竞争处理器资源的机会,不保证新线程能够立刻得到处理器。)

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 11:37 | 显示全部楼层
线程延时操作
线程调用延时函数时,线程首先将被延时的线程置于延时状态并加入内核辅助线程队
列,然后开启该线程的定时器。因为在等待定时结束的这段时间里,该线程不再参与内核线
程调度,所以如果被延时的是当前线程则需要立刻进行一次线程调度。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 11:39 | 显示全部楼层
取消延时操作
包括线程的延时操作被明确终止,或者延时时间到达。前者会提前将线程从延时状态中
恢复,继续参与线程调度。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 11:48 | 显示全部楼层
线程挂起操作
对处于就绪或者运行的线程进行挂起操作之后,就直接转为挂起状态,此时被挂起的线
程会从线程就绪队列转到线程辅助队列。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 11:49 | 显示全部楼层
线程唤醒操作
处于挂起的线程可以被唤醒,线程从线程辅助队列中转移到线程就绪队列,并且状态设
置为就绪状态,等待被处理器再次运行。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 12:03 | 显示全部楼层
线程时间片
在线程时间片长度的设置上,不同线程可以拥有不同长度的时间片,并且线程时间片长
度也可以通过相关的 API 函数修改,即 Trochili RTOS 支持动态时间片分配方案。注意某些
特殊的内核线程可能没有被赋予“时间片长度可改”的授权,对这样的线程进行时间片长度
的修改是不会成功的。

使用特权

评论回复
junpeng324|  楼主 | 2018-6-18 12:04 | 显示全部楼层
线程函数和线程数据
线程函数必须是一个无限循环体,应用功能代码在循环体内,这样保证线程代码不会执
行完毕而直接返回,否则会因内核无法捕获线程退出消息,从而导致内核错误。如果确实需
要退出,则应该通过系统调用,显式通知内核该线程需要退出。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则