天天看點

記錄一個真實項目的開發曆程(4)--檔案讀寫測試 for debugFATFS檔案讀寫接口測試

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表示每次讀的位元組數

記錄一個真實項目的開發曆程(4)--檔案讀寫測試 for debugFATFS檔案讀寫接口測試