利用RTLinux开发嵌入式应用程序

合集下载

嵌入式linux操作系统原理与应用

嵌入式linux操作系统原理与应用

嵌入式Linux操作系统是一种针对嵌入式设备设计和优化的Linux操作系统。

它在嵌入式系统中发挥着关键作用,为嵌入式设备提供了丰富的功能和灵活性。

以下是嵌入式Linux操作系统的原理和应用方面的概述:嵌入式Linux操作系统原理:内核:嵌入式Linux操作系统的核心是Linux内核,它提供了操作系统的基本功能,包括处理器管理、内存管理、设备驱动程序、文件系统和网络协议栈等。

裁剪:为了适应嵌入式设备的资源限制,嵌入式Linux操作系统通常经过裁剪和优化,只选择必要的功能和驱动程序,以减小内存占用和存储空间,并提高性能和响应速度。

交叉编译:由于嵌入式设备通常具有不同的硬件架构和处理器,所以嵌入式Linux操作系统需要通过交叉编译来生成适用于目标设备的可执行文件和库。

设备驱动:嵌入式Linux操作系统需要适配各种硬件设备,因此需要编写和集成相应的设备驱动程序,以使操作系统能够正确地与硬件进行通信和交互。

嵌入式Linux操作系统应用:嵌入式设备:嵌入式Linux操作系统广泛应用于各种嵌入式设备,如智能手机、平板电脑、家用电器、工业控制系统、车载设备等。

物联网(IoT):随着物联网的快速发展,嵌入式Linux操作系统被广泛应用于连接的嵌入式设备,用于数据采集、通信、远程控制和智能化管理。

嵌入式开发板:嵌入式Linux操作系统在开发板上提供了丰富的开发环境和工具链,用于嵌入式软件开发和调试。

自定义嵌入式系统:开发者可以基于嵌入式Linux操作系统构建自定义的嵌入式系统,根据特定需求进行定制和开发,实现各种功能和应用。

嵌入式Linux操作系统的原理和应用非常广泛,它为嵌入式设备提供了灵活性、可定制性和强大的功能支持,使得开发者能够构建高度定制化和功能丰富的嵌入式系统。

嵌入式系统开发中的RTOS使用方法

嵌入式系统开发中的RTOS使用方法

嵌入式系统开发中的RTOS使用方法嵌入式系统是指集成了硬件和软件的特定目的的计算机系统,广泛应用于诸如汽车电子、智能家居、医疗设备和工业自动化等领域。

嵌入式系统需要实时响应外部事件,并处理多个并发任务,在这种情况下,使用实时操作系统(RTOS)是一种常见的解决方案。

RTOS是一种特殊的操作系统,其设计目标是实时性能的最大化。

RTOS提供了实时任务调度、同步、通信和内存管理等功能,以确保软件任务以可靠、可预测的方式运行。

本文将介绍嵌入式系统开发中RTOS的使用方法,包括RTOS的选择、任务管理、中断处理和资源管理。

首先,选择合适的RTOS对于嵌入式系统开发至关重要。

考虑到系统需求和硬件限制,开发人员应该评估不同RTOS的功能和性能,选择最适合的RTOS。

一些流行的RTOS包括FreeRTOS、uC/OS、VxWorks和QNX等。

选择合适的RTOS是根据具体项目需求进行的,例如实时性要求、多任务需求、可靠性要求、开发工具支持等。

任务管理是RTOS的核心功能之一。

开发人员可以使用RTOS提供的任务调度器来管理嵌入式系统中的多个任务。

任务调度器基于优先级和任务状态来决定任务运行顺序。

在任务的创建和销毁过程中,开发人员需要注意任务的优先级设置和任务之间的依赖关系。

中断处理是嵌入式系统开发中另一个重要的方面。

中断是一种在系统中断常规程序执行的事件,例如外部设备的输入、定时器溢出等。

RTOS提供了中断处理机制,使得中断可以按照优先级和预定的顺序来处理。

开发人员应该了解RTOS中的中断处理机制,并编写有效的中断服务程序(ISR)来实现快速响应和处理中断事件。

资源管理在嵌入式系统中是必不可少的。

开发人员需要确保任务之间共享的资源(如内存、设备、文件等)能够安全地访问和操作。

RTOS提供了各种资源管理机制,如信号量、互斥量和消息队列等。

开发人员应该根据具体需求选择适当的资源管理机制,并正确地使用资源锁定机制以避免竞争条件和死锁等问题。

linux对嵌入式系统开发的重要作用

linux对嵌入式系统开发的重要作用

linux对嵌入式系统开发的重要作用随着技术的不断进步,嵌入式系统的应用越来越广泛,从家电产品到汽车电子控制系统,从智能家居到医疗设备等领域,都需要使用嵌入式系统来实现各种功能。

而在嵌入式系统开发中,Linux的作用越来越重要,下面我们来分析其原因。

首先,Linux具有开放源代码的特点。

对于嵌入式系统开发者来说,开放源代码意味着可以自由地使用、修改和分发软件代码,从而使得开发过程更为自由和灵活。

开放源代码的特点使得嵌入式Linux可以轻松地定制和适应各种硬件和应用场景。

嵌入式开发人员可以根据自己的实际需要,自由地选择和整合各种软件和库,以构建针对特定应用场景的定制化嵌入式系统。

其次,Linux是一种轻量级的操作系统。

在嵌入式系统中,往往需要占用较少的内存和存储空间,而Linux的轻量级操作系统设计使得其能够在资源受限的嵌入式系统中高效工作。

相比传统的嵌入式操作系统,Linux具有更高的稳定性、更好的设备支持和更丰富的软件库,可以实现更多的功能和应用。

第三,Linux拥有强大的群体支持。

作为一种开放源代码的操作系统,Linux的应用范围非常广泛,拥有众多的开发者和用户群体。

嵌入式开发人员可以通过各种社区和论坛来共享经验和交流技术,从而更快地解决问题和完善开发。

此外,各大厂商也在不断推出针对嵌入式系统的Linux产品,提供了更为完善的支持和服务,使得嵌入式Linux 的开发和部署变得更加可靠和简单。

第四,Linux拥有丰富的工具和生态系统。

随着各种开发工具和平台的不断完善,嵌入式开发变得越来越高效和简洁。

Linux的生态系统同样非常丰富,例如工具链、交叉编译器等,可以让嵌入式开发人员更好地进行开发和调试。

同时,Linux还支持各种软件开发工具和测试框架,可以更好地保证软件的质量和可靠性,使得Linux在嵌入式系统开发中有着不可替代的优势。

综上所述,Linux对嵌入式系统开发的作用非常重要。

作为一种开放源代码的操作系统,Linux具有更高的自由度和灵活性,可以更好地满足嵌入式系统开发的需求。

嵌入式实验一(嵌入式 Linux 开发环境的搭建及 Makefile 应用)

嵌入式实验一(嵌入式 Linux 开发环境的搭建及 Makefile 应用)

实验一嵌入式 Linux 开发环境的搭建及 Makefile 应用一、实验目的:1.熟悉嵌入式 Linux 开发基本过程及基本命令。

2.了解嵌入式 Linux 开发中各种工具的基本用途。

3.搭建好嵌入式 Linux 的开发环境。

4.通过对包含多文件的 Makefile 的编写,熟悉各种形式的Makefile 编写,加深对 Makefile 中用户自定义变量、自动变量及预定义变量的理解。

二、实验内容:1.安装 Vmware 及 Ubuntu;2.熟悉 Linux 下相关命令:属性查询、修改,路径、目录的查询、修改、删除,压缩、解压等;3.熟悉编辑工具;4.熟悉 makefile 文件的基本作用(编写一个包含多文件的Makefile)。

三、Make 工程管理器:Makefile如今能得以广泛应用,这还得归功于它被包含在Unix系统中。

在make诞生之前,Unix系统的编译系统主要由“make”、“install”shell脚本程序和程序的源代码组成。

它可以把不同目标的命令组成一个文件,而且可以抽象化依赖关系的检查和存档。

这是向现代编译环境发展的重要一步。

1977年,斯图亚特·费尔德曼在1贝尔实验室里制作了这个软件。

2003年,斯图亚特·费尔德曼因发明了这样一个重要的工具而接受了美国计算机协会(ACM)颁发的软件系统奖。

Makefile文件是可以实现自动化编译,只需要一个“make”命令,整个工程就能完全自动编译,极大的提高了软件开发的效率。

目前虽有众多依赖关系检查工具,但是make是应用最广泛的一个。

一个程序员会不会写makefile,从一个侧面说明了这个程序员是否具备完成大型工程的能力。

1.Makefile 基本规则一个简单的 Makefile 语句由目标、依赖条件、指令组成。

smdk6400_config :unconfig@mkdir -p $(obj)include $(obj)board/samsung/smdk6400其中:smdk6400_config:目标;unconfig:先决条件;@mkdir -p $(obj)include $(obj)board/samsung/smdk6400:指令。

嵌入式linux开发教程pdf

嵌入式linux开发教程pdf

嵌入式linux开发教程pdf嵌入式Linux开发是指在嵌入式系统中使用Linux操作系统进行开发的过程。

Linux作为一种开源操作系统,具有稳定性、可靠性和灵活性,因此在嵌入式系统中得到了广泛的应用。

嵌入式Linux开发教程通常包括以下内容:1. Linux系统概述:介绍Linux操作系统的发展历程和基本原理,包括内核、文件系统、设备驱动等方面的知识。

了解Linux系统的基本结构和工作原理对后续的开发工作至关重要。

2. 嵌入式开发环境搭建:通过搭建开发环境,包括交叉编译器、调试器、仿真器等工具的配置,使得开发者可以在本机上进行嵌入式系统的开发和调试。

同时,还需要了解各种常用的开发工具和调试技术,如Makefile的编写、GDB的使用等。

3. 嵌入式系统移植:嵌入式系统往往需要根据不同的硬件平台进行移植,以适应各种不同的硬件环境。

这个过程包括引导加载程序的配置、设备驱动的移植和内核参数的调整等。

移植成功后,就可以在目标硬件上运行Linux系统。

4. 应用程序开发:在嵌入式Linux系统上进行应用程序的开发。

这包括编写用户空间的应用程序,如传感器数据采集、数据处理、网络通信等功能。

还需要熟悉Linux系统提供的各种库函数和API,如pthread库、socket编程等。

5. 系统优化和性能调优:在开发过程中,经常需要对系统进行调优和优化,以提高系统的性能和稳定性。

这包括对内核的优化、内存管理的优化、性能分析和调试等。

只有深入了解和熟练掌握这些技术,才能使得嵌入式系统运行得更加高效和稳定。

嵌入式Linux开发教程PDF通常会结合理论和实践相结合的方式进行教学,通过实际的案例和实践操作,帮助开发者快速掌握嵌入式Linux开发的技术和方法。

同时还会介绍一些常见的开发板和硬件平台,以及开源项目等,帮助开发者在实际项目中应用所学的技术。

总之,嵌入式Linux开发教程PDF提供了系统而详细的指导,帮助开发者快速入门嵌入式Linux开发,掌握相关的技术和方法,以便更好地进行嵌入式系统的开发工作。

嵌入式linux串口应用程序编写流程

嵌入式linux串口应用程序编写流程

嵌入式linux串口应用程序编写流程嵌入式Linux系统提供了丰富的串口接口,可以通过串口与其他设备进行通信,这为开发嵌入式系统提供了很多可能性。

下面是编写嵌入式Linux串口应用程序的流程:1. 确定串口设备:首先要确定要使用的串口设备,可以使用命令`ls /dev/tty*`来查看系统中可用的串口设备列表。

根据需要选择合适的串口设备。

2. 打开串口设备:在Linux系统中,使用文件的方式来操作串口设备。

可以使用C语言中的open函数来打开串口设备文件,并返回串口设备的文件描述符。

例如:`int serial_fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);`。

其中,`O_RDWR`表示以读写模式打开串口设备,`O_NOCTTY`表示打开设备后不会成为该进程的控制终端,`O_NDELAY`表示非阻塞模式。

3. 配置串口参数:打开串口设备后,需要配置串口参数,包括波特率、数据位、停止位、校验位等。

可以使用C语言中的termios库来进行串口参数的配置。

例如:```cstruct termios serial_config;tcgetattr(serial_fd, &serial_config);cfsetispeed(&serial_config, B115200);cfsetospeed(&serial_config, B115200);serial_config.c_cflag |= CS8;serial_config.c_cflag &= ~PARENB;serial_config.c_cflag &= ~CSTOPB;tcsetattr(serial_fd, TCSANOW, &serial_config);```上述代码将波特率设置为115200,数据位设置为8位,无校验位,一个停止位。

嵌入式linux系统开发标准教程

嵌入式linux系统开发标准教程

嵌入式linux系统开发标准教程嵌入式Linux系统开发是一门非常重要的技术,它在嵌入式设备、物联网和智能家居等领域中得到广泛应用。

本文将介绍嵌入式Linux系统开发的标准教程,帮助读者了解该技术的基本原理和常用的开发工具。

一、嵌入式Linux系统开发的基本原理嵌入式Linux系统开发是指将Linux操作系统移植到嵌入式设备中,并针对特定的应用领域进行定制开发。

它与传统的桌面Linux系统有很大的区别,主要体现在以下几个方面:1. 硬件平台的选择:嵌入式设备通常采用ARM架构或者其他低功耗的处理器架构,而不是传统的x86架构。

因此,在进行嵌入式Linux系统开发时,需要根据具体的处理器架构进行相应的移植和优化。

2. 精简的内核:由于嵌入式设备的资源有限,为了提高系统性能和节省资源,嵌入式Linux系统通常会精简内核。

这需要对Linux内核的源代码进行裁剪和优化,以去除不必要的模块和功能,并保留对应用需求的必要功能。

3. 定制化的驱动程序和应用程序:嵌入式设备通常需要与各种外设进行交互,因此需要编写相应的驱动程序。

此外,根据具体的应用需求,还需要定制相关的应用程序和用户界面。

二、嵌入式Linux系统开发的工具嵌入式Linux系统开发需要使用一些常用的工具,下面是一些常用的工具和其功能的介绍:1. 交叉编译工具链:由于嵌入式设备和开发主机的处理器架构不同,无法直接在开发主机上编译和运行目标代码。

因此,需要使用交叉编译工具链,在开发主机上生成适用于目标设备的可执行文件。

2. 调试工具:在嵌入式Linux系统开发过程中,调试是非常重要的一环。

常用的调试工具包括GDB(GNU调试器)和strace(系统调用跟踪工具),它们可以帮助开发人员追踪程序的执行过程和定位错误。

3. 文件系统工具:嵌入式设备的存储资源有限,需要使用文件系统来组织和管理存储的数据。

常用的文件系统工具包括mkfs(创建文件系统)、mount(挂载文件系统)以及文件传输工具(如scp和rsync)等。

嵌入式linux驱动开发流程

嵌入式linux驱动开发流程
当应用程序使用open、release等函数打开某个设备时,设备驱动程序的file_operations结构中的相应成员就会被调用。
三、设备的中断和轮询处理
对于不支持中断的设备,读写时需要轮询设备状态,以及是否需要继续进行数据传输。例如,打印机。如果设备支持中断,则可按照中断方式进行。
struct file_operations Key7279_fops =
{
.open = Key7279_Open,
.ioctl = Key7279_Ioctl,
.release = Key7279_Close,
.read = Key7279_Read,
};
1、 设备的打开和释放
模块在使用中断前要先请求一个中断通道(或者 IRQ中断请求),并在使用后释放它。通过request_irq()函数来注册中断,free_irq()函数来释放。
四、驱动程序的测试
对驱动程序的调试可以通过打印的方式来进行,就是通过在驱动程序中添加printk()打印函数,来跟踪驱动程序的执行过程,以此来判断问题。
◇ 设备的打开和释放。
ห้องสมุดไป่ตู้◇ 设备的读写操作。
◇ 设备的控制操作。
◇ 设备的中断和轮询处理。
Linux主要将设备分为三类:字符设备、块设备和网络设备。字符设备是指发送和接收数据以字符的形式进行,没有缓冲区的设备;块设备是指发送和接收数据以整个数据缓冲区的形式进行的设备;网络设备是指网络设备访问的BSD socket 接口。下面以字符设备为例,写出其驱动编写框架:
二、 构造file_operations结构中要用到的各个成员函数
Linux操作系统将所有的设备都看成文件,以操作文件的方式访问设备。应用程序不能直接操作硬件,使用统一的接口函数调用硬件驱动程序,这组接口被成为系统调用。每个系统调用中都有一个与之对应的函数(open、release、read、write、ioctl等),在字符驱动程序中,这些函数集合在一个file_operations类型的数据结构中。以一个键盘驱动程序为例:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用RTLinux开发嵌入式应用程序对于中国工程师来说,利用实时Linux开发嵌入式应用程序是他们面临的困难之一,本文以RTLinux为例,并结合最为业界关注的是RTAI进行讨论,尽管这两种实现方式在句法细节上存在差异,但工作方式基本一样,因此所讲述的内容对两者都适用。

在实时任务与用户进程相互通信的过程中,有些实时应用程序无需任何用户界面即可在后台平静地运行,然而,越来越多的实时应用程序确实需要一个用户界面及其它系统功能,如文件操作或联网等,所有这些功能都必须在用户空间内运行。

问题是,用户空间操作是非确定性的,而且与实时操作不兼容。

幸运的是实时Linux具有一种可在时间上减弱实时与非实时操作的机制,这种机制表现为一种称为实时FIFO的驱动程序。

当insmod将rtl_fifo.o驱动程序插入Linux内核时,该驱动程序将自己注册为RTLinux的一部分,并成为Linux驱动程序。

一旦插入Linux内核,用户空间进程和实时任务都可使用实时Linux FIFO。

在深入探讨实时FIFO的细节之前,还要回顾一下实时应用程序结构的某些部分(图1)。

有效的嵌入式应用程序设计方法是将实时部分与固有的非实时功能分离开来(表1)。

如果应用程序的任一部分,如用户界面、图形、数据库或网络仅需软实时性能,最好是将该部分写入用户空间。

然后,仅将必须满足时序要求的那部分写成实时任务。

注意,RTLinux(PSC,便携式信号编码)和RTAI(LXRT,Linux实时扩展)的最新版本已采用了一种可在用户空间执行软和硬实时任务的方法。

任何硬实时任务都是在RTLinux的控制下运行的,该任务一般可执行周期性任务、处理中断并与I/O设备驱动程序通信,以采集或输出模拟和数字信息。

当实时任务需要告诉用户进程有一个事件将发生时,它便将这一消息送给实时FIFO。

每一个FIFO都是在一个方向上传送数据:从实时任务到用户空间,或反之。

因此,双向通信需要使用两个FIFO。

任何读出或写入实时任务一侧的操作都是非模块操作,因此rtf_put()和rtf_get()都立即返回,而不管FIFO状态是什么。

从应用程序一侧来看,FIFO就像一个常规文件。

缺省情况下,RTLinux安装程序将在/dev 目录下创建6?个实时FIFO节点;如果需要,还必须自己创建新的节点。

例如,要创建/dev/rtf80,需采用如下命令:=========================mknod c 150 80;chmod 0666 /dev/rtf80=========================其中,150是实时FIFO主数,而80是rtf80的次数。

从用户进程的角度看,实时FIFO可执行标准文件操作。

从实时任务来看,FIFO有两种通信方式:直接调用RTLinux FIFO功能,或将FIFO作为一个RTLinux设备驱动程序,并使用open()、close()、read()和write()操作。

要想将FIFO作为一个设备驱动程序,就必须将rtl_conf.h中的配置变量CONFIG_RTL_POSIX_IO设定为1。

rtf_create_handler()可设置处理程序功能。

每次Linux进程读或写FIFO时,rtl_fifo 驱动程序都要调用该处理程序。

应注意的是,该处理程序驻留在Linux内核,因此当Linux 需要调用时,从该处理程序进行任何内核调用都是安全的。

从该处理程序到实时任务间的最好通信方法是使用旗语或线程同步功能。

最后,FIFO驱动程序还必须对内核存储器进行配置。

因此,实时线程内的rtf_create()不应调用。

相反,可调用init_module()中的rtf_create ()功能及cleanup_module()中的rtf_destroy()功能。

例如,列表1给出了一个采用两个FIFO的简单数据采集应用程序的实时部分。

两个FIFO 都是在init_module()创建,并赋予minor numbers 为1和2。

在调用rtf_create(minor,size)之前,该程序在已创建该FIFO的情况下调用rtf_destroy(minor)。

这种情况就是另一个模块在开发过程中未被调用。

然后,调用rtf_create_handler(ID, &pd_do_aout)以注册带该实时FIFO的数据采集模拟输出功能pd_do_aout()。

注意,创建实时线程pp_thread_ep()是因为它是周期性的,其间隔为1/100秒。

每次周期性线程得到系统控制权后,它就调用rtf_put(ID,dataptr,size)以便将数据插入minor number为2的FIFO。

Linux进程打开/dev/rtf2,从实时FIFO中读取并显示所采集的数据。

该进程还打开/dev/rtf1,将数据写入其它实时FIFO。

当用户移动屏幕滑动器以改变模拟输出电压时,进程就向该FIFO写入一个新的值。

RTLinux便调用pd_do_aout()处理程序,随后pd_do_aout()利用rtf_get()从FIFO获得值,并调用实际的硬件驱动程序以设置模拟输出的电压。

可以看到,实时任务和用户进程是异步使用FIFO的。

任务间的存储器共享FIFO为用户进程和实时任务的连接提供了一种方便的机制,但将它们作为消息队列更合适。

比如,一个实时线程可利用FIFO记录测试结果,然后用户进程就可读取该结果,并将之存入数据库文件。

许多数据采集应用程序涉及到内核及用户空间之间的大量数据。

Linux内核v. 2.2.x并没有为这些空间的数据共享提供任何机制,但v. 2.4.0版本预计会包括kiobuf结构。

为解决现有稳定内核的这个缺点,RTLinux包括mbuff驱动程序。

该驱动程序可利用vmalloc()分配虚拟内核存储器的已命名存储器区域,它采用的存储器分配和页面锁定技巧跟大多数Linux中bttv帧抓取器(frame-grabber)驱动程序所用的一样。

更具体地说,mbuff一页一页地将虚拟内存锁定到实际的物理内存页面。

任何实时或内核任务,或用户进程在任何时间都可访问该存储器。

通过将虚拟内存页面锁定到物理内存页面,mbuff可确保所分配的页面永久驻留在物理内存,而且不会发生页面错误。

换言之,当实时或内核进程访问所分配的存储器时,它可确保VMM不被调用。

注意:由于实时任务执行期间实时Linux冻结标准内核的执行,任何对VMM的调用都会引起系统暂停。

如果它要访问并不位于物理RAM内的虚拟存储页面,那么即使正常的Linux内核驱动程序也会引起系统故障。

由于mbuff是一种Linux驱动程序,其功能可通过设备节点/dev/mbuff实现。

该节点可显示几个录入点,其中包括可将内核空间地址映射到用户空间的mmap()。

它还可以利用录入点ioctl()来控制。

然而,并不需要复杂的结构及直接调用ioctl。

相反,mbuff可为ioctl ()调用提供一个包裹,而且仅仅调用两个简单的功能即可配置和释放共享的存储缓冲器。

当然,不能从实时任务调用mbuff驱动程序,因为该驱动程序所调用的虚拟存储器分配功能本身是不确定性操作。

分配共享存储器所需的时间依赖于主系统的存储器容量以及CPU 速度、磁盘驱动器性能和存储器分配的现有状态。

因此,只能从模块的Linux内核一侧来分配共享存储器,比如从init_module()或一个ioctl()请求开始。

那么,一个共享缓冲器到底能分配多少存储器呢?如果不是任务繁重的服务器或图形应用,建议至少为Linux保留8MB存储空间。

为了获得优化的配置,可在限制存储器大小的同时测量实时应用程序的性能,以确定需要多少存储空间。

列表2给出了如何从实时任务和用户进程方面访问共享的存储器。

内核模块和用户任务采用同样的功能集。

当然,要想使用insmod mbuff.o,还必须将之置于Linux内核中。

例如,mbuff_alloc(“buf_name”, size)可将符号名buf_name分配给一个缓冲器,而mbuff_free(“buf_name”, mbuf)可将之释放。

当第一次调用带有符号缓冲器名的mbuff_alloc()时,mbuff执行实际的存储器分配。

而当从内核模块或用户进程再次调用该功能时,它只是简单地增加使用数(usage count)及将指针返回现有的缓冲器。

每次调用mbuff_free()都会减少使用数,直至为零,这时mbuff 就去分配带符号名的缓冲器。

这种方法从多个内核模块和用户进程获得一个指向同一共享缓冲器的指针,从而解决了问题。

它还可确保共享缓冲器一直有效,直到最后的应用程序释放它。

请注意,是实时内核还是用户进程执行实际的buf1配置依赖于谁先获得控制权。

还有一个“笨”方法可在实时应用程序、内核模块和用户应用程序间共享存储器。

对于嵌入式应用,该方法还是可以接受的。

例如,如果PC带有128MB RAM,可将线搜索路径=“mem=120m”添加进lilo.conf文件(列表3)。

当启动带有Linux内核和RTLinux 2.3的系统时,Linux仅使用120MB内存。

OS也不用剩下的8MB内存(物理地址为0x7F00000到0x7FFFFFF),而是留给在OS下运行的各种任务共享。

要想从用户进程获取存储器地址并访问预留的存储器,必须用O_RDWR访问模式来打开/dev/mem驱动程序,然后利用mmap()保留存储器(列表4)。

而从实时模块或内核驱动程序一侧进行,则必须使用ioremap(0x7F00000, 0x100000)才能获取这8MB (0x100000字节)预留内存。

这种方法有利有弊。

既不能通过预留内存的所有权,也不能通过读或写来获取控制权。

正确地配置和释放大量内存的机制尚未问世。

另外,无论实时进程是否需要,该内存都不能为Linux所用。

也许存储器共享笨方法的唯一适用场合是专为特定应用而定制的小型嵌入式系统,因为此时可为小型化而放弃使用mbuff驱动程序。

对于中国工程师来说,利用实时Linux开发嵌入式应用程序是他们面临的困难之一,本文以RTLinux为例,并结合最为业界关注的是RTAI进行讨论,尽管这两种实现方式在句法细节上存在差异,但工作方式基本一样,因此所讲述的内容对两者都适用。

在实时任务与用户进程相互通信的过程中,有些实时应用程序无需任何用户界面即可在后台平静地运行,然而,越来越多的实时应用程序确实需要一个用户界面及其它系统功能,如文件操作或联网等,所有这些功能都必须在用户空间内运行。

相关文档
最新文档