C语言中,有什么比FOR循环占用机器周期更少?
本帖最后由 weatt123456789 于 2018-10-21 22:32 编辑unsigned int Sum=1000;
unsigned int y;
for(y=0;y!=Sum;) //Y++不知为啥占用十几个周期 ,我把它放IF里了
{
P20=1
if(a==1){ nop3; P20=0;y++;} //
else{ nop5; P20=0;y++;} //这两个P20=0到 下一个P20=1,的间隔是0.63US,其中P20=1+P20=0 占用0.12US ,FOR判断占用了0.51US,有什么办法让这个循环判断减少到更少?
}
for(y=Sum;y;) 这样我可以让其减少3个周期 ,可是我里面还得再加一个变量++或者转换成++,有调用
if(a==1)y--; 基本都是面积换速度 把sum 拆开几份然后 P20 直接用 a 来赋值 不用If else 本帖最后由 weatt123456789 于 2018-10-21 22:54 编辑
浮华一生 发表于 2018-10-21 22:29
基本都是面积换速度 把sum 拆开几份然后 P20 直接用 a 来赋值 不用If else
我可以先把SUM拆分成 CHAR型变量 a,b,c,d,e,f,g,多写几次.
你说的再举个例子呢
我试着把 P20= a ,发现0.566US变成0.633了。 weatt123456789 发表于 2018-10-21 22:34
我可以先把SUM拆分成 CHAR型变量 a,b,c,d,e,f,g,多写几次.
你说的再举个例子呢
o 我现在才看懂你意思你是要减少FOR本身判断的周期啊这个感觉调高优化等级 或者自己用汇编了? for(y=1000;y!=0;y--)这种写法试下。 切分成小函数调用,生成的汇编代码更小,执行时间更快,但是C代码更长:void Callee(unsigned char Sum) {
unsigned char y = Sum;
while(y-->0) {
P20=1;
if(a==1){ nop3; P20=0;}
else{ nop5; P20=0;}
}
}
Callee(250);
Callee(250);
Callee(250);
Callee(250); FOR时时第一个补偿一下 laujc 发表于 2018-10-22 00:24
for(y=1000;y!=0;y--)这种写法试下。
是的,要减少时间,需要用-判断,因为汇编里边有DJNZ命令, 8位机处理U16,U32数据,需要多个时钟周期才能完成。
想快,用32位单片机。 for里面的变量尽量用data型 把你想要优化的函数放到一个单独的c文件里,然后用汇编代替呗 9楼正解,另外要看编译器出来的汇编,看看原因 我用逻辑分析仪(27元的)测量了一下,发现仿真出来的结果差得不止一点点,现在问题是,同样代码,每次编译出的执行时间都不是一样,有时偶尔会差个二三个周期的!! 27元的逻辑分析,好用的一踏糊涂 我优化等级应该调到不优化时间才会准吗? weatt123456789 发表于 2018-10-23 01:20
27元的逻辑分析,好用的一踏糊涂
有链接吗 shooly 发表于 2018-10-23 06:44
有链接吗
某宝一搜一大堆,第一次用这玩儿,能测IO电平变化,24M,分辩率83ns左右 LZ有什么需求?需要精确时间的地方要用中断处理,而不是抠几个周期。 目测本意是提升运行效率吧,不然没必要在这里纠结这几个周期
1. 51是8位的,你用 int++,int!=int 这样的运算是很费时间的,换成 char++,char!=char 会快很多。
2. 51的指令集决定了,不适合用 for( ... ++) 这样的结构,至少是 for( ... --) 会好一些。
详细的你看 KEIL 的反汇编就知道了,DJNZ 基本就是 51 底层对于循环的支持,其他循环结构效率不高。
3. 如果项目都已经需要抠循环这几个周期了,这片处理器基本就瓶颈了,要么换软件结构要么换处理器 t3486784401 发表于 2018-10-23 09:48
目测本意是提升运行效率吧,不然没必要在这里纠结这几个周期
1. 51是8位的,你用 int++,int!=int 这样的 ...
楼上是对的,减减之后,特别是减到0 ,可以通过判0标志位判断。++还是需要减掉你小于的那个数,做判0操作,多了两条指令。
for 10几条指令也正常。汇编写也少不了几条。 看来楼主对指令执行的时间卡的很紧啊! 受教了!!!!!! 不用了,我改用PWM了
页:
[1]