打印
[信息]

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

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

使用特权

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

使用特权

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

使用特权

评论回复
44
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. 代码实现简洁,注释完备,有十分详尽的中文注释。

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

使用特权

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

本版积分规则