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.

[参考译文] TMS320F28069M:具有 SD 卡示例代码的 TMS320F28069

Guru**** 2523290 points
Other Parts Discussed in Thread: CONTROLSUITE, TMS320F28069M

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1077616/tms320f28069m-tms320f28069-with-sd-card-example-code

部件号:TMS320F28069M
“线程:controlSUITE,, 测试”中讨论的其它部件

大家好,

我正在尝试刷新 TMS320F28069M 上位于“C:\ti\controlSUITE\device_support\F2837xS\V200\F2837xS_Examples_CPU1\SD_card\cpu01”的 SD 卡的代码。 但在调试代码时,我遇到了以下错误(图 1)

 如图2所示,我已包括所有必要的路径:

请帮助我解决此错误。

提前非常感谢!!

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

    它抱怨一个--define 选项。 您能否转到“C2000编译器”下的“预定义符号”类别,查看其中是否有奇怪的地方?

    惠特尼

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

    您好,Whitney,    

    我去了--define 并进行了如下屏幕截图所示的更改:

    这解决了上一个问题。 但是,我收到了一个错误-“错误:没有源文件,什么也不做”

    请帮我解决这个问题

    提前感谢!!

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

    您的 main.c 文件中有什么代码? 我认为它不是空的? 您是否介意从构建控制台复制和粘贴完整构建命令,以便我可以检查其他问题? 您的屏幕截图正在切断其中的一部分。

    惠特尼

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

    您好,

    下面是代码:

    \\
    #include "DSP28x_Project.h"(#include "DSP28x_Project.h")
    #include <string.h>
    #include "inc/HW_ints.h"
    #include "inc/HW_memmap.h"(#include "inc/HW_memmap.h")
    #include "inc/HW_types.h"
    #include "driverlib/interrupe.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/Systick.h"
    #include "utils/cmdline.h"
    #include "utils/uartstdi.h"(#include "utils/uartstdi.h")
    #include "utils/ustdlib.h"
    #include "thire_part/fatfs/src/ff.h"
    #include "thire_part/fatfs/src/diskio.h"

    //定义

    #define path_BUF_size 80 //定义了容纳的缓冲区的大小
    //路径,或 SD 卡的临时数据。
    //有两个为此大小分配的缓冲区。
    //缓冲区大小必须足够大才能容纳
    //预期最长的完整路径名,
    //包括文件名和后缀 null
    //字符。
    #define CMD_BUF_SIZE 64 //定义缓冲区的大小
    //命令行。
    #define FRESULT_Entry(f){(f),(# f)}//宏,使其易于使用
    //将结果代码添加到表中
    #define name_To_Long_error 1//返回错误原因
    #define opendir_error 2// by ChangeDirectory()。
    #define NUM_FRESULT_CODES (sizeof (g_sfresultStrings)/ sizeof (tFresultString))
    #define ticks_per _second 100
    #define NUM_LIST_STICES 48.
    #define MAX_FILENAME_STRING_LEN (4 + 8 + 1 + 3 + 1)
    #define NUM_STATUS_strings 6.
    #define MAX_STATUS_STRING_LEN (36 + 1)

    //
    //全球
    //
    静态字符 g_cCwdBuf[path_BUF_size]="/";//此缓冲区保留完整路径
    //为当前工作状态
    //目录。 最初是这样
    // root ("/")。
    静态字符 g_cTmpbuf[path_BUF_size];//使用的临时数据缓冲区
    //操作文件路径时,或
    //从 SD 卡读取数据。
    静态字符 g_cCmdbf[CMD_BUF_size];//保存的缓冲区
    //命令行。
    静态 FATFS g_sFatf;
    静态 DIR g_sDirObject;
    静态 FILINFO g_sFileInfo;
    静态 FIL g_sFileObject;

    //
    //在 FRESULT 数字代码之间保存映射的结构,
    //和字符串表示。 FRESULT 代码从 FatF 返回
    // FAT 文件系统驱动程序。
    //
    typedef 结构

    FRESULT 结果;
    字符*pcResultStr;
    }
    tFresultString;

    //
    //一个表,其中包含数字 FRESULT 代码和之间的映射
    //它的名称是字符串。 这用于查找的错误代码
    //打印到控制台。
    //
    tfresultString g_sfresultString[]=

    FRESULT_Entry (FR_OK),
    FRESULT_Entry (FR_NOT_READY),
    FRESULT_Entry (FR_NO_FILE),
    FRESULT_Entry (FR_NO_PATH),
    FRESULT_Entry (FR_INVALID_NAME),
    FRESULT_Entry (FR_INVALID_DRIVE),
    FRESULT_Entry (FR_DENIED),
    FRESULT_Entry (FR_exist),
    FRESULT_Entry (FR_RW_ERROR),
    FRESULT_Entry (FR_WRITE 保护),
    FRESULT_Entry (FR_NOT_ENABLED),
    FRESULT_Entry (FR_NO_Filesystem),
    FRESULT_Entry (FR_INVALID_OBJECT),
    FRESULT_Entry (FR_mkfs_aborted)
    };

    const char *g_ppcDirListStrings[NUM_LIST_STRINS];//文件名的存储
    //列表框小工具字符串
    //表。

    //
    //存储当前目录中的文件名。 文件名
    //以“(D) filename.ext”格式存储,用于目录或
    //“(F) filename.ext”作为文件。
    //
    char g_pcFilename[NUM_LIST_STRING][MAX_FILE_STRING_LEN];

    //
    //存储显示在底部状态框中的字符串
    //显示。
    //
    char G_pcStatus[NUM_STATUS_STRING][MAX_STATUS_STRING_LEN];

    //
    //状态列表框小工具字符串表的存储。
    //
    const char *g_ppcStatusStrings[NUM_STATUS_STRINS]=

    G_pcStatus[0],
    G_pcStatus[1],
    G_pcStatus[2],
    G_pcStatus[3],
    G_pcStatus[4],
    pcStatus[5]
    };
    无符号长格_ulStatusStringIndex =0;

    //
    //转发用户中使用的小部件所调用函数的声明
    //接口。
    //
    静态 FRESULT ChangeToDirectory(CHAR *pcDirectory, unsigned long *pulReason);
    静态 const char *StringFromResult (FRESULT fresult);

    //
    //函数原型
    //
    extern void UARTStdioIntHandler (void);

    //
    // StringFromResult -此函数返回的字符串表示
    //从函数调用返回的错误代码
    // Fatfs。 它可用于打印人类可读的内容
    //错误消息。
    //
    静态 const char *
    StringFromResult (FRESULT 结果)

    未签名的 int uIdx;

    //
    //输入循环以搜索错误代码表中的匹配项
    //错误代码。
    //
    对于(uIdx = 0;uIdx < NUM_FRESULT_CODES;uIdx++)

    //
    //如果找到匹配项,则返回的字符串名称
    //错误代码。
    //
    IF (g_sfresultString[uIdx]。fresult == fresult)

    return(g_sfresultString[uIdx].pcResultStr);
    }
    }

    //
    //此时未找到匹配的代码,因此返回
    //字符串表示未知错误。
    //
    return (“未知错误代码”);
    }


    // SysTickHandler -这是此 Systick 中断的处理程序。 Fatfs
    //内部计时需要每10 ms 执行一次计时器嘀嗒声
    //目的。

    中断无效
    SysTickHandler (void)

    //
    //调用 FatF tick 计时器。
    //
    disk_timerproc ();
    PieCtrlRegs.PIEACK.ALL |= 1;
    }

    //
    // Cmd_ls -此函数实现“ls”命令。 它打开电流
    //目录并枚举内容,并打印一行
    //找到的每个项目。 它显示文件属性,
    //时间和日期,文件大小以及名称。 它显示 A
    //文件大小的摘要和可用空间。
    //
    int Cmd_ls (int argc,char *argv[])

    无符号长 ulTotalSize,ulItemCount,ulFileCount,ulDirCount;
    FRESULT 结果;
    FATFS * pFatF;

    //
    //打开当前目录进行访问。
    //
    fresult = f_opendir (&g_sDirObject,g_cCwdBuf);

    //
    //检查错误,如果有问题,返回。
    //
    IF (fresult!= FR_OK)

    返回(fresult);
    }

    ulTotalSize = 0;
    ulFileCount = 0;
    ulDirCount = 0;
    ulItemCount = 0;

    //
    //在商品信息发布前再加一个空白行。
    //
    UART printf("\n");

    //
    //输入循环以枚举所有目录项。
    //
    for (;;)

    //
    //从目录中读取一个条目。
    //
    fresult = f_readdir(&G_sDirObject,&g_sFileInfo);

    //
    //检查错误,如果有问题,返回。
    //
    IF (fresult!= FR_OK)

    返回(fresult);
    }

    //
    //如果文件名为空,则此为的末尾
    //列表。
    //
    IF (!g_sFileInfo.fname[0])

    休息;
    }

    //
    //使用格式在单行上打印条目信息
    //显示属性,日期,时间,大小和名称。
    //
    UARTprintf("%c%c%c%c%c%c %u/%02u/%02u %02u:%02u %9U %s\n",
    (G_sFileInfo.fattrib & AM_DIR)? (UINT32_t)D':(UINT32_t)'-',
    (G_sFileInfo.fattrib & AM_RDO)? (UINT32_t)'R':(UINT32_t)'-',
    (G_sFileInfo.fattrib & AM_HID)? (UINT32_t)'H':(UINT32_t)'-',
    (G_sFileInfo.Fattrib&AM_SYS)? (UINT32_t)'s':(UINT32_t)'-',
    (G_sFileInfo.fattrib & AM_ARC)? (UINT32_t)'A':(UINT32_t)'-',
    (UINT32_t)(((g_sFileInfo.fdate >> 9)+ 1980),
    (UINT32_t)(((g_sFileInfo.fdate >>>5)和15),
    (UINT32_t)(g_sFileInfo.fdate & 31),
    (UINT32_t)(((g_sFileInfo.ftime >> 11)),
    (UINT32_t)(((g_sFileInfo.ftime >> 5)和63),
    (UINT32_t)(g_sFileInfo.fsize),
    g_sFileInfo.fname);

    //
    //在列表框小部件中将信息添加为一行。
    //
    IF (ulItemCount < NUM_LIST_SITES)

    usprintf(g_pcFilames[ulItemCount],“(%c)%12s”,
    (G_sFileInfo.fattrib & AM_DIR)? “D”:“F”,
    g_sFileInfo.fname);
    }

    //
    //如果属性是目录,则增加目录计数。
    //
    IF (G_sFileInfo.Fattribb & AM_DIR)

    ulDirCount++;
    }
    //
    //否则,它是一个文件。 增加文件计数,和
    //将文件大小添加到总数中。
    //
    否则

    ulFileCount++;
    ulTotalSize += g_sFileInfo.fsize;
    }

    //
    //移至我们用于填充的条目数组中的下一个条目
    //列表框。
    //
    ulItemCount++;

    //
    //等待 UART 传输缓冲区清空。
    //
    // UARTFlushTx (假);
    }

    //
    //打印显示文件,目录和大小总计的汇总行。
    //
    UARTprintf ("\n%4U 文件,共%10U 字节\n%4U 目录",
    ulFileCount,ulTotalSize,ulDirCount);

    //
    //获得可用空间。
    //
    fresult = f_getfree ("/",&ulTotalSize,&pFatf);

    //
    //检查错误,如果有问题,返回。
    //
    IF (fresult!= FR_OK)

    返回(fresult);
    }

    //
    //显示计算得出的可用空间量。
    //
    UARTprintf (",%10uK 字节空闲\n",ulTotalSize * pFatfs-> sipuls_clust / 2);

    //
    //等待 UART 传输缓冲区清空。
    //
    // UARTFlushTx (假);

    //
    //来到这里,返回时没有任何错误。
    //
    返回(0);
    }

    //
    // ChangeToDirectory -此函数实现“CD”命令。 这需要一个
    //参数,用于指定要创建的目录
    //当前工作目录。 路径分隔符必须使用
    //正斜杠"/"。 CD 的参数可以是其中之一
    //如下:
    //* root ("/")
    //*完全指定的路径("/my/path/path/t/mydir")
    //*当前的单个目录名
    //目录("mydir")
    //*父目录(".")
    //它不理解相对路径,所以不要尝试
    //类似的内容:("./my/new/path")
    //指定新目录后,它将尝试打开
    //目录以确保它存在。 如果是新路径
    //成功打开,然后打开当前工作状态
    //目录(cwd)更改为新路径。 在的情况下
    //错误,pulRefason 参数将使用一个
    //以下值:
    //
    静态 FRESULT
    ChangeToDirectory(字符*pcDirectory,无符号长*pulRefason )

    未签名的 int uIdx;
    FRESULT 结果;

    //
    //将当前工作路径复制到临时缓冲区中,以此类推
    //它可以被操纵。
    //
    strcpy (g_cTmpbuf,g_cCwdBuf);

    //
    //如果第一个字符是/,则该字符是完全指定的
    //路径,它应该按目前的方式使用。
    //
    IF (pcDirectory[0]=='/')

    //
    //确保新路径不大于 cwd 缓冲区。
    //
    IF (strlen(pcDirectory)+1 > sizeof (g_cCwdBuf))

    *pulRefason = name_To_Long_error;
    退货(FR_OK);
    }
    //
    //如果新路径名(在 argv[1]中)不是太长,那么
    //将其复制到临时缓冲区,以便对其进行检查。
    //
    否则

    strncpy (g_cTmpbuf,pcDirectory,sizeof (g_cTmpbuf));
    }
    }
    //
    //如果参数为...,则尝试删除最低级别
    //在 CWD 上。
    //
    否则,如果(!strcmp(pcDirectory,“..”))

    //
    //获取当前路径中最后一个字符的索引。
    //
    uIdx = strlen (g_cTmpbuf)- 1;

    //
    //从路径名末尾备份到分隔符(/)
    //发现了,或者直到我们开始前进。
    //
    While (((g_cTmpbuf[uIdx]!='/')&&(uIdx > 1))

    //
    //备份一个字符。
    //
    uIdx--;
    }

    //
    //现在,我们处于中的最低级别分隔符
    //当前路径,或字符串开头(根)。
    //因此,请在此处设置字符串的新结尾,从而有效地删除
    //路径的最后一部分。
    //
    G_cTmpbuf[uIdx]= 0;
    }
    //
    //否则,这只是当前路径的正常路径名
    //目录,需要将其附加到当前路径中。
    //
    否则

    //
    //测试以确保新的附加路径是何时
    //添加到当前路径中,缓冲区中有空间
    //作为完整的新路径。 它需要包括一个新的分隔符,
    //和后缀空字符。
    //
    IF (strlen(g_cTmpbuf)+ strlen(pcDirectory)+1 > sizeof (g_cCwdBuf))

    *pulRefason = name_To_Long_error;
    返回(FR_INVALID_OBJECT);
    }
    //
    //新路径正常,请添加分隔符,然后追加
    //路径的新目录。
    //
    否则

    //
    //如果尚未在根级别,则附加 a /
    //
    IF (strcmp (g_cTmpbuf,"/"))

    strcat (g_cTmpbuf,"/");
    }

    //
    //将新目录附加到路径中。
    //
    strcat (g_cTmpbuf,pcDirectory);
    }
    }

    //
    //此时,候选新目录路径位于 chTmpBuf 中。
    //尝试打开它以确保它有效。
    //
    fresult = f_opendir (&g_sDirObject,g_cTmpbuf);

    //
    //如果无法打开,则是一条错误的路径。 通知
    //用户和退货。
    //
    IF (fresult!= FR_OK)

    *pulReason = opendir_error;
    返回(fresult);
    }
    //
    //否则,它是一个有效的新路径,因此请将其复制到 CWD 中并进行更新
    //屏幕。
    //
    否则

    strncpy (g_cCwdBuf,g_cTmpBuf,sizeof (g_cCwdBuf));
    }

    //
    //成功返回。
    //
    退货(FR_OK);
    }

    //
    // Cmd_cd -此函数实现"cd"命令。 这需要争论
    //,指定要创建当前工作目录的目录。
    //路径分隔符必须使用正斜杠"/"。 CD 的参数
    //可以是以下之一:
    //* root ("/")
    //*完全指定的路径("/my/path/path/t/mydir")
    //*当前目录中的单个目录名("mydir")
    //*父目录(".")
    //它不理解相对路径,所以不要尝试类似的方法
    //这:("./my/new/path")
    //指定新目录后,它会尝试打开
    //目录以确保它存在。 如果新路径已打开
    //成功更改了当前的工作目录(cwd)
    //到新路径。
    //
    Int Cmd_CD (int argc,char *argv[])

    无符号长 ulReason;
    FRESULT 结果;

    //
    //尝试更改为命令行中提供的目录。
    //
    fresult = ChangeToDirectory(argv[1],&ulRefason );

    //
    //如果报告了错误,请尝试提供一些有用的信息。
    //
    IF (fresult!= FR_OK)

    开关(ulReason)

    案例 opendir_error:
    UARTprintf("打开新目录时出错.\n");
    休息;

    案例名称太长错误:
    UART printf("生成的路径名太长。\n");
    休息;

    默认值:
    UARTprintf("报告了无法识别的错误。\n");
    休息;
    }
    }

    //
    //返回相应的错误代码。
    //
    返回(fresult);
    }

    //
    // Cmd_pwd -此函数实现"pwd"命令。 只需打印
    //当前工作目录。
    //
    内部 Cmd_pwd (int argc,char *argv[])

    //
    //将 CWD 打印到控制台。
    //
    UARTprintf("%s\n",g_cCwdBuf);

    //
    //等待 UART 传输缓冲区清空。
    //
    // UARTFlushTx (假);

    //
    //成功返回。
    //
    返回(0);
    }

    //
    // Cmd_cat -此函数实现"cat"命令。 它读取内容
    //并将其打印到控制台。 这只能使用
    //在文本文件上。 如果它用于二进制文件,则会有一堆
    //垃圾可能会打印在控制台上。
    //
    内部 Cmd_cat (int argc,char *argv[])

    FRESULT 结果;
    无符号短 usBytesRead;

    //
    //首先,检查以确保当前路径(CWD),以及
    //文件名加上一个分隔符并以 null 结尾,将全部包含
    //适合用于容纳的临时缓冲区
    //文件名。 文件名必须完全指定,并带有路径,
    //法特基金。
    //
    IF (strlen (g_cCwdBuf)+ strlen (argv[1])+ 1 + 1 > sizeof (g_cTmpbuf))

    UARTprintf("生成的路径名太长\n");
    返回(0);
    }

    //
    //将当前路径复制到临时缓冲区,以便对其进行操作。
    //
    strcpy (g_cTmpbuf,g_cCwdBuf);

    //
    //如果尚未位于根级别,则附加一个分隔符。
    //
    IF (strcmp("/",g_cCwdBuf))

    strcat (g_cTmpbuf,"/");
    }

    //
    //最后,添加文件名以生成完全指定的文件。
    //
    strcat (g_cTmpbuf,argv[1]);

    //
    //打开文件进行阅读。
    //
    fresult = f_open (&g_sFileObject,g_cTmpbuf,fa_read);

    //
    //如果打开文件时出现问题,请返回
    //错误。
    //
    IF (fresult!= FR_OK)

    返回(fresult);
    }

    //
    //输入循环以重复读取文件中的数据并显示该数据,
    //直到文件结尾。
    //
    行动

    //
    //从文件中读取数据块。 阅读尽可能多的内容
    //在临时缓冲区中,包括后向空的空格。
    //
    fresult = f_read (&g_sFileObject,g_cTmpbuf,sizeof (g_cTmpbuf)- 1,
    &usBytesRead);

    //
    //如果读取时出错,请打印新行和
    //将错误返回给用户。
    //
    IF (fresult!= FR_OK)

    UART printf("\n");
    返回(fresult);
    }

    //
    // Null 终止为使其成为 A 而读取的最后一个块
    //可以与 printf 一起使用的空终止字符串。
    //
    G_cTmpbuf[usBytesRead]= 0;

    //
    //打印收到的文件的最后一个块。
    //
    UART printf("%s",g_cTmpbuf);

    //
    //继续读取,直到小于完整字节数
    //读。 这意味着缓冲区已到达终点。
    //
    }
    While (usBytesRead == sizeof (g_cTmpBuf)-1);

    //
    //成功返回。
    //
    返回(0);
    }

    //*************************************************
    //
    //此函数实现“write”命令。 它写入的内容
    //第一个参数指定的文件中的第二个参数。 如果是文件
    //不存在,它将使用给定的文件名创建一个新文件。
    //
    //*************************************************
    int Cmd_write (int argc,char *argv[])

    FRESULT 结果;
    无符号短 usBytesWritten;
    无符号 int i = 2;
    字符写入 Buff[CMD_BUF_SIZE]={0};

    //
    //首先,检查以确保当前路径(CWD)加上文件
    //名称加上一个分隔符并结尾为空,都适合临时
    //将用于保存文件名的缓冲区。 文件名必须为
    //完全指定,带路径,到 FatF。
    //
    IF (strlen (g_cCwdBuf)+ strlen (argv[1])+ 1 + 1 > sizeof (g_cTmpbuf))

    UARTprintf("生成的路径名太长\n");
    返回(0);
    }

    //
    //将当前路径复制到临时缓冲区,以便对其进行操作。
    //
    strcpy (g_cTmpbuf,g_cCwdBuf);

    //
    //如果尚未位于根级别,则附加一个分隔符。
    //
    IF (strcmp("/",g_cCwdBuf))

    strcat (g_cTmpbuf,"/");
    }

    //
    //附加文件名以创建完整的文件路径。
    //
    strcat (g_cTmpbuf,argv[1]);

    //
    //打开文件进行写入。
    //
    fresult = f_open (&g_sFileObject,g_cTmpbuf,fa_write | fa_create_always);

    //
    //检查错误,如果有问题,返回。
    //
    IF (fresult!= FR_OK)

    返回(fresult);
    }

    //
    //创建要写入文件的字符串。
    //
    当时(i < argc)

    strcat (writeBuff,argv[i]);

    //
    //必要时添加一个空格。
    //
    IF (I < argc-1)

    strcat (writeBuff,“”);
    }
    I++;
    }

    //
    //将字符串写入 arg[1]中的给定文件。如果文件不存在,
    //它会创建一个新文件。
    //
    fresult = f_write(&G_sFileObject, writeBuff, CMD_BUF_SIZE-1,&usBytesWritten);

    //
    //检查错误,如果有问题,返回。
    //
    IF (fresult!= FR_OK)

    返回(fresult);
    }

    //
    //完成后关闭文件。
    //
    F_CLOSE (&g_sFileObject);

    返回(0);
    }

    //*************************************************
    //
    //此函数实现“mkdir”命令。 它会创建一个新目录
    //使用参数中给出的名称。
    //
    //*************************************************
    内部
    cmd_mkdir (int argc,char *argv[])

    FRESULT 结果;
    //
    //首先,检查以确保当前路径(CWD)加上文件
    //名称加上一个分隔符并结尾为空,都适合临时
    //将用于保存文件名的缓冲区。 文件名必须为
    //完全指定,带路径,到 FatF。
    //
    IF (strlen (g_cCwdBuf)+ strlen (argv[1])+ 1 + 1 > sizeof (g_cTmpbuf))

    UARTprintf("生成的路径名太长\n");
    返回(0);
    }

    //
    //将当前路径复制到临时缓冲区,以便对其进行操作。
    //
    strcpy (g_cTmpbuf,g_cCwdBuf);

    //
    //如果尚未位于根级别,则附加一个分隔符。
    //
    IF (strcmp("/",g_cCwdBuf))

    strcat (g_cTmpbuf,"/");
    }

    //
    //添加目录名以创建新的完整文件路径
    //目录。
    //
    strcat (g_cTmpbuf,argv[1]);

    //
    //创建一个具有新文件路径的目录。
    //
    fresult = f_mkdir (g_cTmpbuf);

    //
    //检查错误,如果有问题,返回。
    //
    IF (fresult!= FR_OK)

    返回(fresult);
    }

    返回(0);
    }

    //*************************************************
    //
    //此函数实现“rm”命令。 它会删除文件或
    //参数指定的子目录。
    //
    //*************************************************
    内部
    cmd_rm (int argc,char *argv[])

    FRESULT 结果;

    //
    //首先,检查以确保当前路径(CWD)加上文件
    //名称加上一个分隔符并结尾为空,都适合临时
    //将用于保存文件名的缓冲区。 文件名必须为
    //完全指定,带路径,到 FatF。
    //
    IF (strlen (g_cCwdBuf)+ strlen (argv[1])+ 1 + 1 > sizeof (g_cTmpbuf))

    UARTprintf("生成的路径名太长\n");
    返回(0);
    }

    //
    //将当前路径复制到临时缓冲区,以便对其进行操作。
    //
    strcpy (g_cTmpbuf,g_cCwdBuf);

    //
    //如果尚未位于根级别,则附加一个分隔符。
    //
    IF (strcmp("/",g_cCwdBuf))

    strcat (g_cTmpbuf,"/");
    }

    //
    //附加文件/子目录名称以生成完全指定的路径。
    //
    strcat (g_cTmpbuf,argv[1]);

    //
    //取消要删除的文件或子目录的链接。
    //
    fresult = f_unlink (g_cTmpbuf);

    //
    //检查错误,如果有问题,返回。
    //
    IF (fresult!= FR_OK)

    返回(fresult);
    }

    //
    //成功返回。
    //
    返回(0);
    }

    //
    // Cmd_help -此函数实现“帮助”命令。 它打印出一个简单的
    //可用命令的列表,并附有简要说明。
    //
    内部
    cmd_help (int argc,char *argv[])

    tCmdlinEntry *倒数;

    //
    //打印一些标题文本。
    //
    UART printf("\n 可用命令\n");
    UARTprintf("------------ \n");

    //
    //指向命令表的开头。
    //
    pentrry =&g_psCmd 表[0];

    //
    //输入循环以读取命令表中的每个条目。 。
    //命令名称为 NULL 时,已到达表的末尾。
    //
    While (pentry->pcCmd)(倒数第二次)

    //
    //打印命令名称和简短说明。
    //
    UART printf("%s%s\n",pentry->pcCmd,pentry->pcHelp);

    //
    //前进到表中的下一个条目。
    //
    槟城++;
    }

    //
    //成功返回。
    //
    返回(0);
    }

    //
    //这是包含命令名称,实现函数,
    //和简要说明。
    //
    tCmdline 环境 g_psCmdlet[]=

    {“帮助”,Cmd_help,“:显示命令列表”},
    {"h",Cmd_help,“:帮助别名”},
    {“?”,Cmd_help,“:帮助别名”},
    {“ls”,Cmd_ls,“:显示文件列表”},
    {"chdir",Cmd_cd,“:更改目录”},
    {“CD”,Cmd_cd,“:chdir 的别名”},
    {“pwd”,Cmd_pwd,“:显示当前工作目录”},
    {“cat”,Cmd_cat,“:显示文本文件的内容”},
    {"write",Cmd_write,“:写入文件。 如果文件不存在,则创建一个",
    {"mkdir",Cmd_mkdir,":创建新的文件目录"},
    {"rm",Cmd_rm,":删除文件或目录"},
    { 0,0,0}
    };

    //
    //__error__-驱动程序库中调用的错误例程
    //遇到错误。
    //
    #ifdef 调试
    无效
    __error__(字符*pcFilename,无符号长 ulLine)

    }
    #endif

    //
    //配置 UART -配置 UART 及其引脚。 这必须被称为
    //在 UARTprintf()之前。
    //
    无效
    配置 UART (void)

    //
    //启用 UART0
    //
    SysPeripheralEnable (sysctl_Periph_SCI1);

    //
    //为 UART 模式配置 GPIO 引脚。
    //
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO28 = 0;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO28 = 3;
    GpioCtrlRegs.GPADIR.bit.GPIO28 = 0;

    GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1;
    GpioCtrlRegs.GPAPUD.bit.GPIO29 = 0;
    GpioCtrlRegs.GPADIR.bit.GPIO29 = 1;
    EDIS;

    //
    //初始化控制台 I/O 的 UART
    //
    UART 标准配置(0,115200,SystlLowSpeedClockGet (SYSTEM_CLOCK_SPEED));
    }

    //
    // Main -执行初始化,然后向运行命令处理循环
    //从控制台读取命令。
    //
    内部
    主(无效)

    内部状态;
    FRESULT 结果;

    //
    //初始化系统控制
    //
    InitSysCtrl();

    #ifdef 闪烁
    //
    //将时间关键代码和闪存设置代码复制到 RAM
    //这包括以下函数:InitFlash();
    //函数 LoadStart,RamfunctsLoadSize 和 RamfunctsRunStart
    //符号由链接器创建。 请参阅设备的.cmd 文件。
    //
    Memcpy (&RamfunctsRunStart,&RamfunctsLoadStart,(size_t)&RamfunctsLoadSize);

    //
    //调用闪存初始化以设置闪存等待状态
    //此函数必须驻留在 RAM 中
    //
    InitFlash();
    #endif

    //
    //初始化中断控制器和矢量表
    //
    InitPieCtrl();
    InitPieVectTable();

    //
    //将系统刻度设置为每秒触发100次。
    //
    SysTickInit();
    SysTickPeriodSet (SysCTLClockGet (SYSTEM_CLOCK_SPEED)/100);
    SysTickIntRegister (SysTickHandler);
    SysTickIntEnable();
    SysTickEnable();

    //
    //启用中断
    //
    IntMasterEnable();

    //
    //为调试输出配置 UART0。
    //
    配置 UART();

    //
    //向用户打印问候语。
    //
    UARTprintf("\n\nSD 卡示例程序\n");
    UARTprintf("类型\'帮助\'以获得帮助。\n");

    //
    //使用逻辑磁盘0装载文件系统。
    //
    fresult = f_mount (0,&g_sFatf);
    IF (fresult!= FR_OK)

    UARTprintf("f_mount error:%s\n", StringFromResult (fresult ));
    退货(1);
    }

    //
    //输入一个(几乎)无限循环,用于读取和处理来自的命令
    //用户。
    //
    While (1)(同时)

    //
    //向控制台打印提示。 显示 CWD。
    //
    UARTprintf("\n%s>",g_cCwdBuf);

    //
    //从用户处获取一行文本。
    //
    UART (g_cCmdbf,sizeof (g_cCmdbf));

    //
    //将命令行从用户传递到命令处理器。
    //它将被解析并执行有效的命令。
    //
    nStatus = CmdLineProcess (g_cCmdbf);

    //
    //处理错误命令的情况。
    //
    IF (nStatus = CMDLINE_BID_CMD)

    UARTprintf("错误的命令!\n");
    }
    //
    //处理过多参数的情况。
    //
    否则,如果(nStatus == CMDLINE_To_many_args)

    UARTprintf("命令处理器的参数太多!\n");
    }

    //
    //否则该命令被执行。 打印错误
    //如果返回了一个代码。
    //
    否则,如果(nStatus!= 0)

    UART printf("命令返回错误代码%s\n",
    StringFromResult ((FRESULT) nStatus);
    }
    }
    }

    //
    //文件结尾
    //

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

    我只是快速搜索了这个“无源文件,无事可做”错误,它似乎通常与生成命令中的语法错误有关,如额外的引号或类似的内容。

    您能否检查构建控制台输出并查找类似的内容? 特别是以“C:\/ti/Ccs1110/[...]/cl2000”开头的行

    惠特尼