#include "soft_sdcard.h" #include "ff.h" #include "hard_sdio_sd.h" #include "my_math.h" #include "soft_delay.h" #include "soft_time.h" #include #include #include // 掉hpm的sd fatfs库 /* //==========================连续写入测试============================= WriteBuffer字节 写入速度 写固定字节数 写大数据块 512 475kb 写512字节用时1052us 写2*1024*1024字节用时4310us 1024 563kb 写1024字节用时1775us 写2*1024*1024字节用时3637us 2048 1280kb 写2048字节用时1562us 写2*1024*1024字节用时1600us 4096 2528KB 写4096字节用时1582us 写2*1024*1024字节用时810us /////////////=============实际测试==非连续写入==写512字节用时平均4500us========问题出在哪里???? 实际测试 正常记录过程中拔掉TF卡不会造成死机。f_write之前会检查系统,如果CARD_ERR会直接返回。且不耗时间,直接返回。 不连续记录时,每次写512字节用时4000us。写5120字节用时5000us。。。所以猜测写操作的时间主要浪费在了数据发送完成后的写入环节。。 */ #if 0 /** ****************************************************************************** * 定义变量 ****************************************************************************** */ FATFS fs; /* FatFs文件系统对象 */ FIL fnew_data, fnew_log; /* 文件对象 */ FRESULT res_sd; /* 文件操作结果 */ UINT frnum; /* 文件成功读数量 */ UINT fwnum; /* 文件成功写数量 */ // BYTE ReadBuffer[_MAX_SS] = {0}; /* 读缓冲区 */ // BYTE WriteBuffer[_MAX_SS] = {0}; /* 写缓冲区*/ BYTE work[FF_MAX_SS] = {0}; /* 工作区 (larger is better for processing time) */ DIR logdir; DIR posdir; FILINFO fno; int file_num = 0; // FATFS文件名不区分大小写。默认大写。 const char *logpath = "LOG"; const char *pospath = "POS"; static uint8_t _sd_init_ok = 0; uint8_t sdcard_initok(void) { return _sd_init_ok; } /** * @brief 初始化 SD 卡 * @param init_type * @arg 0 初始化 SD 卡, 1 格式化 SD 卡 */ void sdcard_inital(uint8_t init_type) { //while ((SD_Init())) // 检测不到SD卡 //{ // printf("SD CARD ERR \n"); // delay_ms(600); //} //SDIO_NvicConfig(); //// SDIO方式挂载文件系统,文件系统挂载时会对SDIO设备初始化 //res_sd = f_mount(&fs, "", 1); ///*----------------------- 格式化测试 ---------------------------*/ ///* 如果没有文件系统就格式化创建创建文件系统 */ //if (res_sd == FR_NO_FILESYSTEM || init_type == 1) //{ // /* 格式化 */ // res_sd = f_mkfs("", FM_ANY, 0, work, sizeof(work)); // if (res_sd == FR_OK) // { // /* 格式化后,先取消挂载 */ // res_sd = f_mount(NULL, "", 1); // /* 重新挂载 */ // res_sd = f_mount(&fs, "", 1); // } // else // { // // 格式化失败。》》 // printf("sd card format fail!\n"); // while (1) // ; // } //} //else if (res_sd != FR_OK) //{ // // SD卡挂载文件系统失败,可能原因:SD卡初始化不成功。\r\n"); // printf("sd card mount fail!\n"); // while (1) // ; //} //else //{ // // 文件系统挂载成功,可以进行读写测试\r\n"); //} //// 创建文件夹 //res_sd = f_mkdir(logpath); //res_sd = f_mkdir(pospath); //// 检查是否存在LOG文件 //f_open(&fnew_data, "LOG/LOG_FLY.DAT", FA_CREATE_NEW); //f_close(&fnew_data); //DWORD nclst; //unsigned long free_size = 0; //FATFS *fs_p = &fs; //// 检查剩余容量 //res_sd = f_getfree("", &nclst, &fs_p); //free_size = nclst * fs_p->csize / 2; //// 打开log文件夹, 读下一个的文件 //res_sd = f_opendir(&logdir, logpath); //res_sd = f_readdir(&logdir, &fno); //// 如果剩余容量小于96MB, 删除部分数据文件, 防止写满 //while (free_size < 96 * 1024) //{ // if (fno.fname[0] != 'L') // { // char datafile_path[20] = ""; // // 拼接文件路径 // strcat(datafile_path, logpath); // strcat(datafile_path, "/"); // strcat(datafile_path, fno.fname); // // 删除一个文件 // f_unlink(datafile_path); // } // // 再读一下剩余的容量是否够用 // res_sd = f_getfree("", &nclst, &fs_p); // free_size = nclst * fs_p->csize / 2; // // 读下一个文件 // res_sd = f_readdir(&logdir, &fno); //} //_sd_init_ok = 1; //// 关闭文件夹 //res_sd = f_closedir(&logdir); } #endif