本篇介绍如何用Xilinx SDK创建的裸机应用程序在Zedboard上运行并将数据写入到SD卡的文件中(以txt文档为例)。
目录
本文执行的操作,是建立在已经创建好硬件工程(主要是SD卡端口的设置)和创建好板级驱动工程(BSP)的基础上。此部分操作在文章Zedboard(二)使用Vivado+SDK开发嵌入式应用程序——实例一:Hello World和Zedboard(三)嵌入式应用程序开发——实例二:从SD卡读取dat文件中已经有所介绍,这里不再赘述。
要实现Zedboard对SD卡的读写,必须导入FatFs库(SDK中叫做xilffs)。
实现数据写入有两个常用的函数:
1.f_write()
2.f_printf()
1、 f_write() 函数是从指定的内存地址开始,写入指定字节数的数据到指定文件中。例:
fr = f_open(&fp_out,"output.txt",FA_WRITE);//打开名为output.txt文件
fr = f_write(&fp_out,newdata,(sizeof(int)*666),&br);//从newdata内存地址开始写666个int数据到output.txt中
*这里笔者是先在SD卡根目录下创建好输出文件,如果是在没有创建文件的情况下用f_open()需要将FA_WRITE改为FA_OPEN_ALWAYS
2、f_printf() 函数是输出指定字符串数据到指定文件中(和C语言中的fprintf()相似),本文主要介绍这个函数的用法。例:
int a=8;
double b=7.00;
fr = f_open(&fp_out,"output.txt",FA_WRITE);//打开名为output.txt文件
f_printf(&fp_out,"%d %d %d %d %s\n",(int)10.00,9,a,(int)b,"String");
上述代码输出结果为:
10 9 8 7 String
*f_printf()似乎不支持浮点数输出,只能输出字符串和整型数据。
在创建好应用工程和板级驱动工程(BSP)后,选择BSP右键Board Supprot Package Setting
如果之前已经进行了SD卡的读入数据工程,则右侧列表xilffs应该是已经勾选的(没有的话请勾选)
选中左侧的xilffts,根据下图配置各项Value
特别注意红框这一项,如果值为0那么f_printf()编译会出错。查看ff.h文件的代码就会发现:
f_printf()只有在USE_STRFUNC不为0的情况下才能正常使用。(这些东西可以参考的资料真的好少,只能自己摸索,不过总算是成功用上了~)
准备工作已经完成,接下来添加对应代码块就OK了。
#include "platform.h"
#include "xil_printf.h"
#include "ff.h"
//全局变量
static FATFS fatfs;
int main()
{
init_platform();
int j,k;
FRESULT fr;
FIL fp_out;
f_mount(&fatfs,"",0);
f_mount(&fatfs,"",1);
fr = f_open(&fp_out,"result.txt",FA_WRITE);//打开文件
if(fr != FR_OK) //测试是否打开文件
{
print("open fail\n\r");
}
for(j=0;j<3325;j++)
{
for(k=0;k<2000;k++)
{
f_printf(&fp_out,"%d %d %d %d %d %d\n",4000,4000,1600,55,66,77)
}
}
fr = f_close(&fp_out);
print("Hello World\n\r");
cleanup_platform();
return 0;
}
笔者在具体应用中写了一个大约169MB的txt文档,猜猜花了多少时间,16分钟(=口=)这可不行啊,当然目前也没有找其他的代替方法……