嵌入式linux设计电子钟,基于APIC时钟的嵌入式Linux的实时性分析

2023-12-08 02:50

本文主要是介绍嵌入式linux设计电子钟,基于APIC时钟的嵌入式Linux的实时性分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

引言

嵌入式Linux是指对Linux进行剪裁后,将其固化在单片机或者存储器中,应用于特定场合的专用Linux系统。嵌入式系统要求实时性能高,但Linux为分时系统设计的操作系统,尽管最新的内核在实时性能方面有所提高,但它仍然不是一个实时系统,在很多场合不能满足实时性要求。一般地,通过改造Linux的内核以提高其实时性能有2种策略:一种是采用底层编程的方法对Linux内核进行修改(如调度算法、时钟修改等),典型的系统有Kansas大学开发的KURT。文献提出了抢占式内核调度算法,容易引起内核优先级翻转,文献针对非抢占式内核,增加抢占点,该方法需要优秀的调度算法。另一种途径是Linux的外部实时性扩展,在原有Linux基础上再设计一个用于专门处理实时进程的内核,典型的系统有RTLinux、RTAI等。此方法的不足是RTLinux现在已经停止了更新,目前的开源版本仅支持2.4内核,RTAI的设计原理和RTLinux类似,也是一个实时性应用接口。

本文采用APIC时钟修改的方法对Linux内核进行实时化改造,修改APIC中断函数,将APIC中断和8254中断排序,使得硬实时中断的优先级大于普通8254中断。通过多组仿真实验,验证了该改造方法是有效的。

1 嵌入式Linux的实时性分析

Linux设计的初衷是系统吞吐量的平衡,其内核试图通过一种公平分配的策略来实现各进程平均地共享系统资源:

(1)内核的不可抢占性:Linux的内核在单处理器上不可抢占,当一个任务进入内核态运行时,一个具有更高优先级的进程,只有等待处于核心态的系统调用返回后方能执行,这将导致优先级逆转。

(2)进程调度的不可抢占性:Linux作为一个分时系统,采用多级反馈轮转调度算法,它保证了每一个进程都有一种调度策略,但是都放在同一个队列中运行,这也是Linux作为实时操作系统的一个弱点。图1是Linux调度机制框图。

(3)时钟中断的精度不高:Linux 2.4.X内核的时钟中断周期为10 ms,时钟粒度太过于粗糙,不能满足实时性要求。

(4)Linux的虚拟存储管理:Linux采用段和页机制的虚拟存储管理技术,进程在硬盘和内存间的换入换出必然带来额外的开销,造成很大的延迟。

b482b6637d2a69fd069ad18a6776f2c4.png

由此可见,要将Linux应用于嵌入式系统,必须对其进行实时化改造,以适应嵌入式领域要求。

2 基于时钟修改的内核改造方案

在单CPU系统中,与时间有关的活动都是由8254时钟芯片来驱动的,8254产生0号中断。直接修改内核定时参数HZ的初值就可构造细粒度定时器。这种方式实现起来很简单,但是由此带来频繁的定时中断使得系统的开销很大,当然随着硬件速度的提高,这种开销会逐步降低。

简单地修改赫兹参数HZ进行实时化的方法显然并不可取。Linux 2.6内核的时钟粒度是1 ms,但仍然与嵌入式领域的实时化要求差距较远,因此需要更高精度的时钟。目前常见的修改时钟系统达到实时化的方法都是从软件层面着手,这方面己获得较大进展,但是从时钟系统的硬件结构分析并开展实时化工作也是一个值得注意的方向。本文利用先进的APIC时钟实现一个高精度时钟系统,提供了高精度的中断响应,从而以较少的改动获得较高的实时性。

APIC以总线频率工作,可立即执行所有的定时器操作,目前x86都有片内APIC,用户可在单CPU内使用APIC。APIC除了能提供高精度的时钟外还具有一个重要的优点,是由于它位于片内,对其编程只需几个CPU指令周期,而对IntelX86的8254存取需要若干慢速的ISA总线指令。

在100MHz的CPU系统中,处理一个中断的时间不到10μs,因此高速CPU完全可在更短的时间内处理更多的APIC中断。理论上APIC可实现10 ns左右的系统时钟,但实际上在处理中断时要耗费一些时间,因此中断的响应时间要大于10 ns。

APIC本身提供了中断处理函数apic_timer_interrupt,该函数包括Irq_enter(),Run_realtimer_queue()和irq_exit(),其中函数irq_ exit通常负责判断当前是否有8254产生的软中断存在,如果存在,就会触发8254软中断,这样会造成APIC硬中断处理延迟。本文的思路就是修改irq_exit,在其中将各软中断线程和硬中断线程进行排序,使APIC硬中断的优先级高于软中断,此时硬中断线程得到优先处理,从而提高内核的实时性能。Irp_exit函数的核心代码如下:

e969f901ca97c8c4e2fdbd2df4cb66a1.png

上面调用invoke_softirq()函数执行软中断使本文修改的重点,修改中断向量表,对向量表中所有软中断和实时中断进行排序,提前硬中断的时间片,这样使当前处于pending状态的软中断被屏蔽和悬挂,直到硬中断处理完成为止。将invoke_softirq()函数修改为:

086dfa128c4569b8d7eb5495965f491d.png

每个处理器时间片上能够处理的中断只有一个,通过更新当前任务时间片,使硬中断在第一时间获得CPU的响应,此时软中断将被屏蔽,这就保证了硬中断能够得到实时的响应。

由于Linux采用8254完成时序分配,8254需要保留以保证系统的稳定性。这样的话,8254定时器和APIC必须共存,对于硬实时应用,可采用APIC时钟进行计时。在8254中断过程中,如果产生APIC中断,采用通过本文的方珐必须对优先对APIC时钟进行响应,会出现8254中断被抢占,此时上下文切换等操作可能导致不可预料的错误。解决问题的方法可采取在APIC相应中断期间,关闭软中断,只有当APIC中断执行完毕后,8254软中断才能够被响应。

3 实时性能测试与分析

实验条件1:CPU:PⅢ300 MHz,内存为128 MB,硬盘为5 400转的15 GB台式机硬盘,操作系统为Fedora2.6.18内核。环境一(vd-d1)采用原版内核,环境二(vd-d2)采用改进型内核。测试方法为通过测试内核的上、下文切换、内存延迟及模拟外部中断来评价改造前后的性能。统计测试结果,如图2、图3所示。

bfa4eed2f43342cf0e205dc1d01fe2a3.png

从实验结果可知,在上、下文切换中I/0读/写和文件打开和关闭,改进型内核的实时性能都有明显提高,模拟TCP通道子项,改进型内核性能提高了约6倍,但在对中断响应要求不是很高的null call测试中,中断响应时间几乎相同。改进型内核中断响应速度始终稳定在微妙级。在处理器负荷较轻时原始内核有着良好的内存延迟,随着处理器负荷的进一步加重,原始内核的内存延迟急剧增加。在最差情况下,系统响应速度较慢,延迟时间达到5μs。而改进型内核在处理器负荷变化时,系统的响应速度变化不明显,而且中断响应速度始终稳定在2μs以下,性能稳定。

实验条件2:采用改进型内核,环境一(vd-d2)CPU:PIII 300 MHz,环境二(vd-d3)CPU降频为200 MHz(接近ARM9)。统计测试结果,获得它们的文件系统延迟结果见图4。图4反映了同样采用改进型内核,将CPU降频前后,测试结果差距在10μs以内,可看出在文件系统延迟中,处理器频率的较小差距对内核的影响不大。如采用高主频的处理器,实验结果差距较大。

3a70dc0dc12b75a58e557033803194d2.png

4 结语

本文通过修改APIC时钟,可显著地改进嵌入式系统的实时性能,通过对比试验可看出改进型内核具有良好的实时性能,满足了系统实时性和稳定性要求。本文方法使得嵌入式Linux系统在高实时性领域中得到实际的应用。

打开APP精彩内容

点击阅读全文

这篇关于嵌入式linux设计电子钟,基于APIC时钟的嵌入式Linux的实时性分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/468279

相关文章

MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析

《MyBatis-Plus中Service接口的lambdaUpdate用法及实例分析》本文将详细讲解MyBatis-Plus中的lambdaUpdate用法,并提供丰富的案例来帮助读者更好地理解和应... 目录深入探索MyBATis-Plus中Service接口的lambdaUpdate用法及示例案例背景

MyBatis-Plus中静态工具Db的多种用法及实例分析

《MyBatis-Plus中静态工具Db的多种用法及实例分析》本文将详细讲解MyBatis-Plus中静态工具Db的各种用法,并结合具体案例进行演示和说明,具有很好的参考价值,希望对大家有所帮助,如有... 目录MyBATis-Plus中静态工具Db的多种用法及实例案例背景使用静态工具Db进行数据库操作插入

Linux下修改hostname的三种实现方式

《Linux下修改hostname的三种实现方式》:本文主要介绍Linux下修改hostname的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下修改ho编程stname三种方式方法1:修改配置文件方法2:hFvEWEostnamectl命

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

Linux搭建Mysql主从同步的教程

《Linux搭建Mysql主从同步的教程》:本文主要介绍Linux搭建Mysql主从同步的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux搭建mysql主从同步1.启动mysql服务2.修改Mysql主库配置文件/etc/my.cnf3.重启主库my

基于Canvas的Html5多时区动态时钟实战代码

《基于Canvas的Html5多时区动态时钟实战代码》:本文主要介绍了如何使用Canvas在HTML5上实现一个多时区动态时钟的web展示,通过Canvas的API,可以绘制出6个不同城市的时钟,并且这些时钟可以动态转动,每个时钟上都会标注出对应的24小时制时间,详细内容请阅读本文,希望能对你有所帮助...

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

jdk21下载、安装详细教程(Windows、Linux、macOS)

《jdk21下载、安装详细教程(Windows、Linux、macOS)》本文介绍了OpenJDK21的下载地址和安装步骤,包括Windows、Linux和macOS平台,下载后解压并设置环境变量,最... 目录1、官网2、下载openjdk3、安装4、验证1、官网官网地址:OpenJDK下载地址:Ar

linux本机进程间通信之UDS详解

《linux本机进程间通信之UDS详解》文章介绍了Unix域套接字(UDS)的使用方法,这是一种在同一台主机上不同进程间通信的方式,UDS支持三种套接字类型:SOCK_STREAM、SOCK_DGRA... 目录基础概念本机进程间通信socket实现AF_INET数据收发示意图AF_Unix数据收发流程图A

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份