FATFS檔案讀寫接口測試
建立database任務
void StartTaskDataBase(void const *argument)
{
uint8_t retval = 0;
MX_FATFS_Init();
for(;;) {
osEvent oe = osMessageGet(myQueueDataBaseHandle, osWaitForever);
if (oe.status == osEventMessage) {
db_msg_t *pv = (db_msg_t *)oe.value.p;
if (pv) {
switch(pv->ac) {
case DB_READ:
dbg_printf("DB_READ.\r\n");
db_read();
break;
case DB_WRITE:
dbg_printf("DB_WRITE.\r\n");
db_write();
break;
case DB_UPDATE:
dbg_printf("DB_UPDATE.\r\n");
db_test();
break;
case DB_FORMAT:
dbg_printf("DB_FORMAT.\r\n");
retval = f_mkfs((const TCHAR *)USERPath, FM_FAT, 0, USERFatFS.win, sizeof(USERFatFS.win));
dbg_printf("f_mkfs = %d.\r\n", retval);
retval = f_mount(&USERFatFS, USERPath, 1);
dbg_printf("f_mount = %d.\r\n", retval);
break;
default:
break;
}
vPortFree(pv);
}
}
}
}
編寫讀寫測試函數, 加了一些seek, 格式化寫入等接口驗證功能
static void db_test(void)
{
FIL *fs = &USERFile;
FRESULT retval;
retval = f_open(fs, "0:test.txt", FA_READ | FA_WRITE);
if (retval == FR_NO_FILE) {
retval = f_open(fs, "0:test.txt", FA_READ | FA_WRITE | FA_CREATE_NEW);
}
dbg_printf("f_open...%d..f_size(fs)=%d.\r\n", retval, (uint32_t)f_size(fs));
if (retval == FR_OK) {
m_w_index++;
memset(wbuff, 0, sizeof(wbuff));
memset(rbuff, 0, sizeof(rbuff));
if (retval == FR_OK) {
uint32_t total_bytes, free_bytes;
exf_getfree((uint8_t *)USERPath, &total_bytes, &free_bytes);
retval = f_lseek(fs, 0);
memset(wbuff, 'v', sizeof(wbuff));
retval = f_write(fs, wbuff, sizeof(wbuff), &bw);
retval = f_printf(fs, "%04d ", m_w_index);
retval = f_lseek(fs, 3600);
retval = f_printf(fs, "total:%04dKB.free:%04dKB.\n", total_bytes, free_bytes);
retval = f_lseek(fs, 0);
retval = f_read(fs, rbuff, sizeof(rbuff) - 1, &br);
if (retval == FR_OK) {
dbg_printf("file data[%-6d]: \r\n%s\r\n", br, rbuff);
} else {
dbg_printf("f_read failed...%d..br=%d\r\n", retval, br);
}
} else {
dbg_printf("f_lseek failed...%d.\r\n", retval);
}
f_close(fs);
} else {
dbg_printf("open file failed...retval=%d.\r\n", retval);
}
}
void db_write(void)
{
FIL *fs = &USERFile;
FRESULT retval;
retval = f_open(fs, "0:test.txt", FA_WRITE | FA_READ);
if (retval == FR_NO_FILE) {
retval = f_open(fs, "0:test.txt", FA_WRITE | FA_READ | FA_CREATE_NEW);
}
dbg_printf("f_open...%d..f_size(fs)=%d.\r\n", retval, (uint32_t)f_size(fs));
if (retval == FR_OK) {
m_w_index++;
memset(wbuff, 0, sizeof(wbuff));
if (retval == FR_OK) {
retval = f_lseek(fs, f_size(fs));
int a = rand() % 25 + 65;
memset(wbuff, a, sizeof(wbuff));
retval = f_write(fs, wbuff, (sizeof(wbuff) >> 1) + 7, &bw);
if (retval == RES_OK) {
dbg_printf("file data[%010d][%04d]\r\n", (uint32_t)f_size(fs), sizeof(wbuff));
} else {
dbg_printf("f_printf failed...%d..br=%d\r\n", retval, bw);
}
} else {
dbg_printf("f_lseek failed...%d.\r\n", retval);
}
f_close(fs);
} else {
dbg_printf("open file failed...retval=%d.\r\n", retval);
}
}
通過按鍵觸發讀(button5)和寫(button4),并且列印出來, 檔案内容因為可讀性不高直接不列印了:
其中index表示sector的數量, br表示每次讀的位元組數