Buffered I/O and non-buffered I/O

Buffered I/O and non-buffered I/O

转自:http://ender.hitidea.org/tag/o_direct/

参考文献部分的内容是非常好的。这个选项在测试时是非常有用的。

实验需要对Flash Disk做无系统缓冲的I/O操作,顺便了解了一下Linux下的I/O.

Linux上的块设备的操作可以分为两类:

  • 第一类是使用C标准库中的fopen/fread/fwrite 系列的函数,我们可以称其为 buffered I/O。

具体的I/O path如下

Application<->Library Buffer<->Operation System Cache<->File System/Volume Manager<->Device

 

library buffer是标准库提供的用户空间的buffer,可以通过setvbuf改变其大小。

  • 第二类是使用Linux的系统调用的open/read/write 系列的函数,我们可以称其为 non-buffered I/O。

I/O Path

Application<-> Operation System Cache <->File System/Volume Manager<->Device

 

此外,我们可以通过设置open的O_DIRECT标志来实现Direct I/O(或者叫Raw I/O),即绕过OS Cache,直接读取Device ( that’s what we want^o^ ), 等于将OS cache换成自己管理的cache。不过,Linus在邮件列表中建议不这么做,而是使用posix_fadvice, madvice。[2]中表明Direct I/O比buffered I/O的性能高很多。

在使用O_DIRECT的注意buffer的address必须是block alignment的(i.e. 初始地址必须是boundary), 可以用posix_memalign()函数分配内存以得到这样的buffer。至于为什么要这样,与实现的mmap有关,参见[5].

参考:

  1. Linux: Accessing Files With O_DIRECThttp://kerneltrap.org/node/7563
  2. Andrea Arcangeli , O_DIRECT Whitepaperhttp://www.ukuug.org/events/linux2001/papers/html/AArcangeli-o_direct.html
  3. A Trip Down the Data Path: I/O and Performancehttp://articles.directorym.net/_A_Trip_Down_the_Data_Path_IO_and_Performance-a894569.html
  4. Operating Systems System Calls and I/Ohttp://articles.directorym.net/Operating_Systems_System_Calls_and_IO-a894576.html
  5. Linux Device Drivers, 2nd Edition, Chapter 13 mmap and DMAhttp://www.xml.com/ldd/chapter/book/ch13.html
  6. http://topic.youkuaiyun.com/u/20080806/10/cdb1faa1-0146-4e96-8b12-26ba60acdbb5.html
  7. http://lists.alioth.debian.org/pipermail/parted-devel/2007-July/thread.html#1855
  8. Read系统调用剖析,http://www.ibm.com/developerworks/cn/linux/l-cn-read/
在编写程序中出现的问题:
Problem: 使用O_DIRECT标志打开文件,但是编译器报告O_DIRECT不认识。
Solution: 在#include<fcntl.h>前要添加#define __USE_GNU 1,否则O_DIRECT没有定义。还有就是文件读写的缓冲区要用posix_memalign对齐(2.6中是512字节),文件读写的大小也要是512对齐的。

<think>好的,我现在需要帮助用户解决关于AUTOSAR CDD中RTE_IWRITE非缓冲行为的疑问。首先,我得确认用户的问题核心是什么。用户提到的是CDD中的RTE_IWRITE非缓冲行为,需要解释或解决方案。根据之前的引用内容,特别是引用[5]提到RTE作为通信中介,管理SWC之间的信息传递,而CDD属于特殊组件,可能涉及直接硬件访问。 接下来,我需要回忆AUTOSAR中RTE_IWRITE的相关知识。RTE_IWRITE通常用于非缓冲的立即写入操作,适用于实时性要求高的场景。在CDD中,这可能涉及到直接与硬件或底层驱动交互,绕过了RTE的缓冲机制。引用[2]中的Rte_DRead函数宏替换可能类似,但写入操作需要更直接的处理。 用户可能需要了解为什么非缓冲行为会导致问题,比如数据覆盖或丢失。解决方案可能涉及配置参数,如设置IsQueued属性为FALSE,确保立即传输。此外,可能需要检查CDD实现是否正确处理了立即写入,或者是否需要使用显式同步机制,如Rte_Invalidate或Rte_Update。 还要考虑用户可能的上下文,比如他们是否在集成CDD时遇到数据延迟或一致性问题。需要参考AUTOSAR文档中的CDD部分,确认RTE生成配置是否正确,特别是数据传输属性的设置。可能还需要建议用户查阅官方规范或使用工具链中的配置检查,如Vector的RTE生成工具。 最后,确保回答结构清晰,分点解释行为、原因和解决方案,并生成相关问题帮助用户深入理解。同时,引用提供的参考资料,特别是关于RTE管理运行体和通信的部分,以增强回答的可信度。</think>### 关于AUTOSAR CDD中RTE_IWRITE非缓冲行为的解释与解决方案 #### 1. **非缓冲行为(Non-Buffered Behavior)的定义** 在AUTOSAR架构中,RTE(Runtime Environment)通过`Rte_IWrite`接口实现数据通信。当使用**非缓冲模式**时,数据的写入操作会直接传递到接收端,而不会在RTE层进行缓存。这种模式适用于需要**实时性**的场景,例如传感器数据或控制信号传输[^5]。 对于CDD(Complex Device Driver),由于其特殊性(允许直接访问硬件或绕过标准通信机制),非缓冲行为通常与底层驱动或硬件寄存器操作相关。此时,`Rte_IWrite`可能直接映射到硬件接口,而非通过RTE队列[^1][^4]。 --- #### 2. **非缓冲行为的具体表现** - **立即生效**:写入操作会直接触发接收端的数据更新,无中间缓存。 - **无数据排队**:若接收端未准备好处理数据,可能导致数据丢失或覆盖。 - **与RTE事件同步**:数据写入可能直接触发关联的RTE事件(如`DataReceivedEvent`)[^5]。 --- #### 3. **典型问题与解决方案** ##### **问题1:数据丢失或覆盖** - **原因**:非缓冲模式下,若发送频率高于接收端处理能力,新数据会覆盖旧数据。 - **解决方案**: - 改用**缓冲模式**(配置`IsQueued`属性为`TRUE`),通过RTE队列管理数据[^5]。 - 在CDD中实现自定义缓存逻辑(需谨慎,可能违反AUTOSAR规范)。 ##### **问题2:时序不一致** - **原因**:非缓冲写入可能因任务调度延迟导致接收端未及时响应。 - **解决方案**: - 使用`Rte_Invalidate`和`Rte_Update`接口显式控制数据同步时序[^3]。 - 确保接收端Runnable的触发周期与发送端匹配。 ##### **问题3:CDD与RTE集成异常** - **原因**:CDD可能直接操作硬件寄存器,与RTE标准接口存在冲突。 - **解决方案**: - 检查CDD的RTE接口配置(如`Rte_IWrite`是否绑定到正确的硬件抽象层)。 - 确认RTE生成时`DataAccessMode`设置为`IMMEDIATE`(非缓冲模式)[^2][^5]。 --- #### 4. **配置示例与验证** 在SWC描述文件(ARXML)中,需明确指定数据接口属性: ```xml <DATA-SEND-POINT-TO-IOR-PORT> <QUEUED-PROPERTY>false</QUEUED-PROPERTY> <!-- 非缓冲模式 --> </DATA-SEND-POINT-TO-IOR-PORT> ``` 通过RTE生成工具(如Vector DaVinci)验证接口实现是否符合预期[^5]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值