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.

[参考译文] CCS/PROCESSOR-SDK-AM437X:问题:将 fopen()与"rb&quot 配合使用;模式读取二进制文件

Guru**** 2952510 points

Other Parts Discussed in Thread: AM4378

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/954031/ccs-processor-sdk-am437x-problem-using-fopen-with-rb-mode-to-read-binary-file

器件型号:PROCESSOR-SDK-AM437X
主题中讨论的其他器件:AM4378

工具/软件:Code Composer Studio

我正在 开发基于"processor_sdk_rtos_AM437X_6_03_00_106"中 i2ctest 的裸机程序。我想读取256kbit 二进制文件、然后通过 i2c 将其写入 EEPROM。 我的文件操作如下:

test_file=fopen (fileName、"rb");

char* txBuf32字节 FullSpace1;

txBuf32ByteFullSpace1=(char*) malloc (2+1024*32);//+2表示2字节地址

int fSize=0;

fSize=fread (txBuf32ByteFullSpace1+2,1、1024*32、test_file);

每次 fSize <实际文件大小、因为为0x1a

我无法解决 this.it、似乎"rb"不能被 progrom 正确区分。

我甚至尝试 test_file=fopen (fileName、"Rabb");CCS 可以传递编译并对其进行调试。

CCS 版本:9.3.0

C 版本:7.3.1 (linaro)

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

    我的 PC 操作系统为 Windows。 目标是定制的 Am4378

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

    fopen 和 malloc 调用都在出现错误时返回 NULL。  您的代码应检查该条件。

    确保没有溢出堆栈或从堆内存中耗尽。   

    编写一个打开并读取简单 ASCII 文本文件的小程序。  确保它正常工作。

    请告诉我您在执行这些步骤后看到的内容。

    谢谢、此致、

    乔治

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

    这不太可能,但 malloc()需要多大的大小? 32*1024是否会溢出?

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

    ,谢谢主席先生帮助我解决我的问题。

    我听从了你的意见。 我检查我的函数 fopen()和 malloc()它们的返回值,我确定它们不是 NULL。我检查 堆大小是否为64000,我认为 它足够用于内存操作。

    这是我的实际代码:

    char* filename="../test_CAT24C256.bin";
    unsigned char * txBuf32ByteFullSpace1;
    char rxBuf32Byte[32]={0x00、};
    txBuf32ByteFullinit 1 =(unsigned char*) mams (2+1024 &*32);i
    if (txBuf32ByteFull_Parace=
    
    
    1);rxI2C_paralloc =(1);at_paraco1 =(iC_open_paralloc);iaceI2C_reams (I2C_paralloc);
    I2C_TransactionInit(&i2cTransaction);
    test_file = fopen (filename、"rb");
    if (test_file = NULL){
    UART_printf ("无法打开文件\n");
    fclose (test_file);
    I2C_Close (handle);
    返回 NULL;
    }
    fseek (test_file、0、seek_end);
    long fSize = ftell (test_file);//文件
    回卷的返回长度(test_file);//返回到 head
    UART_printf ("file_size:%d\n"、fSize);
    *(txBuf32ByteFull1=0x00;
    *、f1+aaa Space1=0=0=0321aaa
    
    ;
    if (aaa!=fSize) UART_printf ("错误读取 aaa =%d "、aaa);
    UART_printf ("读取 ok aaa =%d "、aaa); 

    它是我的封装功能的一部分。

    当我测试读取二进制文件时,我选择“rb”;测试读取.txt 文件我选择“r”

    由 UART 从 XSHELL 打印的结果为

    二进制文件

    txt 文件

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

    32*1024真的是一个大尺寸的连续内存。 因此我检查 malloc()返回值。 我还尝试使用1024字节字符数组、我的程序也不能正常工作。
    有时我甚至认为 C 语言库函数 FOPEN 是错误的、但 毫无疑问 这   是非常荒谬的。

    似乎我使用模式:rB/rB+/偶兔、函数将其视为"r"。

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

    您可能必须将文件名//测试,因为/T 可能会被解释为转义字符。

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

    确定,我将更改文件名。

    但现在,我可以打开文件。文件包含32768字节,我只能 fread() 128字节,然后关闭文件。

    此文件屏幕截图使用 Notepad++打开

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

    我在另一篇文章中应该明确指出的一点是,即使 malloc()的类型可以处理32x1024,编译器可能会使用较小的类型进行计算-因为您没有指定一个类型-并使用错误的数字。

    您可以通过在使用前将32x1024存储到变量中来检查它,并在调用 malloc()之前打印该值。

    您可以通过进行32L * 1024L 计算来解决此问题、以确保使用 long 类型进行计算。

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

    您是否使用 CCS 附带的 GCC ARM 编译器?  您是否在使用编译器随附的 RTS 库中内置的半主机功能?   

    谢谢、此致、

    乔治

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

    是的、我使用 了 CCS 附带的 GCC ARM 编译器、GCC ARM 版本为7.3.1 (linaro)。 但对不起、先生、我不知道 RTS 库的任何信息。 我认为我设置了该库的默认值、因为我不更改它。

    哦,‘先生,我今天也使用 fopen (filename,“WB”),程序将“WB”设置为“w”。因此结果文件包含许多额外的0x0d。(“w”open 在0x0a 之前添加0x0d)。

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

    噢,bro‘,我也使用 fopen (filename,“WB”),程序将“WB”设置为“w”。因此结果文件包含许多额外的0x0d。(“w”open 在0x0a 之前添加0x0d)。

    这次我还使用了一个大字符数组、没关系。结果文件大于32768字节。 只是因为"0x0d"、其他数据完全正确。

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

    额外的字符是因为窗口使用 CR/LF 作为行尾标记、而不仅仅是 LF。

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

    是的、我知道原因、但我不知道如何解决。

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

    您好!  

    您能否尝试使用 TI 编译器并查看是否有任何差异? 按如下方式创建 CCS 工程:  

    我尝试了一个简单的程序、文件 I/O 工作正常:

    #include 
    
    int main (void)
    {
    文件*fp_bin_rd;
    文件*fp_bin_wt;
    int array1[8]={1、2、3、4、5、6、7、8};
    int array2[8]={0};
    
    fp_bin_wt = fopen ("test_bin1.bin"、"WB");
    fwrite (((void *) array1、4、8、fp_bin_wt);
    fclose (fp_bin_wt);
    
    fp_bin_rd = fopen ("test_bin1.bin"、"rb");
    fread ((void *) array2、4、8、fp_bin_rd);
    fclose (fp_bin_rd);
    
    返回0;
    }
    

    此致、

    _________

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

    很抱歉、我在上一个帖子中上传的图片未显示。 请参阅随附的 CCS 工程文件。

    e2e.ti.com/.../ccs_5F00_project_5F00_fileio.docx

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

    主席先生,你是中国人吗? D:我也是中国人。所以如果可以的话我可以用中文和您交流!

    我尝试了您的建议、似乎当我使用 TI 编译器时、"WB"确实有效。 ,、我使用 TI 提供的 RTOS-SDK、默认编译器为 ARM-gcc。当我尝试将其更改为 TI 编译器时、会出现一些错误。 可以帮帮我吗?  

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

    您好!

    您能否尝试以下两种方法之一:

    1.使用 TI 编译器从头开始重新创建 CCS 工程。

    2.比较两种配置的编译器选项:Debug 和 Debug__TI。 我认为 Debug__TI 必须错过一些编译器标志。 尝试添加"-D"选项和"-I"选项、这些选项位于 Debug 中、但不在 Debug_TI 中。 例如 、-DSOC_AM437x -DEVM_AM437X -DevmAM437x -DAM43XX_family_BUILD -I":/ti/pdk_am437x_1_0_17/packages。  

    此致、

    _________

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

    我要感谢您不遗余力地为我提供帮助。我还尝试您的最后建议、使用您的代码并添加许多 include 词典;

    但是、这次我遇到另一个问题、错误信息是:"

    说明资源路径位置类型
    无法在路径'C:/ti/bios_6_76_03_01/packages;C:/ti/pdk_am437x_1_0_17/packages;C:/ti/ndk_3_61_01_01/packages;C:/ti/xdctools_3_55_02_22_core/packages;..;'上找到名为'ti.targets.arm.elf.A8Fnv'的目标:请检查目标名称的拼写以及该路径上是否存在该目标名称。 .xdchelp /I2C_MULITYExample_AM437X_GeXinTec2第10行 C/C++问题"

    然后转至 dir:C:\ti\BIOS_6_76_03_01\packages/ti\targets\arm\elf\

    我只能找到 ARM9/IArm/IM3/IM4/IR4/IR5/M3/M4… 我尝试了 ARM9,但它告诉我"

    说明资源路径位置类型
    ti.platforms.evmAM437X.Platform:构建目标 ti.targets.arm.elf.arm9与此平台不兼容。 .xdchelp /I2C_MULITYExample_AM437X_GeXinTec2第80行 C/C++问题"

    这是我第一次更改编译器,所以我可能会犯很多错误...

    SYS/BIOS 版本:BIOS_6_76_03_01

    TI 编译器版本:TI v18.12.4LTS

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

    您好!

    将现有 CCS 工程中的编译器从 GNU 编译器切换到 TI 编译器似乎效果不好。 让我们不要走这条路。

    我尝试了以下操作:

    1. 从 processor_sdk_rtos_AM437X_6_03_00_106\demos\rtos_template_app\AM437X\evmAM437x\a9\template_app\RTOS 中导入了内置 RTOS CCS 工程、但未进行任何修改。 此项目使用 GNU 7.2.1编译器。
    2. 已成功构建项目
    3. 将以下代码插入 main.c、并且验证的文件 I/O 工作正常:
      #define N 8192
      int array1[N]={1、2、3、4、5、6、7、8};//在 main ()之外定义、32k 字节
      int array2[N]={0}; //在 main()之外定义,32k 字节
      
      文件*fp_bin_rd; 文件*fp_bin_wt; int num_read; fp_bin_wt = fopen ("test_bin1.bin"、"WB"); fwrite (((void *) array1、4、N、fp_bin_wt); fclose (fp_bin_wt); fp_bin_rd = fopen ("test_bin1.bin"、"rasdfasfas"); num_read = fread ((void *) array2、4、N、fp_bin_rd); if (num_read!= N){ printf ("fread ()中出错)\n"} fclose (fp_bin_rd);

    因此、您可能遇到的问题与您的项目配置有关、尤其是之前在主题中提到的 RTS 库。

    此外、我不确定您的应用、但如果可以、您可以尝试使用 CCS 将二进制数据直接加载到存储器中。 从 CCS 中选择"Tools"选项卡、然后选择"Load Memory"。 然后提供文件路径并将文件类型指定为二进制、然后单击"完成"。 如果您的文件较大、加载可能需要很长时间、因此您可以尝试先使用较小的文件来验证。

    希望这能有所帮助。

    此致、

    _________

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

    非常感谢先生!