This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C123GH6PM:"remove()"工作、但 rename ()不工作。 如何正确指定要重命名的参数?

Guru**** 2616675 points

Other Parts Discussed in Thread: TM4C123GH6PM, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/778691/rtos-tm4c123gh6pm-remove-works-but-rename-does-not-how-do-i-properly-specify-the-arguments-to-rename

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件: SYSBIOS

工具/软件:TI-RTOS

重命名(旧、新)以前正常工作、但我做了一些事情、现在没有。

我尝试过裸文件、这是...

结果...

ffconf.h 如下所示...

/*------------------ /
/ FatFs - FAT 文件系统模块配置文件 R0.08A (C) CHAN、2010
/---------------------------------------------------------- /
/
/小心! 请勿忘记在对进行任何更改后清理工程
/配置选项。
/
/---------------------------------------------------------- *
#ifndef _FFCONF
#define _FFCONF 8255   /*修订 ID */


/*------------------ /
/功能和缓冲器配置
/---------------------------------------------------------- *

#define _FS_Tiny       0              /* 0:Normal 或1:Tiny */
/*当_FS_Tiny 设置为1时,FatFs 使用文件系统中的扇区缓冲区
/ 对象、而不是文件的单个文件对象中的扇区缓冲区
/ 数据传输。 这减少了每个文件对象的内存消耗512字节。 *


#define _FS_readonly   0      /* 0:Read/Write 或1:Read Only */
/*将_FS_readonly 设置为1定义只读配置。 这将删除
/ 写入函数、f_write、f_sync、f_unlink、f_mkdir、 f_chmod、f_rename、
/f_truncate 和无用的 f_getfree。 *


#define _FS_minimize   0      /* 0至3!!was 0 */
/*_FS_minimize 选项定义最小化级别以删除某些函数。
/
/0  :全功能。
/  1:f_stat、f_getfree、f_unlink、f_mkdir、f_chmod、 f_truncate 和 f_rename
     /被删除。
/  2:除了1之外、还会删除 F_opendir 和 f_readdir。
/  3:除了2之外、F_lseek 被删除。
*


#define _USE_STRFUNC   0      /* 0:禁用或1/2:启用*
/*要启用字符串函数,请将_use_STRFUNC 设置为1或2。 *


#define _use_mkfs      0              /* 0:Disable 或1:Enable !!was 1 */
/*要启用 f_mkfs 函数,请将_use_mkfs 设置为1,并将_fs_readonly 设置为0 */


#define _USE_Forward   0      /* 0:禁用或1:启用*
/*要启用 f_Forward 功能,请将_use_Forward 设置为1,并将_FS_Tiny 设置为1。 *


#define _USE_FASTSEEK  0      /* 0:禁用或1:启用*/
/*要启用快速搜索功能,请将_use_FASTSEEK 设置为1。 *



/*------------------ /
/区域和名称空间配置
/---------------------------------------------------------- *

#define _CODE_PAGE     932
/*_code_page 指定要在目标系统上使用的 OEM 代码页。
/ 代码页设置不正确可能导致文件打开失败。
/
/932   -日文 Shift-JIS (DBCS、OEM、Windows)
/  936 -简体中文 GBK (DBCS、OEM、Windows)
/949   -韩语(DBCS、OEM、Windows)
/950   -繁体中文 Big5 (DBCS、OEM、Windows)
/1250  -中欧(Windows)
/1251  -西里尔文(Windows)
/1252  -拉丁语1 (Windows)
/1253  -希腊语(Windows)
/1254  -土耳其语(Windows)
/1255  -希伯来语(Windows)
/1256  -阿拉伯语(Windows)
/1257  -波罗的海(Windows)
/1258  -越南(OEM、Windows)
/437-   美国 (OEM)
/720-   阿拉伯语(OEM)
/  737 -希腊语(OEM)
/  775 -波罗的海(OEM)
/850   -多语种拉丁语1 (OEM)
/  858 -多语种拉丁语1 +欧洲(OEM)
/852   -拉丁语2 (OEM)
/855   -西里尔文(OEM)
/  866 -俄语(OEM)
/857   -土耳其语(OEM)
/862   -希伯来语(OEM)
/  874 -泰国语(OEM、Windows)
/      1   -仅 ASCII (对于非 LFN cfg 有效)
*


#define _USE_LFN       0              /* 0至3 */
#define _MAX_LFN       255            /*要处理的最大 LFN 长度(12至255)*/
/*_use_LFN 选项切换 LFN 支持。
/
/  0:禁用 LFN 功能。 _MAX_LFN 和_LFn_Unicode 无效。
/  1:在 BSS 上启用具有静态工作缓冲器的 LFN。 始终不可重入。
/  2:在堆栈上启用具有动态工作缓冲器的 LFN。
/  3:启用堆上具有动态工作缓冲区的 LFN。
/
/ LFN 工作缓冲区占用(_MAX_LFN + 1)* 2个字节。 要启用 LFN、
/ 必须添加 Unicode 处理函数 ff_convert()和 ff_wtumiper()
项目 。 启用时使用堆、存储器控制函数
必须 将 ff_memalloc()和 ff_memfree()添加到项目中。 *


#define _LFn_Unicode   0      /* 0:ANSI/OEM 或1:Unicode */
/*要将 FatFs API 上设置的字符代码切换为 Unicode,
/ 启用 LFN 功能并将_LFn_Unicode 设置为1。 *


#define _FS_rPath      0              /* 0至2 */
/*_FS_rPath 选项配置相对路径功能。
/
/  0:禁用相对路径功能并删除相关功能。
/  1:启用相对路径。 f_chdrive()和 f_chdir()可用。
/  2:F_getcwd()除1之外还可用。
/
/ 请注意、f_readdir 函数的输出受此选项的影响。 *



/*------------------ /
/物理驱动器配置
/---------------------------------------------------------- *

#define _volumes       1.
/*要使用的卷数量(逻辑驱动器)。 !!之前是4 */


#define _MAX_SS        512            /* 512、1024、2048或4096 */
/*要处理的最大扇区大小。
/ 始终为存储卡和硬盘设置512,但可能是较大的值
/ 对于软盘(512/1024)和光盘(512/2048)是必需的。
/ 当_MAX_SS 大于512时、必须执行 get_sector_size 命令
/ 添加到 disk_ioctl 函数。 *


#define _multi_partition       0      /* 0:单个分区或1:多个分区*/
/*当设置为0时,每个卷都绑定到相同的物理驱动器编号和
/它只能安装第一个 primy 分区。 当它设置为1时、每个卷
/与 VolToPart[]中列出的分区相关联。 *


#define _USE_ERASE     0      /* 0:禁用或1:启用*
/*要启用扇区擦除功能,请将_use_erase 设置为1。 *



/*------------------ /
/系统配置
/---------------------------------------------------------- *

#define _WORD_ACCESS   0      /* 0或1 */
/*首先设置0,它始终与所有平台兼容。 word_access
/ 选项定义对 FAT 卷上的字数据使用哪种访问方法。
/
/  0:逐字节访问。
/  1:字访问。 除非满足以下条件、否则请勿选择此选项。
/
/ 当存储器上的字节顺序为大端字节序或地址未对齐字时
/ 访问导致错误行为、_word_access 必须设置为0。
/ 如果情况并非如此、也可以将该值设置为1以改进
/ 性能和代码大小。 *


/*此处包含一个头文件,用于在 O/S 上定义同步对象类型*/
/*#include 、 、 或欧姆。 *

#define _FS_retentant  0      /* 0:Disable 或1:Enable */
#define _FS_TIMEOUT    1000   //超时周期(以时间刻度为单位)*/
#define _SYNC_t        void * //与 O/S 相关的同步对象类型。 例如 Handle、OS_EVENT*、ID 等。 *

/*_fs_reentant 选项可切换 FatFs 模块的可重入性。
/
/  0:禁用可重入性。 SYNC_t 和_FS_TIMEOUT 无效。
/  1:启用可重入性。 此外、用户提供的同步处理程序、
/ff_req_Grant     、ff_rel_Grant、ff_del_syncobj 和 ff_cre_syncobj
/     函数必须添加到项目中。 *


#define _FS_SHARE      0      /* 0:禁用或>=1:启用*/
/*要启用文件共享功能,请将_FS_share 设置为1或更大。 值
  定义可以同时打开的文件数量。 *


#endif /*_FFCONFIG */

非常感谢您的帮助。

谢谢、

Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:
    我不是 FatFS 的专家、但有一些问题:

    1.您使用的是不带 TI-RTOS 的本机 C 库函数 rename(),还是使用了 TI-RTOS FatFS?
    2. printB 是您自己的打印功能吗?
    3.您说 rename ()以前是正常工作的吗? 您是否还记得在它开始不起作用之前、您确切地更改了什么? 您无法恢复吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、
    我正在使用 TI-RTOS FatFS。
    2.是的、printB 是我将格式化数据从 UART1发送到远程控制器和调试控制台屏幕的函数。
    3.我在使用'name()'的那部分计划工作了几年,所以我记不出任何关于它的事情。 在我当前的工作中,我刚刚为 tokenize()例程添加了第二个传递函数(该函数在我的“机器人控制语言”解释器中“标记”源代码,以加快解释速度)。 当"运行"时、解释器从 SDcard 上的文件一次读取一行、并使用 file.pos (通过 ftell ())作为虚拟"程序计数器"。 我的"语言"支持"while wend"循环和"if endif"语句。 解释器的第一次迭代必须读取并丢弃'while'和'wend'之间的所有行、以便在'while'的真伪条件变为 false 时找到'wend'。 非常慢。 令牌化器的第二次传递会找到'wend'、然后将其地址添加到'while'指令的'tokenized'形式、以便在解释期间使用该值将文件指针"发送"到文件中的位置、该位置是'wend'后面的行。 快得多。 令牌化器的第一遍输入 filename.SRC 并输出名为 filename.Bob 的令牌化文件、如果遇到'while'或'if'指令、则设置必要的 ndPass 标志。 第二次传递采用 filename.Bob 作为输入并输出 filename.TXT。 当第二次传递完成时、它将"retime() s filename.Bob 和"name() s" filename.TXT tofileName.Bob。 这就是我需要"名字"才能工作的原因。

    我所做的最后一件事可能会影响系统:解释器实际上是一个"多任务"解释器、旨在以循环方式从多达10个打开的文件中读取和解释行(通过10个"虚拟 CPU"实现)。 但系统的默认状态将_ftable 限制为仅10个条目、其中3个条目由 stdin、stdout 和 stderr 使用、因此将我限制为仅7个同时打开的文件。 在另一位 TI 专家的帮助下、我能够将_ftable 大小增加到15个条目。 为此、我必须更改'stdio.h'和'file.h'中的条目、然后重建库。 但在我的初始安装过程中、我可能错误地更改了"ffconf.h"、"stdio.h"和"file.h"等中的设置

    我刚刚查看了这些文件、一切看起来都很好(就我的有限理解而言)、然后再次重建了库。 令人遗憾的是,问题仍然存在。

    你怎么看?
    谢谢、
    Dave
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dave、
    我将把您的帖子转发给我们的 TI-RTOS 专家、以获得一些指导。 "机器人控制语言"解释器是否在您的 PC 上运行? 我正在尝试了解 MCU 方面的错误是什么、而 MCU 方面的错误是什么。 如果您所描述的问题与 TI-RTOS 相关、那么我在这里还不够了解。 如果您能澄清问题、这将有助于我们的 TI-RTOS 专家诊断问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    在 TM4C123GH6PM 中、令牌化器、解释器、RTOS 和所有内容的运行速度大约为90K (到目前为止)。

    (一切都非常简单。 "语言"大致建模为一个简单的"汇编语言"(如6502或6811)、其中的每条指令都以 "操作码"动词开头。 所有标记器所做的是查找每一行中的第一个字、并将其替换为找到该字的列表的索引号(字符串)。 在解释过程中,从文件中读取的每一行都会被解析为一组令牌,第一个令牌,即操作码,由 atoi()转换并馈送到 switch 语句中。 开关中的每个"大小写"都调用一个子例程、该子例程使用其余令牌作为"操作数"来处理指令的意图。 每个文件的解释都通过一个"虚拟 CPU"结构进行管理。 下面是一张说明性图片...

    谢谢、

    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dave、

    该项目基于哪个版本的 SDK?
    2.您是否知道要返回什么值 rename()? 您是否尝试进入该代码来观察发生了什么?
    3.此问题是否持续发生,还是间歇性出现?
    4.您提到必须重建库才能同时处理更多文件。 您是否曾尝试使用原始库来查看这是否会导致问题消失? 这将帮助我们开始隔离该问题。

    谢谢、

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、

    关于:

    1.我不知道。 我认为它不是基于 SDK 的。

    2. rename ()返回-1。

    3问题是绝对一致的。

    4在"stdio.h"中将_nfile 条目值从10更改为15。

    'file.h'将_NSTREAM 条目值从10更改为15。

    建议我删除 rtsv7M4_T_le_v4SPD16_eabi.lib、以强制重新构建它、并将我的更改合并在一起、这样我就完成了、并且它正常工作了。 _ftable 现在有15个条目。

    RemoveFile()工作正常,我单步执行它并看到它返回0的位置。

    我单步执行 renameFile(),无法理解大多数汇编(不熟悉 ARM)。 在 finddevice()返回空后,我确实看到了它返回-1的位置(如下所示)。

    我是否应该向您发送一些文件?

    感谢你的帮助。

    谢谢、

    Dave

    P.S. 下面是我的调试控制台在机器人引导后的外观、我告诉它将文件 k.src 标记为 tokenize

    (调试屏幕上的情况比此处显示的情况更好)...

    大家好  

    已打开 system.TXT r
    已关闭系统.TXT
    系统已恢复

    时钟启动:毫秒

    !ReportBump b 7 1.
    !ReportUnit 单元1_5E98C1
    !ReportVolt 电池11.9
    !ReportTime setTime 3760768312

    时钟启动:PID
    时钟启动:位置
    时钟启动:AtoD
    时钟启动:ArmServos
    时钟启动:扫描仪

    好的:tokenize k
    令牌化 K.SRC
    1号导通---
    已打开 K.SRC r
    打开了 K.Bob w
       操作数
       74 ON
       43 x 10
       52.
       53秒0毫秒0
       46 @2Seek 测试\n
       55 0 x <
       54岁 x 5 <=
       46 @%d@%d@6 x =%d\n、x、x、x
       81.
       42倍
       56.
       46 @2 x =%d\n、x
       46 @3此测试\n
       46 @4%d.%d\n,秒,毫秒
       46 @5秒。\n
       35.
    已关闭 K.SRC
    关闭了 K.Bob

    2号导通---
    打开了 K.Bob r
    打开 TMP.Bob w
      位置操作数
        0 74打开
        6 43 x 10
       1452.
       17 53秒0毫秒0
       35 46 @2Seek 测试\n
       52 55 125    0 x <
       69 54 117    x 5 <=
       87 46 @%d@%d@6 x =%d\n、x、x、x
       11481.
       117 42 x
       122 56.
       125 46 @2 x =%d\n、x
       142 46 @3本测试\n 完成
       164 46 @4%d.%d\n,秒,毫秒
       191 46 @5秒。\n
       20735.
    关闭了 K.Bob
    关闭了 TMP.Bob
    删除了 K.Bob
    未重命名:TMP.Bob 为 K.Bob
    RetVal =-1
    重命名:域错误
    标记化 K.SRC

    确定:list k.src C
    已打开 K.SRC r
       //搜索测试
       跟踪打开
       变量 x 10.
       CLS
       设置 Secs 0毫秒0
       ? @2Seek 测试\n
       而0 < x
          如果 x <= 5
              ? @%d@%d@6 x =%d\n、x、x、x
          字节序
          ---- x
       结束
       ? @2 x =%d\n、x
       ? @3此测试进行了\n
       ? @4%d.%d\n,秒,毫秒
       ? @5秒。\n
       结束
    已关闭 K.SRC
    完成列表

    确定:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dave、

    也许您可以向我发送正在运行的测试以及包含 removeFile()等的文件
    是否已检查先前的 stdio 调用是否有错误? IE 是 fopen、fclose、并删除所有返回的0?

    我会尝试以下几项操作:
    如果你看看内存中的 oldbuf 和 newbuf,缓冲区中是否还有旧的堆栈数据? 这可能会导致字符串比较问题?
    -如果您在尝试重命名 TMP.Bob 之前尝试 fopen TMP.Bob,会发生什么情况? 该操作是否成功?
    -如果您尝试将 TMP.Bob 重命名为不是 K.Bob 的内容,会发生什么情况? 可能由于某种原因存在文件名争用?

    谢谢、

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dave、

    对此进行了任何更新? 您是否能够找出问题所在?

    谢谢、

    肖恩
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、
    我想我会让 rename ()在失去知觉的情况下游泳一段时间,因为我解决了系统中的其他问题。 现在一切都正常工作(我相信所有的东西,更多的按顺序进行测试)。 为了启用此活动,我编写了一个“变通方法”,在其中我只复制了 K.Bob 文件上的 TMP.Bob 文件,从而获得与 rename ()相同的结果。

    那么、现在...
    我在一个屏幕上的汇编器中单步执行 rename (),并在另一个屏幕上观察到 lowleve.c,尝试查找导致重命名失败的条件。 以下是我在两个屏幕上所做的大量记录...
    ________________________________________________________________

    void renameFile (char *old、char *new){<-- my rename 函数
    char oldbuf[20];
    char newbuf[20];
    sprintf (oldbuf、"fat:0:%s"、old);
    sprintf (newbuf、"fat:0:%s"、新);
    if (rename (oldbuf、newbuf) isnot 0){... <--反汇编开始

    rename ():
    getdevice():
    finddevice():
    返回空;
    dev = finddevice (devname);<-- dev 为'fat'

    返回 stdevice;/*"标准"设备-主机 I/O */
    old_dev = getdevice (&old_name);<-- old_dev 为'fat'
    new_dev = getdevice (&new_name);<-- new_dev 为'fat'
    if (old_dev!= new_dev)
    结果=(*(old_dev->rename))(old_name、new_name);

    无法在"/db/vtree/library/trees/zumaprod/zumaprod-f33/tirtos_tivac_2_12_01_33/products/bios_6_41_04_54/packages/ti/sysbios/fatfs/ffcio.c "中找到源文件
    找到文件或编辑源查找路径以包括其位置。
    ffcio_rename ():
    00013186:B508推送{R3、LR}
    00013188:F7F5FEF8 BL #0x8f7c

    f_rename ():
    00008f7c:B570 PUSH{R4、R5、R6、LR}



    00008fc8:F005F938 BL #0xe23c
    00008fcc:1C04加上 R4、r0、#0
    00008fce:D059 beq $C$L173
    00008fd0:2C04 CMP R4、#4
    00008fd2:d15A bne $C$L175 <-- R4是6,而不是0
    $C$L175:
    0000908a:9801 LDR r0、[sp、#4]
    0000908c:4621 mov R1、R4
    0000908e:F009FEA5 BL #0x12ddc
    00009092:4620 mov r0、R4
    00009094:B018 ADD sp、#0x60
    00009096:BD70 Pop{R4、R5、R6、PC}

    0001318c:2800 CMP r0、#0 <-- r0是6
    0001318e:BF14 ite ne
    00013190:F04F30FF mov.w r0、#-1 <--这将执行
    00013194:2000 MOV r0、#0
    00013196:BD08 POP{R3、PC}
    结果=(*(old_dev->rename))(old_name、new_name);<--结果为-1
    00002bb2:4628 mov r0、R5
    00002bb4:BD3E POP{R1、R2、R3、R4、R5、 PC}

    结果=(*(old_dev->rename))(old_name、new_name);<--结果为-1
    _TI_resource_unlock (_TI_lock_device_tBL);

    0000d95a:B928 cbnz r0、#0xd968 <-- r0为-1
    104 printB ("重命名%s \RTO %s \rFAILED\n"、oldbuf、newbuf);<--#0xd968在这里、失败
    ________________________________________________________________

    我恢复了在尝试将_ftable 从10个条目增加到15个条目时错误地处理的'stdio'h 和'file.h'中的所有值,删除了 rtsv7M4_T_le_v4SPD16_eabi.lib 和'Cleaned'我的项目强制重建,但 rename ()仍然失败。

    您是否有我可以调查的“rename ()失败的最可能原因”列表?
    非常感谢、
    Dave
    P.S.
    作为速度测试、我对我的系统非常满意:能够将10个文件插入10个虚拟 CPU、并让它们都"同时"运行、读取10个不同的文件进行解释
    对于 A = 0至10000
    N =((b x c)+(d + e)) SQU
    下一步
    每秒500次迭代。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Dave、

    很高兴听到您有工作要做。 您可以为 CCS 提供所需的文件、以查看哪个函数在 ff. c. 当显示"Can't find a source file at "/db/vtree/library/trees/zumaprod/zumaprod-f33/tirtos_tivac_2_12_01_33/.....时 "
    找到文件或编辑源查找路径以包括其位置。' 您可以从 SDK 中提供 ff.c (如果需要,可以在此处重新下载该 SDK: software-dl.ti.com/.../index.html )

    ff.c 和 ffcio.c 都应位于路径中:\ti_tirtos_tivac_2_12_01_33\products\BIOS_6_41_04_54\packages/ti\SysBIOS\fatfs

    这将使您更好地了解 FatFs 失败的地方。 很遗憾,我无法重现 rename()问题,因此除非您能从自己的角度跟踪问题,否则我建议您使用变通办法。

    肖恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、

    好的、需要单步执行 ff. c..

    在电流

    FRESULT f_rename (
           const TCAR *path_old, /*指向旧名称的指针*/
           const TCAR *path_new  /*指向新名称的指针*/
    )

           FRESULT 分辨率;
           DIR DJO、djn;
           字节 buf[21]、*目录;
           dword dw;
           DEF_NAMEBUF;


           RES = chk_mounted (&path_old、&DJO.FS、1);
           如果(res == FR_OK){
                   djn.fs = DJO.FS;
                   INIT_BUF (DJO);
                   RES = foll_path (&DJO、path_old);  //检查旧对象*/
                   if (_FS_rPath && res = FR_OK &&(DJO.fn[NS]和 NS_DOT))
                           RES = FR_INVALID_NAME;
    #if _FS_share
                   if (res =FR_OK) res = chk_lock (&DJO、2);
    #endif
                   如果(res =FR_OK){               /*找到旧对象*/
                           如果(!DJo.dir){/*           是 root dir? *
                                   RES = FR_NO_FILE;
                           }否则{
                                   MEM_CPY (buf、DJO. dir+DIR_Attr、21);//保存对象...
                                   MEM_CPY (&djn、&DJO、sizeof (DIR));  //检查新对象*/
                                   RES = foller_path (&djn、path_new);<----此行将返回6!

    6是:
    宏:内部 ENXIO

    “无此类设备或地址。” 系统尝试使用由您指定的文件表示的设备,但无法找到该设备。 这可能意味着设备文件安装不正确,或者物理设备丢失或未正确连接到计算机"。

    同样,我调用 rename()的函数:

    /******** TM4C123GH6PM
    void renameFile (char *旧、char *新){
    char oldbuf[20];
    char newbuf[20];

       sprintf (oldbuf、"fat:0:%s"、old);
       sprintf (newbuf、"fat:0:%s"、新);
       if (rename (oldbuf、newbuf)不为0){
          printB ("将失败的\r\n 重命名为%s\n"、oldbuf、newbuf);
          perror ("重命名");
    //      返回 false;
       }
       其他
          printB ("将\r%s 重命名为\r%s\n"、oldbuf、newbuf);
    //   返回 true;

    它将"fat:0:TMP.Bob"和"fat:0:K.Bob"传递给 rename ()。

    这是否有帮助?

    我真的不想继续工作。

    有什么想法吗?

    谢谢、

    Dave

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dave、

    我不确定我们可以为这方面提供多大帮助、因为我们无法重现这种情况、听起来好像您已更改了一些内容、这就是它不再工作的原因。 您能否返回到正常工作的设置、然后滚动更改以确定导致问题的原因?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、
    更新 CCS 是否会删除我的更改?
    我担心我的项目(4年开发)可能会受到影响。
    有机会吗?
    谢谢、
    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    David、

    听起来您最好坚持自己的解决方案。 遗憾的是、我认为我们在这方面没有更多的帮助、因此我将该主题标记为"TI 认为已解决"。

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Sean、

    我怀疑这可能会令人尴尬、我是对的。

    我可以将其标记为已解决的问题。

    发生了以下情况:

    因为我只有一个 SDcard 驱动器:在文件 ffconf.h 中,我更改了

    #define _volumes       4.
    /*要使用的卷数量(逻辑驱动器)。  *

    更改为

    #define _volumes       1.
    /*要使用的卷数量(逻辑驱动器)。 *

    希望这可能会在某个地方节省一些 RAM。

    我的所有磁盘访问命令(OpenFile() closeFile() removeFile()等)都在文件名前加上字符串"fat:0"。

    如果指定了多个逻辑驱动器,则指定的驱动器编号是正确的,但将其更改为只有1似乎引入了错误。

    现在,当我只在文件名中加上"fat:"时,包括 rename ()在内的所有文件访问命令都将按预期工作。

    奇怪的是,当驱动器编号包含在文件规范字符串中时,除 rename ()外的所有命令都能正常工作。

    仅通过单步执行、我才发现从 ff.c f_rename 中的第3194行开始

    MEM_CPY (&djn、&DJO、sizeof (DIR));

    正在复制'0:'和

    RES = foll_path (&djn、path_new);

    发现零之后的冒号是我对问题的"非法"字符。

    给你。

    再次感谢您的帮助。

    谢谢、

    Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dave、

    很高兴你解决了这个问题! 感谢您报告解决方案、很高兴获得解决方案。 祝你度过美好的一天!

    肖恩