📄 fdt.c
字号:
//返回: 无
//注: 添加时间管理后,文件创建时间由time函数得到---db
//-----------------------------------------------------------------------------
void __DFFSD_asm_FDT_item(struct fdt_info *FDT_item,union file_attrs attr,
char *name)
{
uint8_t attr_mirror;
ufast_t i;
//因存在可能的移植问题,不宜直接使用位联合结构的attr参数
attr_mirror = 0;
if(attr.bits.read_only)
attr_mirror +=cn_FS_ATTR_READ_ONLY;
if(attr.bits.hidden)
attr_mirror +=cn_FS_ATTR_HIDDEN;
if(attr.bits.folder)
attr_mirror +=cn_FS_ATTR_DIRECTORY;
if(attr.bits.archive)
attr_mirror +=cn_FS_ATTR_ARCHIVE; //以上只初始化4个属性,还两个暂不用
FDT_item->mattr = attr_mirror;
FDT_item->name_buf_len = cn_flash_file_name_limit +1;
for(i = 0; i < 8; i++)
FDT_item->file_size[i] = 0; //文件尺寸=0
//name是模块内部提供的字符串指针,已经经过字符串长度合法性检查
if(strlen(name) <= cn_flash_file_name_limit)//读取文件柜名字
strcpy(FDT_item->name,name);
else
{
memcpy(FDT_item->name,name,cn_flash_file_name_limit);
FDT_item->name[cn_flash_file_name_limit] = '\0';
}
FDT_item->second_create = 0x00;
FDT_item->minute_create = 0x00;
FDT_item->hour_create = 0x12;
FDT_item->date_create = 0x04;
FDT_item->month_create = 0x01;
FDT_item->year_low_create = 0x09;
FDT_item->year_high_create = 0x20;
FDT_item->second_modify = 0x00;
FDT_item->minute_modify = 0x00;
FDT_item->hour_modify = 0x12;
FDT_item->date_modify = 0x04;
FDT_item->month_modify = 0x01;
FDT_item->year_low_modify = 0x09;
FDT_item->year_high_modify = 0x20;
return;
}
//----读取文件(目录)参数-------------------------------------------------------
//功能:从FDT表项的内存镜像中的中读取文件(目录)信息,并初始化文件结构指针fp。
//参数:DBX_flash_tag,被操作的文件柜指针,通用结构,非flash专用。
// fp,保存文件(目录)属性的文件指针
// FDT_item,从flash中读出的FDT表项
//返回:无
//-----------------------------------------------------------------------------
void __DFFSD_uasm_FDT_item(struct st_DBX_flash_tag *DBX_flash_tag,
struct file_rsc *fp,
struct fdt_info *FDT_item)
{
struct flash_chip *chip;
uint8_t attr_mirror;
uint32_t name_len;
chip = DBX_flash_tag->chip;
fp->attr.all = 0;
attr_mirror = FDT_item->mattr;
if(attr_mirror & cn_FS_ATTR_READ_ONLY)
fp->attr.bits.read_only =1;
if(attr_mirror & cn_FS_ATTR_DIRECTORY)
fp->attr.bits.folder =1;
if(attr_mirror & cn_FS_ATTR_HIDDEN)
fp->attr.bits.hidden =1;
if(attr_mirror & cn_FS_ATTR_ARCHIVE)
fp->attr.bits.archive =1; //以上只初始化3个属性,还两个暂不用
fp->second_create = FDT_item->second_create;
fp->minute_create = FDT_item->minute_create;
fp->hour_create = FDT_item->hour_create;
fp->date_create = FDT_item->date_create;
fp->month_create = FDT_item->month_create ;
fp->year_low_create = FDT_item->year_low_create;
fp->year_high_create = FDT_item->year_high_create;
fp->second_modify = FDT_item->second_modify;
fp->minute_modify = FDT_item->minute_modify;
fp->hour_modify = FDT_item->hour_modify;
fp->date_modify = FDT_item->date_modify;
fp->month_modify = FDT_item->month_modify ;
fp->year_low_modify = FDT_item->year_low_modify;
fp->year_high_modify = FDT_item->year_high_modify;
//读文件尺寸,为防止符号为扩展导致不必要的麻烦,按无符号数移位。
fp->file_size = __pick_little_32bit(FDT_item->file_size,0)
+((uint64_t)__pick_little_32bit(FDT_item->file_size,1)<<32);
name_len = rtstrlen(FDT_item->name,cn_flash_file_name_limit);
if(name_len != cn_limit_uint32) //文件柜名字不超过cn_flash_file_name_limit
strcpy(fp->name, FDT_item->name);
else
{
memcpy(fp->name, FDT_item->name,cn_flash_file_name_limit);
fp->name[cn_flash_file_name_limit] = '\0';
}
return ;
}
//----解析根目录条目-------------------------------------------------------
//功能:从根目录的FDT表项的内存镜像中读取根目录信息,写到DBX_flash_tag中
//参数:DBX_flash_tag,被操作的文件柜指针,通用结构,非flash专用。
// FDT_item,从flash中读出的FDT表项
//返回:无
//-----------------------------------------------------------------------------
void __DFFSD_uasm_root_folder(struct st_DBX_flash_tag *DBX_flash_tag,
struct fdt_info *FDT_item)
{
//根目录的FDT条目的file_size有特殊用途,前4字节为FDT表中空闲FDT条目数,后
//4个字节是FDT表中总FDT条目数
DBX_flash_tag->FDT_free_num = __pick_little_32bit(FDT_item->file_size,0);
DBX_flash_tag->FDT_capacity = __pick_little_32bit(FDT_item->file_size,1);
return ;
}
//----修改fdt条目中的起始块号--------------------------------------------------
//功能: 当一个文件的首块被修改时,该文件的fdt条目中保存的起始块号也将被修改。只
// 有在发生磨损平衡块交换时,才有可能调用本函数,故在调用本函数时产生的写
// 操作并不修改磨损次数,即使发生坏块交换,也不调用标准的块分配函数
// __allocate_block分配空闲块,而是直接从free块中取一块,不修改磨损次数。
// 这样可以避免发生连环套。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
// FDT_item_no,fdt条目编号。
// new_block_no,替换块号
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_fstart_dson(struct st_DBX_flash_tag *DBX_flash_tag,
uint32_t FDT_item_no,uint32_t new_block_no)
{
struct fdt_info FDT_item;
__DFFSD_read_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
__fill_little_32bit(FDT_item.fstart_dson,0,new_block_no);
__DFFSD_write_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
return ;
}
//----在FDT中修改文件尺寸------------------------------------------------------
//功能: 修改FDT表项中的文件尺寸域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
// fp,被修改的文件指针,由调用方保证不是目录而是文件。
// new_size,新的文件尺寸
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_file_size(struct st_DBX_flash_tag *DBX_flash_tag,
struct file_rsc *fp,sint64_t new_size)
{
uint32_t FDT_item_no;
struct fdt_info FDT_item;
FDT_item_no = (uint32_t)fp->file_medium_tag;
__DFFSD_read_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
__fill_little_32bit(FDT_item.file_size,0,new_size);
//为防止符号为扩展导致不必要的麻烦,按无符号数移位。
__fill_little_32bit(FDT_item.file_size,1,(uint64_t)new_size>>32);
__DFFSD_write_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
return ;
}
//----在FDT中修改文件名------------------------------------------------------
//功能: 修改FDT表项中的文件(目录)名域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
// fp,被修改的文件指针
// name,新的文件(目录)名
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_item_name(struct st_DBX_flash_tag *DBX_flash_tag,
struct file_rsc *fp,char *name)
{
uint32_t FDT_item_no;
struct fdt_info FDT_item;
FDT_item_no = (uint32_t)fp->file_medium_tag;
__DFFSD_read_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
//name是模块内部提供的字符串指针,已经经过字符串长度合法性检查
if(strlen(name) <= cn_flash_file_name_limit)//读取文件柜名字
strcpy(FDT_item.name,name);
else
{
memcpy(FDT_item.name,name,cn_flash_file_name_limit);
FDT_item.name[cn_flash_file_name_limit] = '\0';
}
__DFFSD_write_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
return ;
}
//----在FDT中修改文件属性------------------------------------------------------
//功能: 修改FDT表项中的文件(目录)属性域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
// fp,被修改的文件指针
// attr,新的文件(目录)属性
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_item_attr(struct st_DBX_flash_tag *DBX_flash_tag,
struct file_rsc *fp,union file_attrs attr)
{
uint32_t FDT_item_no;
struct fdt_info FDT_item;
uint8_t attr_mirror;
FDT_item_no = (uint32_t)fp->file_medium_tag;
__DFFSD_read_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
//因存在可能的移植问题,不宜直接使用位联合结构的attr参数
attr_mirror = FDT_item.mattr;
if(attr.bits.read_only)
attr_mirror +=cn_FS_ATTR_READ_ONLY;
if(attr.bits.hidden)
attr_mirror +=cn_FS_ATTR_HIDDEN;
if(attr.bits.archive)
attr_mirror +=cn_FS_ATTR_ARCHIVE; //以上只初始化3个属性,还两个暂不用
//不能修改目录/文件属性
FDT_item.mattr = attr_mirror;
__DFFSD_write_FDT_item(DBX_flash_tag,FDT_item_no,&FDT_item);
return ;
}
/* db 先注释,待把time结构确定后再说
//----在FDT中修改创建时间------------------------------------------------------
//功能: 修改FDT表项中的创建时间域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
// fp,被修改的文件指针
// new_time,新的时间
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_item_ctime(struct st_DBX_flash_tag *DBX_flash_tag,
struct file_rsc *fp,struct time new_time)
{
return ;
}
//----在FDT中修改修改时间------------------------------------------------------
//功能: 修改FDT表项中的修改时间域。
//参数: DBX_flash_tag,被操作的flash文件柜的存储媒体标签
// fp,被修改的文件指针
// new_time,新的时间
//返回: 无
//-----------------------------------------------------------------------------
void __DFFSD_update_FDT_item_utime(struct st_DBX_flash_tag *DBX_flash_tag,
struct file_rsc *fp,struct time new_time)
{
return ;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -