打印
[STM32F1]

【请指教】怎么优化代码让时间更短(有代码)

[复制链接]
1632|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
q7915239|  楼主 | 2014-9-8 19:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

void TIM6_IRQHandler(void)
{
                #define setbit(x,y) x|=(1<<y)                //把X的第Y位置1
                #define clrbit(x,y) x&=!(1<<y)                //把X的第Y位置0       
                clrbit(TIM2->CR1,0);                                //关闭所有定时器                       
                clrbit(TIM3->CR1,0);
                clrbit(TIM4->CR1,0);
                clrbit(TIM5->CR1,0);
                clrbit(TIM1->CR1,0);
                clrbit(TIM8->CR1,0);
                clrbit(TIM6->CR1,0);               
                if(RT_Mode_Flag)
                {
                                if(RT_Times < RT_Action_Times_Max )
                                {               
                                                setbit(TIM2->EGR,0);                                //复位计数器并产生更新事件
                                                setbit(TIM3->EGR,0);
                                                setbit(TIM4->EGR,0);
                                                setbit(TIM5->EGR,0);
                                                setbit(TIM1->EGR,0);
                                                setbit(TIM8->EGR,0);       
                                                TIM1->ARR         = ARR[0];                        //重装值                         
                                                TIM1->CCR3  = CCR[0];
                                                TIM2->ARR         = ARR[1];
                                                TIM2->CCR3        = CCR[1];
                                                TIM3->ARR         = ARR[2];
                                                TIM3->CCR1 = CCR[2];
                                                TIM4->ARR         = ARR[3];                                                                                 
                                                TIM4->CCR1 = CCR[3];
                                                TIM5->ARR         = ARR[4];
                                                TIM5->CCR4 = CCR[4];
                                                TIM8->ARR         = ARR[5];
                                                TIM8->CCR2 = CCR[5];               
                                                setbit(TIM2->CR1,0);                                //打开所有定时器
                                                setbit(TIM3->CR1,0);
                                                setbit(TIM4->CR1,0);
                                                setbit(TIM5->CR1,0);
                                                setbit(TIM1->CR1,0);
                                                setbit(TIM8->CR1,0);
                                                setbit(TIM6->CR1,0);       
                                                         ... ...

自关闭定时器到打开定时器......这段时间一共花了6-8us(用示波器看的)
怎么优化代码让时间更短些
沙发
mmuuss586| | 2014-9-8 20:31 | 只看该作者

提高速度:超频,设置编译器优化级别,减少指令数,尽量写寄存器;
另外你这么长的程序,花10uS内,估计在优化也提高不了多少;

中断程序越短越好,最好就简单的判断;
其它程序,可放在主程序判断;

使用特权

评论回复
板凳
aozima| | 2014-9-8 21:38 | 只看该作者
本帖最后由 aozima 于 2014-9-8 21:39 编辑

F1的话,把这段代码放RAM中执行会变短(不修改代码的情况下)。
如果有必要,整个中断向量也可放RAM中,进一步缩短中断延迟。

另外,“这段时间一共花了6-8us(用示波器看的)”
IO会有延迟,请在中断入口和退出处读timer(CM3可以读systick)的count。

使用特权

评论回复
地板
q7915239|  楼主 | 2014-9-8 21:43 | 只看该作者
mmuuss586 发表于 2014-9-8 20:31
提高速度:超频,设置编译器优化级别,减少指令数,尽量写寄存器;
另外你这么长的程序,花10uS内 ...

设置编译器优化级别具体是怎么样的

其实中断的程序还有,是这个的两三倍长,不过程序运行是正常的,之所以放中断就是为了尽量缩短代码中关闭定时器到打开定时器的时间

特殊情况,就算是1us我也得争取

使用特权

评论回复
5
huzi2099| | 2014-9-8 21:52 | 只看该作者
本帖最后由 huzi2099 于 2014-9-8 21:56 编辑

位操作啊
#define Dev_GetBit_BB(DevAddr, BitNumber)         (*(vu32 *)(PERIPH_BB_BASE |((DevAddr - PERIPH_BASE)<<5)|((BitNumber)<<2)))

可以考虑定时器间同步触发.

使用特权

评论回复
6
huzi2099| | 2014-9-8 21:59 | 只看该作者
不知道你弄啥,无论无何这种方法不是最好的.

使用特权

评论回复
7
q7915239|  楼主 | 2014-9-8 22:05 | 只看该作者
aozima 发表于 2014-9-8 21:38
F1的话,把这段代码放RAM中执行会变短(不修改代码的情况下)。
如果有必要,整个中断向量也可放RAM中,进 ...

原来可以把某段代码放到RAM中执行的。。正在百度学习中

因为我关注的是自关闭定时器到打开定时器这段时间,所以没必要缩短中断延迟

使用特权

评论回复
8
q7915239|  楼主 | 2014-9-8 22:09 | 只看该作者
huzi2099 发表于 2014-9-8 21:52
位操作啊
#define Dev_GetBit_BB(DevAddr, BitNumber)         (*(vu32 *)(PERIPH_BB_BASE |((DevAddr - PERIPH_BA ...

用主从模式麽

需要同时触发六个定时器。。。这能做到吗

使用特权

评论回复
9
huzi2099| | 2014-9-8 22:11 | 只看该作者
ram执行意义不大,片上falsh基本和mcu读写是同步的.如果你的时间已经等于指令执行周期了就不会再快了.
flash不是硬盘.

使用特权

评论回复
10
q7915239|  楼主 | 2014-9-8 22:15 | 只看该作者
huzi2099 发表于 2014-9-8 21:59
不知道你弄啥,无论无何这种方法不是最好的.

我也清楚这样不好

但现在情况特殊,我程序功能单一,而且功能已实现。

现在只是要求尽量缩短那段时间

使用特权

评论回复
11
huzi2099| | 2014-9-8 22:18 | 只看该作者
q7915239 发表于 2014-9-8 22:09
用主从模式麽

需要同时触发六个定时器。。。这能做到吗

没试过,不如换个思路,先切断时钟供应,开启所有定时器再恢复时钟.我也没做过...

使用特权

评论回复
12
aozima| | 2014-9-8 22:24 | 只看该作者
huzi2099 发表于 2014-9-8 22:11
ram执行意义不大,片上falsh基本和mcu读写是同步的.如果你的时间已经等于指令执行周期了就不会再快了.
flash ...

参考STM32的手册中的关于 FLASH 等待周期的描述。

使用特权

评论回复
13
huzi2099| | 2014-9-8 22:32 | 只看该作者
aozima 发表于 2014-9-8 22:24
参考STM32的手册中的关于 FLASH 等待周期的描述。

这个问题不太好说,和指令序列有关,一般优化以后可以同步的,因为有预取指令缓冲.
特殊情况是跳转和连续读写flash.

使用特权

评论回复
14
q7915239|  楼主 | 2014-9-8 23:15 | 只看该作者
各位大神说的我都看不懂啊

我慢慢研究

感谢大家解答,中秋快乐~

使用特权

评论回复
15
eydj2008| | 2014-9-9 08:32 | 只看该作者
你有没有搞错 这才几行代码 就用了6-8US
这肯定中断响断不过来造成的 你这里用72M 1US都用不到
话说STM32的中断响应 要超过5US 建议你不用库的中断才能加快速度
禁用其它中断,还有PUSH 行为。
再快就要换IC了

使用特权

评论回复
16
vavsz003| | 2014-9-9 14:17 | 只看该作者
  呵呵, 学习了,楼上的说的很对,可以把代码放到 ARM里面去运行,不过其实你这个代码不长,也不用这么麻烦。

使用特权

评论回复
17
q331513266| | 2014-9-9 19:28 | 只看该作者
汇编

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝