RTLinux和RTOS基本知识

1 HW RTOS
1.1 HW RTOS
RTOS为了实时性,一般都支持中断嵌套,例如FreeRTOS和QNX,但是非实时的ARM Linux不支持中断嵌套,参考本文2.4节。换句话说,强调高优先级中断的确定性时延,那么RTOS一定要支持中断嵌套。

RTOS够不够硬只有一个指标:就是最大关中断时间。RTEMS比μC/OS-II硬,因为μC/OS-II上下文切换的时候必须关中断,而RTEMS上下文切换的时候是开着中断的。

[15th-May-2022]
HW RTOS was designed by Renesas in 2012. HW RTOS module integrates 125MHz ARM Cortex-M3, refer to RZ/N1D, RZ/N1S, RZ/N1L datasheet.
CPU scheduler offload.
TCBs: 0x40080000 - 0x40088000, 32KB
Semaphores + Mutex: 0x40088000 - 0x40088400, 1KB
Interrupt Manager: 0x40088800 - 0x40088C00, 1KB
μC/OS‑III supports HW RTOS feature.

1.2 Linux实时性优化
[21th-May-2022]
首先画一个坐标图,横坐标表示执行的时间,纵坐标表示进程优先级。

硬件中断具有最高优先级,由于Linux内核不支持中断嵌套,所以Linux中的所有中断可以看作具有同一个优先级,中断之下的次优先级是rt_priority = 99的实时线程。

根据这个图可以知道,如果最高优先级的中断中有一个异常,譬如touch或者APL xHCI LTSSM或者SA8155 stmmac Rx overflow因为故障有大量的中断产生,那么就导致rt_priority = 99的实时线程watchdog不能被实时调度,watchdog超时后而导致kernel重启。

2 SoC中断
2.1 ARMv8中断
IPI:inter-processer interrupt 中断号0 - 15
PPI:per processor interrupts 中断号16 - 31
SPI:shared processor interrupts 中断号 32 - 224
SGI:software generated interrupts (SGI)
设备树是用来描述硬件信息的,因此里面不涉及软件中断SGI,在arm-gic.h文件中定义的只有SPI和PPI。
#define GIC_SPI 0
#define GIC_PPI 1

一般设备树中的中断都是SPI,那么interrupts = <0 208 1>是什么意思呢?
interrupts = <X Y Z>
X:GIC_SPI或者GIC_PPI
Y:物理中断号 - 32,SA8155
Z:触发方式
1 = low-to-high edge triggered
2 = high-to-low edge triggered (invalid for SPIs)
4 = active high level-sensitive
8 = active low level-sensitive (invalid for SPIs)

HCR_EL2: Hypervisor Configuration Register, Trapping and emulation就需要配置该寄存器

2.2 临界区开关CPU中断API
arm:local_irq_disable() / local_irq_enable() 在ARM V6以上使用汇编指令CPSID / CPSIE(Current Program Status Interrupt Disable / Enable)用于快速的开关中断,早期版本使用汇编指令mrs和msr去更新cpsr。

x86:local_irq_disable调用汇编指令CLI(clear interrupt-enable flag,IF);local_irq_enable调用汇编指令STI(set interrupt-enable flag,IF)。

arm的cpsid和x86的CLI同时禁止了核间中断(IPI),CPU-x还会用IPI通知CPU-y进行resched,但是CPU-y可能已经禁用了中断而不会响应。

在中断中不能产生调度,在中断返回时才可能发生调度。事实上,早期的内核很大程度上是依赖local_irq_disable来做资源保护,这个看看2.4的内核源码就很清楚了,里面有大量的对local_irq_disable函数的直接调用。

2.3 Linux Kernel中断处理
request_threaded_irq() - 实时中断处理,比较好。

如果成功注册了一个中断(中断号为300,中断名字为oem),那么通过ps命令可以看到该线程
irq/300-oem

中断优化:
echo 1 > /proc/sys/kernel/sched_boost

2.4 ARM Linux不支持中断嵌套
[19th-May-2022]
当ARM处理器收到中断的时候,它进入中断模式,同时ARM处理器的CPSR(Current Program Status Register,arm64 PSTATE)寄存器的IRQ位会被硬件设置为屏蔽IRQ。
Linux内核会在如下2个时候重新开启CPSR对IRQ的响应:
1)从IRQ Handler返回中断底半部的SOFTIRQ
2)从IRQ Handler返回一个线程上下文
从1)可以看出,SOFTIRQ里面是可以响应中断的。

Before 2010, ARM Linux supported nested interrupt through IRQF_DISABLED, IRQF_DISABLED was removed after 2010.

3 Linux内存管理
3.1 free命令
swapoff -a && swapon -a

free -h
显示的cache是指disk cache,也即是磁盘文件在内存中的缓存。
1) Clear PageCache only
# sync; echo 1 > /proc/sys/vm/drop_caches

2) Clear dentries and inodes
# sync; echo 2 > /proc/sys/vm/drop_caches

3) Clear PageCache, dentries and inodes
# sync; echo 3 > /proc/sys/vm/drop_caches

3.2 栈空间
Linux查看修改线程默认栈空间大小(ulimit -s,单位KB),Linux默认是8MB。

3.2.1 kmalloc
用于kmalloc可分配的内存大小范围在32~131027(128k)字节,并且由于它用slab分配器来分配内存的,所以得到的内存大小可能比你申请的要大一些(它向上取2的N次幂整数)。而且如果开启了CONFIG_LARGE_ALLOCS选项,这个值可以更大,可

<think>好的,用户想了解如何学习LinuxRTOS。我需要先理清这两个系统的区别联系,然后分步骤给出学习路径。 首先,Linux是一个通用的操作系统,主要用于服务器、桌面等,而RTOS是实时操作系统,适用于嵌入式实时应用。用户可能对嵌入式开发感兴趣,或者想了解两者的学习路线。 接下来,我应该先分别介绍学习LinuxRTOS的方法,然后再提到两者的结合应用,比如在嵌入式系统中使用LinuxRTOS的情况。 对于Linux部分,需要涵盖基础知识、常用命令、系统管理、内核原理等。学习资源方面,推荐书籍、在线教程实践项目。例如,《鸟哥的Linux私房菜》是个不错的选择,还有Linux From Scratch项目。 RTOS方面,要解释实时操作系统的概念,比如硬实时软实时的区别。常见的RTOS如FreeRTOS、RT-Thread,建议从简单的项目入手,比如任务调度、中断处理。实践部分可以推荐开发板,如STM32搭配FreeRTOS。 同时,用户可能需要了解如何将两者结合,比如在嵌入式Linux中使用实时补丁,或者RTOS与Linux共存的情况,但可能这部分属于进阶内容,初学者应先打好基础。 还要考虑用户的学习背景,如果是初学者,可能需要先掌握C语言基本的操作系统概念。如果用户已有一定基础,可以推荐更深入的内核源码分析实时系统设计。 最后,强调实践的重要性,建议通过项目巩固知识,参与开源社区,以及持续学习的重要性。避免过于理论化,保持步骤的可行性。</think>学习LinuxRTOS需要理论与实践结合,以下是分阶段学习路径: --- ### 一、Linux学习路线 #### 1. 基础入门 - **操作系统概念**:理解文件系统、进程管理、内存管理、I/O控制 - **Linux环境搭建**:安装虚拟机(VirtualBox/VMware)或双系统 - **命令行操作**: ```bash $ ls, cd, cp, mv, rm # 文件操作 $ grep, awk, sed # 文本处理 $ ps, top, kill # 进程管理 $ chmod, chown # 权限控制 ``` #### 2. 系统管理 - 软件包管理:apt/yum/dnf - 服务管理:systemd(`systemctl start/stop/enable`) - 日志分析:`/var/log/`目录与journalctl - 网络配置:ifconfig/ip/netstat #### 3. 内核与开发 - 编译内核:通过`make menuconfig`定制 - 驱动开发:字符设备/块设备驱动框架 - 系统调用:学习glibc与内核交互机制 - 推荐书籍:《Linux内核设计与实现》《深入理解Linux内核》 #### 4. 高级实践 - 部署Web服务器(Nginx/Apache) - 使用GDB调试内核崩溃 - 参与开源项目(如KernelNewbies) --- ### 二、RTOS学习路线 #### 1. 核心概念 - **实时性分类**: - 硬实时(严格时限,如航空航天) - 软实时(允许偶尔超时,如流媒体) - **关键机制**: - 任务调度(优先级抢占/时间片轮转) - 中断处理(ISR设计原则) - 进程间通信(信号量/消息队列/邮箱) #### 2. 开发环境搭建 - 硬件选择:STM32开发板(Cortex-M系列) - 工具链:ARM GCC + OpenOCD - 推荐RTOS: ```c FreeRTOS(最轻量,适合入门) RT-Thread(国产,组件丰富) Zephyr(Linux基金会支持) ``` #### 3. 基础开发流程 1. 创建任务: ```c xTaskCreate(vTaskFunction, "Task1", 128, NULL, 1, NULL); ``` 2. 实现同步: ```c xSemaphoreCreateBinary(); // 二值信号量 xQueueSend(qHandle, &data, portMAX_DELAY); // 消息队列 ``` 3. 中断服务例程: ```c void EXTI0_IRQHandler() { if(xSemaphoreGiveFromISR(xSemaphore, NULL) == pdTRUE) { portYIELD_FROM_ISR(); } } ``` #### 4. 进阶学习 - 内存管理:静态分配 vs 动态池分配 - 低功耗设计:Tickless模式 - 实时性能分析:Worst-Case Execution Time(WCET)测量 --- ### 三、Linux与RTOS结合应用 #### 1. 双系统架构 - **AMP模式**:多核CPU中Linux运行在A核,RTOS运行在R核(如TI Sitara) - **通信方式**:共享内存/RPMsg #### 2. 实时性增强 - **PREEMPT_RT补丁**:将Linux内核改造为软实时系统 - **Xenomai**:双内核方案,实时任务直接由协内核处理 --- ### 四、学习资源推荐 | 类型 | Linux资源 | RTOS资源 | |------------|-------------------------------------------|----------------------------------------| | 书籍 | 《UNIX环境高级编程》 | 《Mastering FreeRTOS》 | | 在线课程 | edX: "Introduction to Linux" | 野火/正点原子开发板配套教程 | | 实践平台 | Raspberry Pi做IoT网关 | STM32F4 Discovery + FreeRTOS | | 社区 | kernel.org, Stack Overflow | FreeRTOS论坛, RT-Thread开发者社区 | --- ### 五、关键注意事项 1. Linux学习误区: - 不要死记命令,掌握`man``--help`用法 - 避免直接操作生产环境,先用虚拟机实验 2. RTOS调试技巧: - 使用Tracealyzer可视化任务调度 - 通过内存溢出检测工具(如FreeRTOS的heap4方案) 3. 职业发展建议: - Linux方向:云计算/嵌入式Linux开发 - RTOS方向:工业控制/自动驾驶实时系统 建议每天至少2小时实践,例如: - 第1周:完成Linux文件系统操作练习 - 第2周:在STM32上实现FreeRTOS多任务LED控制 - 第3周:交叉编译Linux驱动模块并加载
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值