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选项,这个值可以更大,可
RTLinux和RTOS基本知识
最新推荐文章于 2025-03-15 12:00:00 发布