基于OpenHarmony标准接口的文件读写实现案例简介在嵌入式领域,FLASH是一种常用的存储设备,而Flash闪存作为嵌入式系统的主要存储设备有其自身的特点。Fash的写操作只能将对应位置的1修改为0,而不能将0修改为1,而擦除Fash就是将对应存储块的内容恢复为1。因此,一般情况下,在向Fash写入内容时,需要先擦除相应的存储区域,这种擦除是以块(Bock)为单位进行的。闪存主要有NOR和NAND两种技术。由于Flash存储器的擦写次数有限,而NAND闪存也有特殊的硬件接口和读写时序,因此出现了专门针对FLASH的文件系统。比较常用的有jffs2、yaffs2、logfs、ubifs。本文基于小灵派-RK2206开发板+OpenHarmony轻量级操作系统+LitteFS文件系统,通过hal_file标准接口实现读写Flash的功能。2.hal_file标准接口头文件://utils/native/lite/hals/file/hal_file.h。1、HalFileOpen()打开/创建文件,类似于Linux的open函数。intHalFileOpen(constchar*path,intoflag,intmode);参数说明:如果返回值为LOS_OK表示成功,其余表示失败。2、HalFileClose()关闭文件,类似于linux的close函数。intHalFileClose(intfd);参数说明:返回值为LOS_OK,表示成功,其余为失败。3、HalFileRead()从文件中读取一段内容,类似于Linux的read函数。intHalFileRead(intfd,char*buf,unsignedintlen);参数说明:返回值为从文件中读取内容的大小,为0或小于0则表示失败。4、HalFileWrite()向文件写入一段内容,类似于Linux的write函数。intHalFileWrite(intfd,constchar*buf,unsignedintlen);参数说明:返回值为成功写入文件内容的大小,0或小于0表示失败。5、HalFileDelete()删除文件,类似于Linux的unlink函数。intHalFileDelete(constchar*路径);参数说明:如果返回值为LOS_OK表示成功,其余表示失败。6、HalFileStat()获取文件大小,类似于Linux的stat函数。intHalFileStat(constchar*path,unsignedint*fileSize);参数说明:如果返回值为LOS_OK表示成功,其余表示失败。7、HalFileSeek()移动文件的位置,类似于Linux的lseek函数。intHalFileSeek(intfd,intoffset,unsignedintwhence);参数说明:如果返回值为LOS_OK表示成功,其余表示失败。3.程序设计本例程演示了如何在小灵派-RK2206开发板上使用鸿蒙LiteOS-M内核接口进行文件读写开发。例程流程如下:(1)创建文件。(2)每5秒执行一次文件读写操作。(3)文件标记移至文件开头,读取文件内容,打印。(4)文件标记移至文件开头,写入文件内容。(5)重复上述步骤2至4。1、任务创建代码分析通过file_example函数中的LOS_TaskCreate函数创建线程:hal_file_thread。voidfile_example(){unsignedintthread_id;TSK_INIT_PARAM_S任务={0};无符号整数ret=LOS_OK;task.pfnTaskEntry=(TSK_ENTRY_FUNC)hal_file_thread;任务.uwStackSize=1024*10;task.pcName="hal_file_thread"=25;ret=LOS_TaskCreate(&thread_id,&task);if(ret!=LOS_OK){printf("无法创建hal_file_threadret:0x%x\n",ret);返回;}}APP_FEATURE_INIT(file_example);2。文件读写代码分析hal_file_thread函数负责打开文件,每隔5秒移动到文件头读取数据,然后移动到文件头写入一段内容,重复上述过程。voidhal_file_thread(){intfd;字符缓冲区[1024];int读长度,写长度;int当前=0;/*打开文件,如果没有这个文件,就创建它,如果有这个文件,就打开它*O_TRUNC_FS=>清空文件内容*//fd=HalFileOpen(FILE_NAME,O_RDWR_FS|O_CREAT_FS,0);fd=HalFileOpen(FILE_NAME,O_RDWR_FS|O_CREAT_FS|O_TRUNC_FS,0);if(fd==-1){printf("%sHalFileOpen失败!\n",FILE_NAME);返回;}while(1){/*将文件位置移动到文件开头*/HalFileSeek(fd,0,SEEK_SET);内存集(缓冲区,0,sizeof(缓冲区));/*读取文件内容*/read_length=HalFileRead(fd,buffer,sizeof(buffer));printf("读取:\n");printf("长度=%d\n",read_length);printf("内容=%s\n",缓冲区);/*将文件位置移动到文件开头*/HalFileSeek(fd,0,SEEK_SET);内存集(缓冲区,0,sizeof(缓冲区));snprintf(buffer,sizeof(buffer),"HelloWorld(%d)=>",current);/*写入文件*/write_length=HalFileWrite(fd,buffer,strlen(buffer));当前++;LOS_Msleep(5000);}HalFileClose(fd);}4.编译过程1.构建并下载源码Electronics/lockzhiner-rk2206-openharmony3.0lts.注:编译环境可按以下网址操作:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/vendor/lockzhiner/rk2206/README_zh.md。2.修改编译脚本修改vendor/lockzhiner/rk2206/sample路径下的BUILD.gn文件,指定a7_hal_file参与编译。“./a7_hal_file:hal_file_example”,修改device/lockzhiner/rk2206/sdk_liteos路径下的Makefile文件,添加-lhal_file_example参与编译。apps_LIBS=-lhal_file_example3,编译固件hbset-root.hbsethbbuild-f4,烧录固件,请参考Gitee官网上的使用说明书(“烧录和打印”章节):https://gitee.com/Lockzhiner-electronics/lockzhiner-rk2206-openharmony3.0lts/blob/master/device/rockchip/README_zh.md.五、实验结果程序编译写入开发板后,按下开发板上的RESET键,通过串口软件查看日志如下:HalFileInit:FlashInitSuccessful!read:length=0content=read:length=18content=HelloWorld(0)=>read:length=18content=HelloWorld(1)=>好了,今天的课程到此结束,我们下期见!了解更多开源知识,请访问:开源基础软件社区https://ost.51cto.com。
