对于图像处理,需要数据源和储存地,而EMMC可以充当储存地,同时也可以充当数据源的作用。测试EMMC速度, 也即测试在1s内能写多少数据,或者写特定数目数据花了多长时间;对于测试可以在基于Linux测试,也可以裸机运行Fatfs库实现,本例使用后者。
Xilinx提供了预先移植好的Fatfs库,改名为Xilffs,使用这个库需要在BSP内启用Xilffs,如下步骤:
1.找到bsp的.mss文件,双击打开它;
2.点击Modi fy thisBSP’s Settings;
3.勾选xilffs;
4.点击OK
然后就可以编写操作EMMC的代码了,使用库需要包含ff.h头文件,SDK在启用Xilffs后会自动将Xilffs的相关头文件包含进他们的include路径。
测试步骤:
- 1. 挂载EMMC,使用f_mount,其中Path使用”0:/”,因为CZ3EG板卡EMMC放在了SD1,如果是SD2,则使用”1:/”;
- 2. 格式化EMMC成FAT32格式,这一步可选,板卡出厂预先烧了Linux系统,其中EMMC被用作ROOTFS,使用的格式不是FAT系列,直接使用fopen会报错;
- 3. 使用f_open在EMMC上建立一个文件,设置权限可读写;
- 4. 使用Get_time获取当前时间
- 5. 使用f_write写特定数量数目,我写入0x1000000byte;
- 6. 使用Get_time获取当前时间,计算速度
- 7. 使用Get_time获取当前时间
- 8. 使用f_read写特定数量数目,我写入0x1000000byte;
- 9. 使用Get_time获取当前时间,计算速度
实验结果如下
根据结果,读速度约为90Mbyte,写约为20M;
本次代码如下:
- #include
- #include "platform.h"
- #include "xil_printf.h"
- #include "ff.h"
- #include "xtime_l.h"
-
- FATFS fatfs;
- int main() {
- FIL fil;
- FRESULT rc;
- UINT bw;
-
- BYTE work[FF_MAX_SS];
-
- XTime tStart;
- XTime tEnd;
- XTime tDiff;
- double tPerfS;
-
- init_platform();
- rc = f_mount(&fatfs, "0:/", 0);
-
- rc = f_mkfs("0:/", FM_FAT32, 0, work, sizeof work);
- if (rc != FR_OK) {
- return 1;
- }
-
- int t = 20;
- while (t--) {
- rc = f_open(&fil, "SD_TEST.txt", FA_CREATE_ALWAYS | FA_WRITE | FA_READ);
- if (rc) {
- xil_printf("ERROR : f_open returned %drn", rc);
- return 1;
- }
- rc = f_lseek(&fil, 0);
- if (rc) {
- xil_printf("ERROR : f_lseek returned %drn", rc);
- return 1;
- }
-
- XTime_GetTime(&tStart);
-
- rc = f_write(&fil, (void*) 0x00000000, 0x1000000, &bw);
- if (rc) {
- xil_printf("ERROR : f_write returned %drn", rc);
- return 1;
- }
-
- XTime_GetTime(&tEnd);
- tDiff = tEnd - tStart;
- /* Convert tPerf into seconds */
- tPerfS = (1.0 * tDiff / (1.0 * COUNTS_PER_SECOND));
- xil_printf(
- "SD Write bandwidth: %d MB/s, Time: %d ms, Actual write bytes: %dnr",
- (int) ((0x1000000 * 1.0 / tPerfS) / 1024 / 1024),
- (int) (tPerfS * 1000), bw);
- rc = f_lseek(&fil, 0);
-
- XTime_GetTime(&tStart);
- rc = f_read(&fil, (void*) 0x10000000, 0x1000000, &bw);
- if (rc) {
- xil_printf("ERROR : read returned %drn", rc);
- return 1;
- }
- XTime_GetTime(&tEnd);
- tDiff = tEnd - tStart;
- /* Convert tPerf into seconds */
- tPerfS = (1.0 * tDiff / (1.0 * COUNTS_PER_SECOND));
- //printf("SD Write bandwidth: %f MB/s, Time: %f snr", (0x1000000*1.0/tPerfS)/1024/1024, tPerfS);
- xil_printf(
- "SD Read bandwidth: %d MB/s, Time: %d ms, Actual read bytes: %dnr",
- (int) ((0x1000000 * 1.0 / tPerfS) / 1024 / 1024),
- (int) (tPerfS * 1000), bw);
-
- rc = f_close(&fil);
- if (rc) {
- xil_printf("ERROR : f_close returned %drn", rc);
- return 1;
- }
- }
- cleanup_platform();
- return 0;
- }
复制代码
|