OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4997|回复: 11

请教一下DSP和MDK5中使用sprintf函数的问题

[复制链接]

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
发表于 2019-2-12 14:35:46 | 显示全部楼层 |阅读模式
8金钱
本帖最后由 s710618781 于 2019-2-12 14:52 编辑

我是一个学生,最近才接触STM32,对这方面的内容了解不深。。遇到了问题百度找了好久也没弄懂解决方案,所以想要来请教一下大家,
目前在做用STM32F407探索版板子收集数据,然后进行DSP变换并生成文件的实验,想要请教大家的问题如下:

1.我想要使用sprintf函数将收集的float类型的数据转换成char型,然后存入文件里,我在代码中包含了头文件"stdio.h",然后使用sprintf,可是再编译时出现错误:
..\OBJ\Template.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced

请问这个需要如何解决呢?我该不该包含c库的头文件呢?

2.这个问题存粹是我想要偷懒,最近刚学完信号与系统,像是功率谱密度和DCT什么的只是接触DSP才有了解到,如果是自己计算估计够呛可能会出很多错误。。。我写了DSP的代码,现在想要检验计算是否有误,我看了实验例程有一个FFT的代码是自己写信号进行FFT变换,所以我想请问一下:  有没有人有一个已知其FFT,或者已知功率谱密度,或者已知DCT结果的信号呢,我想检验一下是否出错

非常感谢大家!


最佳答案

查看完整内容[请看2#楼]

sprintf,到数组,然后写数组到SD卡。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-2-12 14:35:47 | 显示全部楼层
s710618781 发表于 2019-2-22 14:28
请问“全部pirntf完”是什么意思呢?printf不是向串口等输出数据吗?怎么样才能储存数据呢?

sprintf,到数组,然后写数组到SD卡。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
 楼主| 发表于 2019-2-12 14:51:53 | 显示全部楼层
..\OBJ\FATFS.axf: Error: L6406E: No space in execution regions with .ANY selector matching arm_cmplx_mult_cmplx_f32.o(.text).
还有请问一下出现这个问题是什么原因呢。。。同时出来几十个。。。

回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
 楼主| 发表于 2019-2-13 11:03:53 | 显示全部楼层
目前第一个问题和我二楼的问题都解决了,第一个是把usart.c文件里的//#pragma import(__use_no_semihosting)这个注释掉就好了,然后空间不足的问题调整一下全局定义就解决了,现在请问是否有人有一个已知信号呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-2-15 02:20:31 | 显示全部楼层
s710618781 发表于 2019-2-13 11:03
目前第一个问题和我二楼的问题都解决了,第一个是把usart.c文件里的//#pragma import(__use_no_semihosting ...

最后的问题是啥意思?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
 楼主| 发表于 2019-2-20 21:05:23 | 显示全部楼层
正点原子 发表于 2019-2-15 02:20
最后的问题是啥意思?

只是想要一个信号,这个信号是已知其fft.psd.dct变换结果的,我想检验一下写的DSP代码有没有误而已,例如fft_inputbuf[2*i]=100+10*arm_sin_f32(2*PI*i/FFT_LENGTH)+30*arm_sin_f32(2*PI*i*4/FFT_LENGTH)+  50*arm_cos_f32(2*PI*i*8/FFT_LENGTH);这种的

但是这个不重要了。。。我想请问一下原子哥,我想向sd卡写入数据,当我定义DSP_LENTH为 1024 的时候,使用for(i=0;i<1024;i++)循环,利用f_write向sd卡写数据的时候,下进板子里实测发现会在这个for循环里面卡死,出不来(在出来后会有LED亮),但是我将DSP_LENTH改为 2 之类的较小数值时,则会瞬间出来,我想问原子哥有没有遇到过类似的情况,有没有办法能让它在数值较大的时候也不卡死呢?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-2-21 02:07:17 | 显示全部楼层
s710618781 发表于 2019-2-20 21:05
只是想要一个信号,这个信号是已知其fft.psd.dct变换结果的,我想检验一下写的DSP代码有没有误而已,例如 ...

不会卡死才对,f_write一般一次会写入512字节,所以你的1024长度,实际上可以一次写入完成。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
 楼主| 发表于 2019-2-21 17:51:01 | 显示全部楼层
本帖最后由 s710618781 于 2019-2-21 22:01 编辑
正点原子 发表于 2019-2-21 02:07
不会卡死才对,f_write一般一次会写入512字节,所以你的1024长度,实际上可以一次写入完成。

原子哥,我现在测试出来是我定义的float型数组fx的问题,当我把它定义成局部变量时,sprintf函数会卡住,当我定义成全局变量时,就可以执行了

问题是我需要更大的数组(2048)。。。且不止一个,用来存放传感器三轴DSP数据,如果定义成全局变量会报错:No space in execution regions with .ANY selector matching arm_cmplx_mult_cmplx_f32.o(.text).
空间不足。。。请问一下原子哥有没有遇到这种情景呢?是怎么解决的呢


#define DSP_LENTH 1024
in main()
{

   float32_t fx[DSP_LENTH];   //这里定义成局部变量会导致卡住
   char w_buff[25];
   ......

   for(i=0;i<DSP_LENTH;i++)
        {
                sprintf(w_buff,"%.4f\r\n",fx);     //这一步卡住,想要将float型的数据转换成char型的储存在数组里输出
                f_write(&a,w_buff,strlen(w_buff),&b);
        }
}

回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
 楼主| 发表于 2019-2-21 19:59:20 | 显示全部楼层
本帖最后由 s710618781 于 2019-2-21 22:04 编辑
正点原子 发表于 2019-2-21 02:07
不会卡死才对,f_write一般一次会写入512字节,所以你的1024长度,实际上可以一次写入完成。

这里使用sprintf是为了将float数据变成字符串存到char型数组里,有没有别的方法可以做到呀。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-2-22 02:14:50 | 显示全部楼层
s710618781 发表于 2019-2-21 17:51
原子哥,我现在测试出来是我定义的float型数组fx的问题,当我把它定义成局部变量时,sprintf函数会卡住, ...

你可以先全部printf完,然后一次性f write
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
 楼主| 发表于 2019-2-22 14:28:35 | 显示全部楼层
正点原子 发表于 2019-2-22 02:14
你可以先全部printf完,然后一次性f write

请问“全部pirntf完”是什么意思呢?printf不是向串口等输出数据吗?怎么样才能储存数据呢?
回复

使用道具 举报

4

主题

17

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-8-9
在线时间
19 小时
 楼主| 发表于 2019-2-23 12:10:31 | 显示全部楼层
正点原子 发表于 2019-2-23 02:31
sprintf,到数组,然后写数组到SD卡。

谢谢原子哥,问题已经解决了,我就是用sprintf到数组,然后写数组出去,可是用sprintf会空间不足,学习了教程中的内存管理实验,利用内存管理解决了这个问题,谢谢啦
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 20:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表