TRTOS +TQFS多个任务同时读写文件的互斥操作

#include <Include.h>

#include <TQFS_File.h>

#include <stdlib.h>

/*******************************************************************************

Func:删除文件标准文件路径 .eg /example/新建文件.txt

Date:2014-7-27

Note:FileSize=0时为不确定文件长度

*******************************************************************************/

uint8 TQFS_FileDelete(uint8 *Path)

{

TQFS_Open_File Open_File;

StringCoppy(Path,&Open_File.Path[0]);

return 0;

}

/*******************************************************************************

Func:填充文件容器基本信息

Date:2014-7-27

Note:FileSize=0时为不确定文件长度

*******************************************************************************/

void TQFS_FileRoomInfor(File_Infor *FI,void *File,uint32 FileSize,uint8 FileVirtue)

{

uint8 Buf[14];

BufferFill(FI,0xff,sizeof(File_Infor));//配置不设置项为不修改状态

GetFileName(File,&Buf[0]);

StringCoppy(&Buf[0],&FI->FileName[0]);

GetFileFormat(File,&Buf[0]);

StringCoppy(&Buf[0],&FI->FileFormat[0]);

FI->FileType=FT_ReadyRoom;//待分配的文件类型

BufferCoppy(&NowTime,&FI->CreateDate,sizeof(Date_Time));

FI->Page_Status=PS_BeUse;//页即将被使用

if(FileSize)FI->FileSize=FileSize;

FI->FileID=rand();//文件ID其实就是随机数,但必须保证同一个文件的ID号相同

FI->FileVirtue=FileVirtue;//可读可写隐藏等属性

}

/*******************************************************************************

Func:在某某页创建文件空间

Date:2014-7-27

Note:Page为相对位置即认为文件存储区首页为第一页

*******************************************************************************/

uint32 TQFS_CreateFileRoom(TQFS_Open_File *Open_File,uint32 Page,File_Infor *FI)

{

FI->FileID=Page;

FI->FileIndex=0;

DeBug("Create Object File In Page[%d]",Page,Infor_Infor);

Write_FileInfor(Page,FI);

TQFS_SetCursor(Open_File,Page,0);

return 0;

}

/*******************************************************************************

Func:设置读写操作游标

Date:2014-7-27

Note:Page为相对位置即认为文件存储区首页为第一页

*******************************************************************************/

void TQFS_SetCursor(TQFS_Open_File *Open_File,uint32 Page,uint16 Offset)

{

Open_File->PageCursor=Page;

Open_File->OffsetCursor=Offset;

}

/*******************************************************************************

Func:读取页面内容

Date:2014-7-27

Note:返回状态

*******************************************************************************/

TQFS_Error TQFS_ReadPageContext(TQFS_Open_File *Open_File,uint8 *rBuffer,uint16 Length)

{

File_Infor TempFile;

int OviLenth;

uint16 Offset=0;

OviLenth=(Open_File->OffsetCursor+Length);

OviLenth-=NAND_PAGE_SIZE;//写不下的长度

if(OviLenth>=0)//当前页不够

{

Nand_ReadPage(Nand_Infor.FileStartPage+Open_File->PageCursor,&rBuffer[Offset],Open_File->OffsetCursor+NAND_SPARE_SIZE,Length-OviLenth);

Offset=Length-OviLenth;

Open_File->OffsetCursor=0;

Read_FileInfor(Open_File->PageCursor,&TempFile);

if(TempFile.NextPageAddr==0xffffffff)return TE_NoNextPage;

else{

Open_File->PageCursor=TempFile.NextPageAddr;

Length=OviLenth;

}

}

Nand_ReadPage(Nand_Infor.FileStartPage+Open_File->PageCursor,&rBuffer[Offset],Open_File->OffsetCursor+NAND_SPARE_SIZE,Length);

Open_File->OffsetCursor+=Length;

if(OviLenth>=0)return TE_NewPage;

else return TE_CurrentPage;

}

/*******************************************************************************

Func:写内容到指定页

Date:2014-7-27

Note:返回该页写完的剩余量

*******************************************************************************/

TQFS_Error TQFS_WritePageContext(TQFS_Open_File *Open_File,uint8 *Buffer,uint16 Length)

{

File_Infor TempFile;

int OviLenth;

uint16 Offset=0;

OviLenth=(Open_File->OffsetCursor+Length);

OviLenth-=NAND_PAGE_SIZE;//写不下的长度

if(OviLenth>=0)//当前页不够

{

Nand_WritePage(Nand_Infor.FileStartPage+Open_File->PageCursor,&Buffer[Offset],Open_File->OffsetCursor+NAND_SPARE_SIZE,Length-OviLenth);

Offset=Length-OviLenth;

Open_File->OffsetCursor=0;

Read_FileInfor(Open_File->PageCursor,&TempFile);

TempFile.NextPageAddr=TQFS_FindKeyPageMark(PS_CanUse,PS_BeUse);

TempFile.Page_Status=PS_UsedFully;//标记页被使用完

Write_FileInfor(Open_File->PageCursor,&TempFile);//在当前页写入下页地址

Open_File->PageCursor=TempFile.NextPageAddr;

TempFile.Page_Status=PS_NotFully;

TempFile.PreviousPageAddr=Open_File->PageCursor;

TempFile.NextPageAddr=0xffffffff;

Write_FileInfor(Open_File->PageCursor,&TempFile);//在当前页写入下页地址

Length=OviLenth;

}

Nand_WritePage(Nand_Infor.FileStartPage+Open_File->PageCursor,&Buffer[Offset],Open_File->OffsetCursor+NAND_SPARE_SIZE,Length);

Open_File->OffsetCursor+=Length;

if(OviLenth>=0)return TE_NewPage;

else return TE_CurrentPage;

}

void TQFS_RootDirCreate(TQFS_Open_File *Open_File)

{

uint32 i;

File_Infor TempFile;

i=TQFS_FindKeyPageMark(PS_CanUse,PS_BeUse);

TempFile.FileType=FT_RootDirHead;

TQFS_FileRoomInfor(&TempFile,"RootDir",0,ReadOnly);

TQFS_CreateFileRoom(Open_File,i,&TempFile);

}

uint8 TQFS_FileCreate(uint8 *Path,uint8 State)

{

return 0;

}

TQFS_Error TQFS_FindFileByName(uint8 *File,uint16 Length)

{

File_Infor Temp_File;

uint32 StartPage=0;

while(Length--)

{

Read_FileInfor(StartPage,&Temp_File);

StartPage++;

}

return TE_NotFind;

}

#include <Include.h>

#include <Tos_device.h>

DeviceInfor _Tos_Device_Tab[_Tos_DeviceTotal];

/*---------------------------------------------------------------------------------------------------------

Func: 设备信息列表初始化

Time: 2014-5-22

Ver.: V1.0

Note;

---------------------------------------------------------------------------------------------------------*/

void DeviceList_Init()

{

uint8 i;

for(i=0;i<_Tos_DeviceTotal;i++)

{

_Tos_Device_Tab[i].DeviceId=Null;

_Tos_Device_Tab[i].Init=Null;

_Tos_Device_Tab[i].DeviceState=Ready;

_Tos_Device_Tab[i].Read=Null;

_Tos_Device_Tab[i].Write=Null;

_Tos_Device_Tab[i].Exit=Null;

}

}

BOOL Tos_TaskGetDev(uint8 ID,uint32 Timeout)

{

GoGet:

switch(_Tos_Device_Tab[ID].DeviceState)

{

case Delete:

return FALSE;

case Busy:

if(_Tos_Device_Tab[ID].DeviceOwnerId==Tos_TaskCurrent)return TRUE;

else {Tos_WaitDev(ID);goto GoGet;}

case NotBusy:

_Tos_Device_Tab[ID].DeviceState=Busy;

_Tos_Device_Tab[ID].DeviceOwnerId=Tos_TaskCurrent;

return TRUE;

case Ready:

_Tos_Device_Tab[ID].DeviceState=Busy;

_Tos_Device_Tab[ID].DeviceOwnerId=Tos_TaskCurrent;

return TRUE;

default :return FALSE;

}

}

BOOL Tos_TaskDropDev(uint8 ID)

{

if(_Tos_Device_Tab[ID].DeviceState==Delete)return FALSE;

if(_Tos_Device_Tab[ID].DeviceOwnerId!=Tos_TaskCurrent)return FALSE;

_Tos_Device_Tab[ID].DeviceState=NotBusy;

return TRUE;

}

/*---------------------------------------------------------------------------------------------------------

Func: 各设备初始化及设备注册

Time: 2014-5-22

Ver.: V1.0

Note;设备在注册登记后需要对设备列表里的设备进行初始化

---------------------------------------------------------------------------------------------------------*/

void Device_Init()

{

uint8 i;

for(i=0;i<_Tos_DeviceTotal;i++)

{

if(_Tos_Device_Tab[i].DeviceId!=Null)

{

if(_Tos_Device_Tab[i].Init)_Tos_Device_Tab[i].Init();

}

}

}

void DeviceList_Printf()

{

uint8 i;

for(i=0;i<_Tos_DeviceTotal;i++)

{

if(_Tos_Device_Tab[i].DeviceId!=Null)

{

DeBug("%s%d%s%s","Device[",i,"]Name:",_Tos_Device_Tab[i].DeviceName,Infor_Infor);

}

}

}

BOOL DeviceUnMount(uint8 ID)

{

if(_Tos_Device_Tab[ID].Exit){_Tos_Device_Tab[ID].Exit();return TRUE;}

return FALSE;

}

使用例子

TRTOS +TQFS多个任务同时读写文件的互斥操作

时间: 2024-10-25 20:16:17

TRTOS +TQFS多个任务同时读写文件的互斥操作的相关文章

Python读写文件

Python读写文件1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.txt')try:     all_the_text = file_object.read( )finally:     file_object.close( ) 注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file_object无法执行close()方法.

Verilog读写文件

在通过编写Verilog代码实现ram功能时,需要自己先计算寄存器的位数和深度再编写代码. 而如果需要在编写的ram中预置值的话,就需要使用Verilog语言编写程序读写文件,来将相应的数据赋给寄存器. 这里给出Verilog实现ram的代码: module dpram( rclk, raddr, dout, wclk, we, waddr, din ); parameter aw = 16; //address widtth parameter dw = 12; //data address

java读写文件

读文件 package tool; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; public class ReadFile { pu

第五篇:使用无缓冲IO函数读写文件

前言 本文介绍使用无缓冲IO函数进行文件读写. 所谓的无缓冲是指该IO函数通过调用系统调用实现,其实系统调用内部的读写实现也是使用了缓冲技术的. 读写步骤 1. 打开文件 open 函数 2. 读写文件 read write 函数 3. 修改文件指针 lseek 函数 ( 可能和 2 交替进行 ) 4. 关闭文件 close 函数 代码示例 1 // 2 // 本程序往一个文件中写入一个整型数组 3 // 然后读取这个数组并输出 4 // 5 6 #include <unistd.h> 7 #

使用FileStream对象读写文件

在项目开发中经常会涉及到对文件的读写,c# 提供了很多种方式来对文件进行读写操作,今天来说说FileStream 对象. FileStream表示在磁盘或网络路径上指向文件的流.一般操作文件都习惯使用StreamReader 和 StreamWriter,因为它们操作的是字符数据 .而FileStream 对象操作的是字节和字节数组.有些操作是必须使用FileStream 对象执行的,如随机访问文件中间某点的数据. 创建FileStream 对象有许多不同的方法,这里使用文件名和FileMode

从自动生成.h的头文件集合和类声明集合到用python读写文件

最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些类,会累死人的.所以用python来生成这些类的头文件引用和类的类名声明 先看例子,再聊python的读写文件的代码 在聊聊我的python代码 ------------------------> 好吧.上面的图就是面临的需求 下面来聊聊从网上找的读写文件的python代码吧.csdn的一个博主写的

c# 高效读写文件

一.同步读写文件(在并发情况下不会发生文件被占用异常) static void Main(string[] args) { Parallel.For(0, 10000, e => { string str = "测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试\r\n"; using (FileStream fs = new FileStream("d:\\a.txt", FileMode.Append, FileAccess.Writ

java读写文件,读超大文件

一直在处理爬虫,经常能遇到读写文件的操作,很多时候都是读写超大文件,记录如下: 一.读文件 import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException;

Nodejs查找,读写文件

Nodejs查找,读写文件 (1),路径处理1.首先,我们需要注意的文件路径的规范化,nodejs给我们提供了Path模块,normolize方法能帮我们规范化路径:var path = require('path');path.normalize('/foo/bar/nor/faz/..'); -> /foo/bar/nor2.当然还有join合并路径:var path = require('path');path.join('/foo', 'bar', 'baz/asdf', 'quux',