Không thể đọc tệp lớn hơn 2K trong FatFS


7

Tôi đang đọc một tệp từ SPI Flash với hệ thống tệp FATFS, trên nền tảng STM32F103 chạy FreeRTOS. Tôi có thể đọc thành công Tệp có kích thước nhỏ hơn 2048, nhưng nếu đọc tệp tệp có kích thước lớn hơn 2048, (Khi tôi đang đọc trong các đoạn 128 byte), nó chỉ đọc tối đa 2048 byte và f_read trả về lỗi 'FR_INT_ERR' khi Tệp con trỏ di chuyển đến vị trí trên 2048 byte.

Dưới đây trong mã của tôi để đọc thử viết. f_size được hiển thị kích thước tập tin chính xác. Nhưng khi tôi đọc, nó báo lỗi, Nếu tôi thực sự chạy vòng lặp cho đến hết tệp để đọc dữ liệu, nó luôn trả về đoạn cuối cùng trước 2048 byte lặp đi lặp lại.

FRESULT xRes;
FIL xFile;
const char cWBuffer[] = "Hello FAT World! 0123456789abcdef";
char cRBuffer[128]

xRes = f_mount(0, &s_xVolume);
printf("\r\n mount result %d successful!",xRes);

#ifdef FAT_MAKEFS_TEST
    // this delay is to prevent the FAT corruption after a systenm reset.
    Delay_us( 200 );

    printf("\r\n MAKE FS Test");
    printf("\r\n format the ext FLASH");
    printf("\r\n please wait...");
    xRes = f_mkfs(0, SFD_FORMAT, 4096 *10 );
    printf("\r\n Format result : %d ",xRes);
    assert(xRes == FR_OK);
#endif

#ifdef FAT_WRITE_TEST
    Delay_us( 1000 );

    printf("\r\n WRITE Test");
    printf("\r\n open file: W+CA");
    xRes = f_open(&xFile, filename, FA_WRITE|FA_CREATE_ALWAYS);
    printf("\r\n Open result : %d ",xRes);
    assert(xRes == FR_OK);

    printf("\r\n write file");
    for(i=0;i<1024;i++)
    {
        xRes = f_write(&xFile, cWBuffer, strlen(cWBuffer), &n);
        //printf("\r\n Write result : %d, bytes = %d ",xRes,n);
        assert(xRes == FR_OK);
        //assert(n == strlen(cWBuffer));
    }

    printf("\r\n close file");
    xRes = f_close(&xFile);
    assert(xRes == FR_OK);

#endif

#ifdef FAT_READ_TEST
    Delay_us( 100 );

    printf("\r\n READ Test");
    printf("\r\n open file: R+OE");
    xRes = f_open(&xFile, filename, FA_READ|FA_OPEN_EXISTING);
    printf("\r\n Open result : %d ",xRes);
    assert(xRes == FR_OK);

    fs = f_size(&xFile);

    printf("\r\n read file size = %d",fs);
    i=0;
    fs = f_size(&xFile);
    while(i<fs)
    {
        xRes = f_read(&xFile, cRBuffer, sizeof(cRBuffer), &m);
        printf("\r\n Read result : %d, bytes read = %d, i =%d ",xRes,m,tread);
        tread += m;
        assert(xRes == FR_OK);
        //assert(m == strlen(cWBuffer));
    }
    printf("\r\n Total bytes read = %d",tread);
    printf("\r\n close file");
    printf("\r\n file content:");
    printf("%s :\n",cRBuffer);
    xRes = f_close(&xFile);
    assert(xRes == FR_OK);
#endif
printf("\r\n test success!!!");

1
Bạn cần cung cấp thêm thông tin, các đoạn mã ...
Dzarda

Xin chào, tôi đã thêm đoạn mã có thể giúp ....
CAK

2
Nó dường như là một ERRor INTernal. Có lẽ bạn có thể thử định dạng bộ nhớ flash và thử lại. Một tùy chọn khác là tăng kích thước ngăn xếp cho nhiệm vụ này; nó có thể sắp hết không gian
Roger C.

Câu trả lời:


1

Tôi không thể nói với cuộc gọi FreeRTOS f_read (), nhưng đối với một số hệ điều hành, f_read () chỉ có thể đọc được ranh giới kích thước cung của phương tiện cơ bản, thường là 512 hoặc 2048 byte. Để đọc nhiều dữ liệu hơn thế, lệnh gọi f_read () sẽ cần triển khai chức năng thu thập, đọc dữ liệu từ nhiều lĩnh vực.

Chúng tôi đã thấy hành vi này trong nuttx và tôi nghi ngờ FreeRTOS cũng làm như vậy. Để đọc một tệp lớn hơn, hãy thử đọc nó trong các khối có kích thước với phương tiện truyền thông của bạn.


0

Tôi tin rằng vấn đề có thể là bạn có cùng một hướng dẫn "fs = f_size ..." hai lần. Một trước và một sau khi đọc hướng dẫn tập tin in. Nếu đây không phải là vấn đề, vậy thì bạn lấy thông tin "kích thước tệp" ở đâu?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.