今天小编要和大家分享的是嵌入式技术相关信息,接下来我将从通过mmap方式应用程序在Linux下访问物理地址提高实时性,suse linux enterprise server 11应用程序浏览器这几个方面来介绍。
嵌入式技术相关技术文章通过mmap方式应用程序在Linux下访问物理地址提高实时性
前言
按照Linux分层驱动思想,外设驱动与主机控制器的驱动不相关,主机控制器的驱动不关心外设,而外设驱动也不关心主机,外设访问核心层的通用应用程序接口进行数据传输,主机和外设之间可以进行任意的组合。这样思想要求应用程序不应当直接访问物理地址,而是应当通过驱动程序的调用来实现,以便保持应用程序的可移植性,操作访问的统一性,应用程序利用系统的统一调用接口访问外设,如使用write(),read()等函数进行实际的外设读写控制。应用程序通过调用接口进入内核函数后,内核利用copy_from_user()获得应用层数据,内核驱动程序也通过分层最终执行物理访问,之后把获得的数据用copy_to_user()回传给应用程序的调用者。由于驱动对外需要有个统一接口,所以定义了一些结构体,链表等机制,以便让应用程序操作简单化,数据在内核一应用之间的复制,填充结构体等都需要时间开销,有时按这种标准调用方式,因为操作时间过长,无法完成设计目的。
操作效率评估
我们的一个项目中,系统由FPGA和ARM11结合为核心控制器,其中FPGA连接外部高速ADC、DAC和RF器件在ARM11的控制下,实现GB18000-6C标准的UHF RFID读写控制状态机。FPGA与ARM11的接口采用SPI,其中ARM11选用三星S3C6410,作为SPI的主机,FPGA作为SPI的从机,受S3C6410的控制。在本系统中,SPI接口充当ARM11和FPGA交互的桥梁,ARM11的命令和动作参数传给FPGA并启动FPGA处理状态机,FPGA动作的结果也通过SPI回传给ARM11,两者之间的通讯效率在系统中需要重点关注。
评估通讯接口时,利用三星提供的SPI驱动函数,系统运行在533MHz,SPI时钟配置为16MHz,程序在linux3.0环境下通过read/write进行操作,为了评估效率,另外采用一个GPIO输出脉冲指示操作过程,试验结果显示效率非常低下,从应用层执行write代码开始到SPI端口输出时钟,延时长达72μs,SPI操作之后,再回到应用层的下一个语句也延时42μs,对于比较少的数据传输情况,附加的额外等待时间远远长于实际传输有效时间,从前面数据看出,通过标准库调用严重影响系统性能,没法满足系统需求。通过查看驱动程序的源代码,可以发现因为驱动程序层层封装,并且包含应用层到内核的copy_from_user()和内核到应用层的copy_to_user()两次数据搬移,导致执行效率很低。为了提高数据交互效率,就要设法绕开数据搬移等时间开销,最好能直接操作寄存器,虽然这种想法与Linux分层驱动思想不相符合,但是在嵌入式系统中,有时需要高的执行效率,如果利用系统一些特定函数,实现高效率的数据交互从而完成设计目标是有必要和可能的。