一. 什么是嵌入式实时操作系统(RTOS)
1. 什么是RTOS:
解释:R(real)T(time)OS(Operating System)实时多任务操作系统,与传统的桌面操作系统不同,RTOS设计之初就为满足实时性的需求而生,它们能够保证系统响应外部事件的速度和时间的确定性。这些特性使得RTOS在航空航天、医疗设备、工业控制等领域得到了广泛应用。
IEEE的实时UNIX分委会认为RTOS 应具备:
1) 异步的事件响应。
2) 确定的切换时间和中断延迟。
3) 基于优先级的抢占式调度。
4) 内存锁定。
5) 同步机制。
2. RTOS的特点:
3.RTOS与RTOS Kernel(内核)
- 操作系统是一系列软件的集合,提供管理资源管理和应用代码服务的能力
- RTOS 除内核外包含了一系列的软件库(中间件)
1) 操作系统与内核之间的界限 并不明显,有时候还可以互换。
2) 一般讲:内核是操作系统的子集,它可以被视为将其他组件固定在一起的胶水。
3) FreeRTOS 和 µC/OS-III 是 一个实时内核。
4) Vxwork 是一个嵌入式实时 操作系统(RTOS)。
4.开源的RTOS
- RTEMS:实时多处理器系统,最早运用在美国国防系统。
- TOPPERS :日本开源的RTOS,创始人京都大学高田教授, 现在专注在汽车电子。
- FreeRTOS :其专注在支持MCU ,开源模式和生态好, Amazon托管成为IOT OS,授权从GPL改成MIT。
- eCOS:基于GNU 的RTOS,含TCP/IP和文件系统,在消 费电子产品有许多应用。
- Contiki:起源于无线传感网络的的RTOS ,有超低功耗管 理和IPV6支持。 • µC/OS : 2020年知名的RTOS µC/OS 变成开源软件。
- Zephyr:Linux基金会维护一个RTOS项目,Intel /NXP主导。
- Nuttx:POSIX API,无人机应用,小米Vela 的内核。
二.深入理解嵌入式操作系统的工作原理
1.RTOS的关键概念
实时操作系统的核心在于“实时性”——即系统能够在规定的时间内准确、可靠地完成指定的任务。这里有几个关键概念需要理解:
- 任务:也称为线程,是RTOS中的基本执行单位,每个任务都有自己的上下文和状态。
- 调度器:决定哪个任务应该在何时运行的组件。调度器通常基于任务的优先级来做出决策。
- 中断:一种机制,允许外设或事件立即获得CPU的注意,常用于处理紧急任务。
- 同步:确保多个任务可以协同工作,不会因为资源竞争而导致数据不一致的机制。
- 互斥量和信号量:用于实现任务同步的工具。
2.RTOS的任务管理
在RTOS中,任务管理是核心功能之一。每个任务都有一个明确的优先级,调度器根据这些优先级来分配CPU时间。任务的状态可以是就绪(Ready)、运行(Running)、阻塞(Blocked)或挂起(Suspended)。
void task_function(void) {
while (1) {
// Task code
if (some_condition) {
// Block on a semaphore if a condition is met
semaphore_wait(&some_semaphore);
}
// More task code
}
}
在这个任务函数的例子中,任务将循环执行代码,并在某个条件满足时等待一个信号量。如果信号量不可用,任务会进入阻塞状态,让出CPU资源,直到信号量被释放。
3.RTOS的调度策略
调度策略决定了任务执行的顺序和时机。常见的有:
- 抢占式调度:优先级高的任务抢占优先级低的任务所正在使用的CPU。
- 时间片段轮转调度:每个任务被分配一个时间片,用完后轮到下一个任务。
- 固定优先级调度:每个任务有一个固定的优先级,系统总是运行最高优先级的就绪任务。
4.RTOS的中断处理
中断处理在RTOS中极为重要,因为它允许系统快速响应外部事件。当中断发生时,当前执行的任务会被暂停,系统会立即执行与中断关联的中断服务例程(ISR)。
void ISR_Handler(void) {
// Handle interrupt
clear_interrupt();
semaphore_give(&some_semaphore); // Release a semaphore to unblock a task
}
在这个中断服务例程的例子中,ISR会清除中断标志,并释放一个信号量,这可能会导致等待该信号量的任务被解除阻塞。
5.RTOS的同步机制
为了防止多个任务同时访问共享资源而引起的冲突,RTOS提供了互斥量和信号量等同步机制。互斥量用于确保同一时间只有一个任务访问共享资源,而信号量则可以用于控制资源的访问数量或用作任务间的信号。
void task1_function(void) {
mutex_lock(&shared_resource_mutex);
// Access shared resource
mutex_unlock(&shared_resource_mutex);
}
void task2_function(void) {
mutex_lock(&shared_resource_mutex);
// Access shared resource
mutex_unlock(&shared_resource_mutex);
}
在这个例子中,两个任务都试图访问同一个共享资源。互斥量确保了在任何给定时间内,只有一个任务可以访问该资源。