嵌入式文件读写操作注意事项

1 嵌入式文件操作特性

1.1 FLASH有擦写次数限制

FLASH会有擦写次数限制,如10万次。

1.2 擦写过程中掉电或系统异常会损坏文件

在对文件写入或擦除过程中,若系统突然掉电或者系统出现异常挂掉,可能造成文件损坏。

1.3 多进程或线程同时读写冲突

若多进程或现成线程对同一个文件进行读写操作,可能会出现冲突,导致文件内容错乱,或读取到错误的文件内容。

1.4 敏感文件内容保护

若文件内容涉及到敏感信息,需要对文件内容进行保护,以防止第三方获取到敏感信息。

2. 嵌入式文件读写操作注意事项

针对嵌入式文件操作特性,需要在进行读写操作时注意以下几点。

2.1 FLASH擦写寿命保护

2.1.1 非必要不擦写

由于FLASH有擦写次数限制,所以非必要不要进行擦写操作。如在写入配置文件前,可以先读出配置文件里面的内容,如果与新的配置内容一样,不需要进行写入操作。

2.1.2 减少擦写次数与频率

尽量减少擦写次数与频率。如一个文件需要频繁更新,需要优化擦写的条件。如可以先设置一个缓存,把需要频繁更新的内容先更新到缓存,达到特定的条件,如休眠前或关闭文件前等才进行文件的写入,从而减少擦写次数。

2.2 系统掉电或异常保护

系统突然掉电或异常会损坏正在擦写的文件,需要进行保护。除了一般的文件系统层级的保护,我们在应用层也需有保护操作。系统突然掉电或者异常引起正在擦写文件损坏的原因主要是一般的文件系统为了延长FLASH寿命,会将要写入FLASH中的内容先放到缓冲区中,等到满足系统设置的条件再统一更新到FLASH中。所以我们对文件进行擦写操作后,需要主动将缓存中的内容更新到FLASH中,以减少内容存放在缓存中的时间,从而最大限度地减少在系统掉电或异常时文件被损坏的概率。将缓存数据更新到FLASH中可用以下几种方式:

  1. 原型:int fflush(FILE *stream)

功能: 清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件

注意:此函数仅适用于部分编译器(如VC6),但是并非所有编译器都要支持这个功能(如gcc3.2)。这是一个对C标准的扩充。

  1. int sync(void);

函数说明:此函数负责将系统缓冲区的内容写回磁盘,以确保数据同步

另:fsync, fdatasync。

sync() causes all pending modifications to filesystem metadata

and cached file data to be written to the underlying filesystems.

syncfs() is like sync(), but synchronizes just the filesystem

containing file referred to by the open file descriptor fd.

  1. sync

描述

sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。

注意,以上同步方式不能频繁操作,需要谨慎处理触发的条件。

2.3 多进程或线程读写保护

多进程或线程同时读写一个文件时,有可能造成文件内容错乱或者读取到错误内容,读写操作前需要对文件进行保护处理。

  1. 文件锁

可参考 “Linux 文件锁的原理、实现和应用

  1. 信号量

进程间读写文件可用信号量充当互斥锁使用,以保证在同一时刻只用一个进程或线程在对文件进行读写操作。

2.4 敏感文件内容保护

对于敏感的文件内容需添加保护措施,可以使用加密算法(如AES256等)对文件进行加密。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值