硬汉嵌入式论坛

 找回密码
 立即注册
查看: 144|回复: 10
收起左侧

[ThreadX全家桶] AT32F403AVGT7移植FILEX时报错

[复制链接]

2

主题

6

回帖

12

积分

新手上路

积分
12
发表于 2025-9-17 10:42:58 | 显示全部楼层 |阅读模式
使用闪迪的32G SDHC FAT32的卡,发现使用SD CARD FORMATTER格式化后总会有4MB的保留分区,然后物理扇区0和逻辑扇区0不是同一个,使用Filex的fx_media_open函数时,读取ROOT分区时需要指定实际的物理分区地址,使用winhex打开查看是8192扇区,偏移地址是0X400000;这样执行到_fx_media_open函数的第529行FAT_entry的结果为0而非正常判断跳出异常所需的0x0FFFFFF8的大小,请教各位大神指点迷津
/* Determine if a 32-bit FAT is present. If so, calculate the size of the root directory (since
       it is variable in FAT32.  */
    if (media_ptr -> fx_media_32_bit_FAT == FX_TRUE)
    {

        /* Root First cluster starts from at least cluster 2, or higher. */
        if (media_ptr -> fx_media_root_cluster_32 < FX_FAT_ENTRY_START)
        {
            return(FX_MEDIA_INVALID);
        }

        /* Calculate logical number of root dir sector.  */
        media_ptr -> fx_media_root_sector_start = media_ptr -> fx_media_data_sector_start +
            (media_ptr -> fx_media_root_cluster_32 - FX_FAT_ENTRY_START) *
            media_ptr -> fx_media_sectors_per_cluster;

        /* Calculate maximum possible value for fx_media_root_directory_entries */
        i = 0;
        for (cluster_number = media_ptr -> fx_media_root_cluster_32;;)
        {

            status =  _fx_utility_FAT_entry_read(media_ptr, cluster_number, &FAT_entry);
            i++;
            /* Determine if the read was successful.  */
            if (status != FX_SUCCESS)
            {

                /* Build the "uninitialize" I/O driver request.  */
                media_ptr -> fx_media_driver_request =      FX_DRIVER_UNINIT;
                media_ptr -> fx_media_driver_status =       FX_IO_ERROR;

                /* If trace is enabled, insert this event into the trace buffer.  */
                FX_TRACE_IN_LINE_INSERT(FX_TRACE_INTERNAL_IO_DRIVER_UNINIT, media_ptr, 0, 0, 0, FX_TRACE_INTERNAL_EVENTS, 0, 0)

                /* Call the specified I/O driver with the uninitialize request.  */
                (media_ptr -> fx_media_driver_entry) (media_ptr);

                return(FX_FAT_READ_ERROR);
            }

            if ((cluster_number == FAT_entry) || (i > media_ptr -> fx_media_total_clusters))
            {

                /* Build the "uninitialize" I/O driver request.  */
                media_ptr -> fx_media_driver_request =      FX_DRIVER_UNINIT;
                media_ptr -> fx_media_driver_status =       FX_IO_ERROR;

                /* If trace is enabled, insert this event into the trace buffer.  */
                FX_TRACE_IN_LINE_INSERT(FX_TRACE_INTERNAL_IO_DRIVER_UNINIT, media_ptr, 0, 0, 0, FX_TRACE_INTERNAL_EVENTS, 0, 0)

                /* Call the specified I/O driver with the uninitialize request.  */
                (media_ptr -> fx_media_driver_entry) (media_ptr);

                return(FX_FAT_READ_ERROR);
            }
            if (FAT_entry >= FX_RESERVED_1_32)
            {
                break;
            }
            cluster_number = FAT_entry;
        }

        /* Calculate the number of directory entries.  */
        media_ptr -> fx_media_root_directory_entries =  (i * media_ptr -> fx_media_sectors_per_cluster *
                                                         media_ptr -> fx_media_bytes_per_sector) / FX_DIR_ENTRY_SIZE;
    }


回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-9-17 10:44:25 | 显示全部楼层
/* Determine if a 32-bit FAT is present. If so, calculate the size of the root directory (since
       it is variable in FAT32.  */
    if (media_ptr -> fx_media_32_bit_FAT == FX_TRUE)
    {

        /* Root First cluster starts from at least cluster 2, or higher. */
        if (media_ptr -> fx_media_root_cluster_32 < FX_FAT_ENTRY_START)
        {
            return(FX_MEDIA_INVALID);
        }

        /* Calculate logical number of root dir sector.  */
        media_ptr -> fx_media_root_sector_start = media_ptr -> fx_media_data_sector_start +
            (media_ptr -> fx_media_root_cluster_32 - FX_FAT_ENTRY_START) *
            media_ptr -> fx_media_sectors_per_cluster;

        /* Calculate maximum possible value for fx_media_root_directory_entries */
        i = 0;
        for (cluster_number = media_ptr -> fx_media_root_cluster_32;;)
        {

            status =  _fx_utility_FAT_entry_read(media_ptr, cluster_number, &FAT_entry);
            i++;
            /* Determine if the read was successful.  */
            if (status != FX_SUCCESS)
            {

                /* Build the "uninitialize" I/O driver request.  */
                media_ptr -> fx_media_driver_request =      FX_DRIVER_UNINIT;
                media_ptr -> fx_media_driver_status =       FX_IO_ERROR;

                /* If trace is enabled, insert this event into the trace buffer.  */
                FX_TRACE_IN_LINE_INSERT(FX_TRACE_INTERNAL_IO_DRIVER_UNINIT, media_ptr, 0, 0, 0, FX_TRACE_INTERNAL_EVENTS, 0, 0)

                /* Call the specified I/O driver with the uninitialize request.  */
                (media_ptr -> fx_media_driver_entry) (media_ptr);

                return(FX_FAT_READ_ERROR);
            }

            if ((cluster_number == FAT_entry) || (i > media_ptr -> fx_media_total_clusters))
            {

                /* Build the "uninitialize" I/O driver request.  */
                media_ptr -> fx_media_driver_request =      FX_DRIVER_UNINIT;
                media_ptr -> fx_media_driver_status =       FX_IO_ERROR;

                /* If trace is enabled, insert this event into the trace buffer.  */
                FX_TRACE_IN_LINE_INSERT(FX_TRACE_INTERNAL_IO_DRIVER_UNINIT, media_ptr, 0, 0, 0, FX_TRACE_INTERNAL_EVENTS, 0, 0)

                /* Call the specified I/O driver with the uninitialize request.  */
                (media_ptr -> fx_media_driver_entry) (media_ptr);

                return(FX_FAT_READ_ERROR);
            }
            if (FAT_entry >= FX_RESERVED_1_32)
            {
                break;
            }
            cluster_number = FAT_entry;
        }

        /* Calculate the number of directory entries.  */
        media_ptr -> fx_media_root_directory_entries =  (i * media_ptr -> fx_media_sectors_per_cluster *
                                                         media_ptr -> fx_media_bytes_per_sector) / FX_DIR_ENTRY_SIZE;
    }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-9-17 10:55:04 | 显示全部楼层
oliver 发表于 2025-9-17 10:44
/* Determine if a 32-bit FAT is present. If so, calculate the size of the root directory (since
    ...

如果在电脑端使用SD卡联盟的小软件格式化好后,FILEX读写操作正常不。

楼主这个FILEX的文件系统格式API,我确实没调用过。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-9-17 11:10:18 | 显示全部楼层
eric2013 发表于 2025-9-17 10:55
如果在电脑端使用SD卡联盟的小软件格式化好后,FILEX读写操作正常不。

楼主这个FILEX的文件系统格式AP ...

是sd卡挂载的第一步,status = fx_media_open(&sd_disk, "SD DISK", (VOID (*)(FX_MEDIA *))fx_at32_sd_driver, 0, (VOID *)sdio_data_buffer, sizeof(sdio_data_buffer));这个函数调用_fx_media_open,然后这个函数会周期调用到到自己写的fx_at32_driver函数(仿照按硬汉哥教程写的),FX_DRIVER_INIT执行成功后到case:FX_DRIVER_BOOT_READ函数正常后到下一步前,卡在的FILEX的这个_fx_media_open函数的那个判断条件那行;SDIO读取扇区的驱动是正常的,可以正常读
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-9-17 12:41:46 | 显示全部楼层
oliver 发表于 2025-9-17 11:10
是sd卡挂载的第一步,status = fx_media_open(&sd_disk, "SD DISK", (VOID (*)(FX_MEDIA *))fx_at32_sd_d ...

这个软件格式化下试试

SD卡联盟发布的SD/SDHC/SDXC格式化小软件V5.0.1
https://forum.anfulai.cn/forum.p ... 6181&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-9-17 13:43:29 | 显示全部楼层
eric2013 发表于 2025-9-17 12:41
这个软件格式化下试试

SD卡联盟发布的SD/SDHC/SDXC格式化小软件V5.0.1

就是用的这个格式化的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-9-17 15:48:30 | 显示全部楼层
oliver 发表于 2025-9-17 13:43
就是用的这个格式化的

最后两个地方看下
1、换个SD卡测试。
2、你当前的硬件环境,测试过其它文件系统,比如fatfs是否正常。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-9-17 16:36:18 | 显示全部楼层
eric2013 发表于 2025-9-17 15:48
最后两个地方看下
1、换个SD卡测试。
2、你当前的硬件环境,测试过其它文件系统,比如fatfs是否正常。

1.分别换了2个不同型号的32GB的TF卡,和一个4GB的TF卡,同样格式化在FILEX的出现的问题都是同样的问题2.FatFs下测试都是正常的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-9-17 17:00:45 | 显示全部楼层
oliver 发表于 2025-9-17 16:36
1.分别换了2个不同型号的32GB的TF卡,和一个4GB的TF卡,同样格式化在FILEX的出现的问题都是同样的问题2.F ...

任务栈大小,还有一些需要的内存数组大小加大也测试过了吧,这个也排除了之后,就得排除接口驱动实现了。
回复

使用道具 举报

2

主题

6

回帖

12

积分

新手上路

积分
12
 楼主| 发表于 2025-9-17 17:10:28 | 显示全部楼层
eric2013 发表于 2025-9-17 17:00
任务栈大小,还有一些需要的内存数组大小加大也测试过了吧,这个也排除了之后,就得排除接口驱动实现了。

任务栈大小4KB没到溢出的情况,内存数组大小从512字节到1024、2048、8192字节都试过了,不影响报错运行的位置;直接底层驱动按扇区读写是正常的,使用Fatfs文件系统读写也是正常的,这说明底层驱动是没问题的;读取出来的DOS Boot Recorde内容也是与winhex读取的一样,很奇怪的问题,那个判断条件所需的数值在winhex显示的FAT 1和FAT 2的对应位置也是正常的数值,但是filex函数返回的结果是0,应该就在这的问题,暂时解决不了,或许换个旧版本的Filex?后续找到解决办法会更新在这帖子下,感谢硬汉的解答
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
118308
QQ
发表于 2025-9-18 11:25:05 | 显示全部楼层
oliver 发表于 2025-9-17 17:10
任务栈大小4KB没到溢出的情况,内存数组大小从512字节到1024、2048、8192字节都试过了,不影响报错运行的 ...

最后一个地方,之前使用和我的FileX一样的版本源码试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-9-26 09:26 , Processed in 0.050483 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表