STM32F107中的for循环

STM32F107中的for循环

for循环是一个很简单的,但在不同的场景中可能会有新的发现。
前几天,在做项目调试的过程中发现了一个小问题,虽说不怎么影响程序的稳定性等,但还是需要记录一下。
for循环的语法结构为:
for(循环变量初始化;跳出循环判别语句;循环变量变化方式)
{
循环执行的的语句;​​
}
STM32F107属于STM32F10x系列,其内核为Cortex-M3,是32位的处理器。
不知道大家在定义循环变量的时候,喜欢定义为什么类型的?
从51过来的我,一般都是够用就行,首先考虑选用有符号数还是无符号数,对后续计算判断有无影响,尤其是左右移操作。假如选择了无符号数,首先会考虑uint8_t够不够,大多数情况下是够用的。问题就是出现在这里了,51时代,能用8位数绝对不用16位的,因为我们或多或少都知道,对于51,8位数和16位数做成同一件事,所要用到的时间是有一定的差距的,并且是可以感受到的,但是在STM32上边基本就没有这种感觉了,也就没有在意过这个事。
前几天在调试的时候,用到大多是处理字符串,所以指针就不可避免了,但是指针在调试的过程中,麻烦的是指着指着就不知道指到那里去了,但还要一定的调试速率,那就不得不看断点处的Cortex-M3的寄存器中的值和MDK的汇编了,以及一些watch窗口和内存查看窗口了,无意中发现for循环多了一条不知名的指令,不管是不是伪指令,权威指南中没有看到(可能我看的不够仔细),然后问度娘,竟然是一条扩充指令,把8位数扩充为32位的数,再看,被扩充的是数据竟然是for循环的循环变量,并且是每个循环体的最后一句都要执行它,循环体执行的次数少也就罢了,偏偏次数还不少(100次),按照单周期指令算,那就是100个指令周期了,STM32F107是72M的主频,也就是72个指令周期就是1us,也就是我的一个for循环下来都浪费了大约1.5us,这绝对不能忍,立即把循环变量改为uint32_t类型的,再次进入调试状态,那条指令就没有了。
图呢,不要问我,我也不知让谁给造了。
各位看官若是用空,可以自己试一下,对了,我使用的MDK版本是5.14,优化等级是Level2(-O2)。

你可能感兴趣的:(调试笔记)