【发布时间】:2021-08-03 00:20:06
【问题描述】:
我的一个客户要求我播放 SD 卡中的声音。但是文件选择应该是随机的,因为该设备是用来吓唬野外的动物(动物不应该习惯于声音模式)。我可以通过
生成随机数void RNG_Generate_Numbers()
{
HAL_RNG_GenerateRandomNumber(&hrng, &random_number.random_number1);
HAL_RNG_GenerateRandomNumber(&hrng, &random_number.random_number2);
}
我可以通过
来统计文件void File_Find_File(file_manager_t *file_manage)
{
file_manage->file_result = f_readdir(&file_manage->file_direction, &file_manage->file_info);
if( (file_manage->file_result != FR_OK) || (file_manage->file_info.fname[0] == '\0') )
{
file_manage->file_counter = 0;
}
else
{
++file_manage->file_counter;
}
}
到这里为止一切都很好。但是当涉及到随机选择文件时,我找不到任何方法来做到这一点。任何帮助表示赞赏。
编辑:这是file_manager结构;
typedef struct __file_manager /* struct tag */
{
FATFS drive_handler;
FIL file_handler;
FRESULT file_result;
uint8_t file_disk_status;
DIR file_direction;
FILINFO file_info;
uint8_t file_rx_buffer[512];
char file_current_dir[256];
uint32_t file_bytes_read;
uint32_t file_bytes_write;
size_t file_counter;
}file_manager_t ;
【问题讨论】:
-
有什么理由不能将所有文件塞进一个目录并重命名它们?如果答案是否定的,只需重命名文件,使文件名是数字序列并使用
sprintf(file_name, "%d.mp3", rand() % n_files),或在您的系统上最接近该方法的任何内容。 -
这可能是特定于操作系统和特定于硬件的。
-
它是基于 MCU 的应用程序。系统上没有操作系统。我正在使用FATFS来操作文件系统。
-
@Paul 我几乎也是这么想的。但是音频文件是由用户决定的,用户容易出错……
-
这么多的可能性!保罗的建议是最简单的。如果您有足够的 RAM,则加载所有名称并从该列表中选择。如果你的sd卡很快,那么每次做reservoir sampling
标签: c algorithm random filesystems