OpenEdv-开源电子网

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

STM32F103的赋值需要多长时间?

[复制链接]

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-2-19
在线时间
18 小时
发表于 2016-8-16 18:11:17 | 显示全部楼层 |阅读模式
3金钱
我在实验中发现F103的赋值很费时间,对256个单元的赋值大约需要90us,大约3次赋值就要1us。其中sysclock=72MHz。响应的,每次乘法大约2.3us。
测试方法是在TIM定时中断的服务程序入口处读取systick数值,然后减去循环赋值之后的读数。systick也是72MHz,给256单元的数组赋值所用的systick大约是6000,则对应83us。
请有经验的同行帮忙分析一下这些数据是不是弄错了,不会这么慢吧?

最佳答案

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

这种重复性赋值用DMA更好,另外赋值部分和各种乘除运算还是不要放到定时器中断响应函数中比较好。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-8-16 18:11:18 | 显示全部楼层
本帖最后由 ricefat 于 2016-8-17 11:34 编辑

这种重复性赋值用DMA更好,另外赋值部分和各种乘除运算还是不要放到定时器中断响应函数中比较好。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-16 19:46:01 | 显示全部楼层
你也不说明白“赋值”是往哪里,是SRAM,寄存器,还是FSMC的SRAM?还是其它的外部芯片?

也不贴代码,你以为这都是神仙么?

你先看看代码里有没有延时间和函数跳转、进出之类的存在,这些会耗费时间,
然后再去看看汇编结果,对着指令集算算究竟有多少指令在运行。

我理论计算了如下代码耗费时间(72MHz Core Clock):

83.33ns        - GPIOA = 0xAA55AA55;
152.78ns        - GPIOA |= 0xAA55AA55;
152.78ns        - GPIOA &= ~0xAA55AA55;
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-2-19
在线时间
18 小时
 楼主| 发表于 2016-8-16 20:06:11 | 显示全部楼层
xkwy 发表于 2016-8-16 19:46
你也不说明白“赋值”是往哪里,是SRAM,寄存器,还是FSMC的SRAM?还是其它的外部芯片?

也不贴代码,你 ...

#define BUFSZ 256
u32 ua=0,ub,utm[10];
u8 sza[BUFSZ],szb[BUFSZ],uc=0;
double d=3.14;
extern u32 tstcnt;
void TIM3_IRQHandler(void)   //TIM3ÖD¶Ï
{
        int i;
        tstcnt=0;
        ub=sizeof(d);
        ub=SysTick->VAL;
       
        d*=d;        utm[1]=ub-SysTick->VAL;utm[0]=SysTick->VAL;
        d/=1.57;        utm[2]=ub-SysTick->VAL;utm[0]=SysTick->VAL;
        d=sqrt(d);utm[3]=utm[0]-SysTick->VAL;utm[0]=SysTick->VAL;
        uc++;
        for(i=0;i<BUFSZ;i++)
        {
                sza=uc;
        }utm[4]=utm[0]-SysTick->VAL;utm[0]=SysTick->VAL;
        for(i=0;i<BUFSZ;i++)
        {
                szb=sza;
        }utm[5]=utm[0]-SysTick->VAL;utm[0]=SysTick->VAL;
        for(i=0;i<BUFSZ;i++)
        {
                sza=szb^0xff;
        }utm[6]=utm[0]-SysTick->VAL;utm[0]=SysTick->VAL;
       
        ua=ub-SysTick->VAL;
        ua=ua-ub;
        if(ua>1000&&ua<100000000)
        {
                d=ua;
        }
        ua=ub;
}
观察utm[1]-utm[6]的数值
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-16 20:12:40 | 显示全部楼层
首先双精度浮点的乘除及开方肯定非常费时间,非常非常费时间。

因为Cortex-M3没有浮点计算单元,单精度的都没有!


再说你代码里:
sza=uc;
szb=sza;
sza=szb^0xff;
这是啥?

能走点心?
这代码能编译通过吗?
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-2-19
在线时间
18 小时
 楼主| 发表于 2016-8-17 08:24:03 | 显示全部楼层
xkwy 发表于 2016-8-16 20:12
首先双精度浮点的乘除及开方肯定非常费时间,非常非常费时间。

因为Cortex-M3没有浮点计算单元,单精度 ...

不知道怎么回事贴上去就少了,代码是这样的
for(i=0;i<BUFSZ;i++)
        {
                sza=uc;
        }utm[4]=utm[0]-SysTick->VAL;utm[0]=SysTick->VAL;
        for(i=0;i<BUFSZ;i++)
        {
                szb=sza;
        }utm[5]=utm[0]-SysTick->VAL;utm[0]=SysTick->VAL;
        for(i=0;i<BUFSZ;i++)
        {
                sza=szb^0xff;
        }/**/utm[6]=utm[0]-SysTick->VAL;utm[0]=SysTick->VAL;
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-2-19
在线时间
18 小时
 楼主| 发表于 2016-8-17 08:25:15 | 显示全部楼层
ciaolemeng 发表于 2016-8-17 08:24
不知道怎么回事贴上去就少了,代码是这样的
for(i=0;iVAL;utm[0]=SysTick->VAL;
        for(i=0;iVAL;utm[0]=S ...

【i】怎么没了?
中括号i
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-2-19
在线时间
18 小时
 楼主| 发表于 2016-8-17 08:53:50 | 显示全部楼层
还望高手不吝赐教,指出错误所在。我认为很可能是程序什么地方没做好,应该不至于这么慢
回复

使用道具 举报

4

主题

67

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
212
金钱
212
注册时间
2015-8-5
在线时间
49 小时
发表于 2016-8-17 08:56:58 | 显示全部楼层
楼主可以使用J-Trace进行调试,就在JTAG的窗口里,叫trace
开源QQ群:431600056
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-2-19
在线时间
18 小时
 楼主| 发表于 2016-8-17 11:16:12 | 显示全部楼层
独孤帅 发表于 2016-8-17 08:56
楼主可以使用J-Trace进行调试,就在JTAG的窗口里,叫trace

好的,谢谢。我继续试
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-2-19
在线时间
18 小时
 楼主| 发表于 2016-8-17 13:51:57 | 显示全部楼层
ricefat 发表于 2016-8-17 11:29
这种重复性赋值用DMA更好,另外赋值部分和各种乘除运算还是不要放到定时器中断响应函数中比较好。

你好,请给段DMA批量赋值的程序好吗?
不知道DMA怎么实现数组之间的赋值,请指教
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-8-17 20:47:18 | 显示全部楼层
写代码测试一下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

13

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2014-2-19
在线时间
18 小时
 楼主| 发表于 2016-8-18 10:39:31 | 显示全部楼层
DMA的确有效,256单元拷贝的时间缩短到26us左右。谢谢ricefat的提醒
回复

使用道具 举报

5

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2011-8-31
在线时间
1 小时
发表于 2023-9-16 08:13:29 | 显示全部楼层
我这边520次赋值,消耗10us左右。感觉还是挺长的了,有没有进一步缩短的可能???
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 15:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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