【转】[FPGA博客大赛](updated)在xilinx的FPGA系统中scanf函数的使用
scanf函数在c语言中,常常作为标准输入函数所使用,
而xilinx号称他支持标准的c库,所以自己很想用用这个函数。
但是自己不管怎么尝试都无法通过终端输入一个字符。
http://www.openhw.org/walkie/blog/09-03/166335_463bd.html
网上也有无数的人在说无法使用scanf,或者无法完整的使用scanf函数。
从edk的文档OS and Libraries Document Collection(oslib_rm.pdf)上说是支持的。而且确实可以在edk的安装目录下面的stdio.h文件中找到scanf函数的定义。
\Xilinx\EDK\gnu\microblaze\nt\microblaze-xilinx-elf\include\stdio.h
但是在自己的函数中还是无法使用
int main (void) {
int a;
char str[80];
xil_printf(”– Entering main() –\r\n”);
while(1){
print(”Enter a name:”);
scanf(”%s”,str);
print(”\r\n”);
printf(”the name entered is: %s\r\n”,str);
}
return 0;
}
这里使用了最简单的模式,通过scanf输入一个数据,再通过printf函数打印到标准输出部件。
经过一些天的调试,总算找到了问题的核心,原来是我的heap设置太小了。程序默认是0,而scanf需要的heap的大小要大于0x400才能正常的工作。最后使用的大小是0x800。才一切正常。
scanf函数以及printf函数,使用这些标准的c函数, 对于最后整个程序的大小我也是有心理准备的,知道肯定会比较的大。但是最后出来的结果还是把我吓到了,本来8k(<1fff)可以放下的东西,现在大概 需要0x132b4(>100k)这么多,大了大概15倍左右,真是让人崩溃。而且这里我已经调小了heap以及stack的大小,heap设置为 ox800byte,stack设置为0×400byte。
heap不能再小了,之前heap,edk默认为0byte,因为确实在程序中看上去没有malloc这样的函数来动态申请空间,但是自己忽略了scanf这个函数中可能会有buffer。
这个地方也是让我调试了很久的一个地方。一开始整个程序下载下去根本无法使用,终端就一直 死在那里,或者就是在打印scanf得到的str时候出现乱码。后来想想想想不对啊,scanf肯定里面会有buffer,而且这些buffer肯定是动态分配的,才想起heap的问题。
发现edk中默认heap是0k,修改为经常使用的ox400byte之后,每次在屏幕上只能输入一个字符,于是修改为 0×800之后一切正常。stack倒是只用了默认的0×400byte。在文章的最后有一小段程序来说明一个程序中哪些是放在heap中的,哪些是放在 stack中的。
再来说一下scanf的大小,它>79k,毕竟这是一个标准的函数啊,要支持那么多东西。。不过对于嵌入式的很多系统,真的有必要需要那么标 准的函数吗?碰到任何情况都可以使用一个通用的函数来解决。其实很多时候对于普通计算机这是必要的,但是对于嵌入式系统,特别是那些对于memory要求 很高的系统,大可不必使用标准的scanf。就像printf一样,xil_printf只是把printf的浮点去除了,整个函数也小了很多。要是只是 打印一句话,一个字符串出来,完全可以只用print函数来实现,而不必使用printf这样的函数。
那么问题又来了,是否有一个比较好的scanf的替代品呢?
1)如果只需要得到一个字符,或者数字之类,可以只是如下方式:
int main()
{
char s;
while(1){
s = XUartLite_RecvByte (XPAR_UARTLITE_0_BASEADDR);
XUartLite_SendByte (XPAR_UARTLITE_0_BASEADDR, s);
}
return 0;
}
直接只用UART底层的驱动函数就可以了。自己调试过了,是完全可以使用的。终端输出的效果也很不错,大小也非常小,只有 c7a ,4k都不到。那么如果需要输入一个字符串,那么可以写一些附加代码来实现。比如使用一个char的数组,把输入的字符一个一个的放进这个数组中。
2)下面这个帖子说他提供了一个reduce的scanf函数,但是我还不知道如何来使用。
http://groups.google.com/group/comp.arch.fpga/browse_thread/thread/22660067a5ff5a6e/f7ff7eb383fe4528?hl=en#f7ff7eb383fe4528
3)这个版本是1)中的一个update。从标准输入一个byte一个byte的输入,然后把输入的字符拼成 一个字符串或者数字输出。Thanks to Terry O'Neal and Ricky Su.
以下是完成代码:
#include “xparameters.h”
#include “stdio.h”
#include “xutil.h”
char * mygets(char *string){
char x=0;
while(x!= ‘\r’) {
x=inbyte();
*string++ = x;
xil_printf(”%c”,x);
}
*(–string) = ‘\0′;
}
int main(void){
char * input_string;
int sectornum;
if ((input_string = (char*)malloc(10)) == NULL) {
print(”Unable to allocate space”);
return 0;
}
mygets(input_string);
sectornum = strtoul(input_string,NULL,0);//string to number
xil_printf(”__After strtoul____%s\r\n”,input_string);
xil_printf(”__%d____”,sectornum);
free(input_string);
return 0;
}
4)这里提供一种3)的改进版本。不使用malloc以及free函数,因为它们的具体实现也比较的大。所以使用char[10],字符数组来实现。这种方法可以使得程序放入8k的bram中。
#include “xparameters.h”
#include “stdio.h”
#include “xutil.h”
void mygets(char *string){
char x=0;
while(x!= ‘\r’){
x=inbyte();
*string++ = x;
xil_printf(”%c”,x);
}
*(–string) = ‘\0′;
}
int main(void){
int sectornum;
char input_string[10];
mygets(input_string);
xil_printf(”\r\nIt %s\r\n”,input_string);
sectornum = strtoul(input_string,NULL,0);
xil_printf(”Num is %d\r\n”,sectornum);
return 0;
}
以下是关于Heap以及Stack的装载
-------
Heap & Stack
int x; /* static storage */
void main()
{
int y; /* dynamic stack storage */
char *str; /* dynamic stack storage */
str = malloc(100); /* allocates 100 bytes of dynamic heap storage */
y = foo(23);
free(str); /* deallocates 100 bytes of dynamic heap storage */
} /* y and str deallocated as stack frame is popped */
int foo(int z) /* z is dynamic stack storage */
{
char ch[100]; /* ch is dynamic stack storage */
if (z == 23) foo(7);
return 3; /* z and ch are deallocated as stack frame is popped,
3 put on top of stack */
}
转载于:https://www.cnblogs.com/lzhitian/archive/2012/11/12/2766408.html
【转】[FPGA博客大赛](updated)在xilinx的FPGA系统中scanf函数的使用相关推荐
- 2021FME博客大赛 —— FME在年度重要地理信息更新中的应用
作者:刘善磊 摘要 本文针对2020年度重要基础性地理信息更新工作,以地理国情监测数据为参考资料,基于语义匹配和几何匹配等关键技术,利用FME分别设计了具有识别"增加"." ...
- 关于我的FPGA博客
关于我的FPGA博客 1)一直从事FPGA相关工作,10年工作经验: 2)主要从事Xilinx FPGA逻辑开发: 3)FPGA研究方向为接口开发,包括低速接口和高速接口: 4)熟练使用FPGA开发软 ...
- 2012年度IT博客大赛50强报道:张世锋
2012年度IT博客大赛50强 sfzhang(张世锋) 参赛感言: 我倍感荣幸能晋级2012年度IT博客50强,在此非常感谢51CTO提供了这样一个很好的学习和交流的平台,感谢一路鼓励和支持我的各位 ...
- 秀秀博客大赛50强的礼物
很久没有写博客了,因为忙,因为心情琐碎,还是因为懒散,可能都沾些边,这年过得,人都有些萎靡了! 中午突然收到来自51CTO的快递,着急打开,一精美的荣誉证书,和那只看图已久的不带绳子的耗子,知道就是博 ...
- 2012年度IT博客大赛50强报道:高俊峰
2012年度IT博客大赛50强 南非蚂蚁(高俊峰) 参赛感言: 这是我第二年参加51CTO举办的IT博客大赛了. 非常荣幸能够进入50强,以前曾经游离多个技术论坛,然而最终却选择了51cto,我想,吸 ...
- 关于51CTO博客大赛的感想
我的参赛页面:http://2010blog.51cto.com/1849649 我的参赛博客:http://www.feiyan.info 首先感谢51CTO为广大IT人员提供了这样一个平台,让平时 ...
- 2012年度IT博客大赛【星光评委】申请说明
星光评委说明: 2012年度IT博客大赛星光评委是活跃在IT业界的技术达人.企业管理者,他们在其领域内有着成功的从业经验,丰富的专业知识和实战技能,并且乐于分享他们在IT技术以及行业认知上的智慧. ...
- “2012年度IT博客大赛”获奖感言--梦想、学习、坚持、自信、淡定
今年有幸参加"2012年度IT博客大赛",并且进入了前十强,大赛组委会让前十强选手写一下获奖感言.自开博以来,已经有一年半的时间,刚好籍此机会回顾一下写博历程.首先要感谢<老 ...
- 2012年度IT博客大赛50强报道:贾小平
2012年度IT博客大赛50强 fdisk54(贾小平) 参赛感言: 我的博客能从100强进入50强,首先感谢各位评委和众多网友的大力支持,虽然不知道是否能进入10强,但真心感谢51Cto,为我们提供 ...
最新文章
- python json数据格式数组内元素递增赋值_python深浅复制,类型转换, json操作,数组操作...
- POJ - 2492 种类并查集
- 洛谷P1119 灾后重建 图论 脑洞题
- leetcode-无重复字符的最长子串
- 网页突然乱码_电脑打开网页出现乱码
- C#中DataGridView控件使用大全
- php ftp rmdir,PHP中的ftp_rmdir()函数
- VB模拟指针模块mPoint.bas
- MongoDB副本集权限重置
- python requests下载图片_Python使用urllib库、requests库下载图片的方法比较
- 除了UL认证,开拓美国市场必备认证有哪些?
- Win32多语言IME开发概述
- 60+最佳免费 WordPress 主题 – 完整列表(2021年)
- mysql data too long for column xxx解决方案
- 谷粒学院day08——课程章节与小节的实现
- 短信验证-1基本的服务器环境搭建
- 【认知觉醒:开启自我改变的原动力】
- PHP 中英文混合排版中处理字符串常用的函数
- uni-app实现app内嵌微信文章
- zynq开发中的设备树