cnxh 发表于 2023-3-4 19:43:29

预编译能否自动展开循环

预编译能否自动展开循环,即循环一次输出一个nop

#define a(n)nop;nop;----n个nop

调用a(5),编译后输出5个nop,
a(8),编译后输出8个nop,

三年模拟 发表于 2023-3-4 19:51:46

用for循环吧

laujc 发表于 2023-3-4 20:20:34

可以实现,但不是这样写的

kinoko 发表于 2023-3-4 21:10:14

你这种想法之前试过,因为频繁调用,最后代码量巨大,8位机舍不得,还是老老实实用循环。


#ifndef                N_NOP_H
#define                N_NOP_H

#include <intrins.h>


#define   NOP_1      _nop_();        //延时1个时钟周期
#define        NOP_2        NOP_1;_nop_();        //延时2个时钟周期       
#define        NOP_3        NOP_2;_nop_();        //延时3个时钟周期       
#define        NOP_4        NOP_3;_nop_();        //延时4个时钟周期       
#define        NOP_5        NOP_4;_nop_();        //延时5个时钟周期       
#define        NOP_6        NOP_5;_nop_();        //延时6个时钟周期       
#define        NOP_7        NOP_6;_nop_();        //延时7个时钟周期       
#define        NOP_8        NOP_7;_nop_();        //延时8个时钟周期       
#define        NOP_9        NOP_8;_nop_();        //延时9个时钟周期       
#define        NOP_10        NOP_9;_nop_();        //延时10个时钟周期       
#define        NOP_11        NOP_10;_nop_();        //延时11个时钟周期       
#define        NOP_12        NOP_11;_nop_();        //延时12个时钟周期       
#define        NOP_13        NOP_12;_nop_();        //延时13个时钟周期       
#define        NOP_14        NOP_13;_nop_();        //延时14个时钟周期       
#define        NOP_15        NOP_14;_nop_();        //延时15个时钟周期       
#define        NOP_16        NOP_15;_nop_();        //延时16个时钟周期       
#define        NOP_17        NOP_16;_nop_();        //延时17个时钟周期       
#define        NOP_18        NOP_17;_nop_();        //延时18个时钟周期       
#define        NOP_19        NOP_18;_nop_();        //延时19个时钟周期       
#define        NOP_20        NOP_19;_nop_();        //延时20个时钟周期       
#define        NOP_21        NOP_20;_nop_();        //延时21个时钟周期       
#define        NOP_22        NOP_21;_nop_();        //延时22个时钟周期       
#define        NOP_23        NOP_22;_nop_();        //延时23个时钟周期       
#define        NOP_24        NOP_23;_nop_();        //延时24个时钟周期       
#define        NOP_25        NOP_24;_nop_();        //延时25个时钟周期       
#define        NOP_26        NOP_25;_nop_();        //延时26个时钟周期       
#define        NOP_27        NOP_26;_nop_();        //延时27个时钟周期       
#define        NOP_28        NOP_27;_nop_();        //延时28个时钟周期       
#define        NOP_29        NOP_28;_nop_();        //延时29个时钟周期       
#define        NOP_30        NOP_29;_nop_();        //延时30个时钟周期       
#define        NOP_31        NOP_30;_nop_();        //延时31个时钟周期       
#define        NOP_32        NOP_31;_nop_();        //延时32个时钟周期       
#define        NOP_33        NOP_32;_nop_();        //延时33个时钟周期       
#define        NOP_34        NOP_33;_nop_();        //延时34个时钟周期       
#define        NOP_35        NOP_34;_nop_();        //延时35个时钟周期       
#define        NOP_36        NOP_35;_nop_();        //延时36个时钟周期       
#define        NOP_37        NOP_36;_nop_();        //延时37个时钟周期       
#define        NOP_38        NOP_37;_nop_();        //延时38个时钟周期       
#define        NOP_39        NOP_38;_nop_();        //延时39个时钟周期       
#define        NOP_40        NOP_39;_nop_();        //延时40个时钟周期       
#define        NOP_41        NOP_40;_nop_();        //延时41个时钟周期       
#define        NOP_42        NOP_41;_nop_();        //延时42个时钟周期       
#define        NOP_43        NOP_42;_nop_();        //延时43个时钟周期       
#define        NOP_44        NOP_43;_nop_();        //延时44个时钟周期       
#define        NOP_45        NOP_44;_nop_();        //延时45个时钟周期       
#define        NOP_46        NOP_45;_nop_();        //延时46个时钟周期       
#define        NOP_47        NOP_46;_nop_();        //延时47个时钟周期       
#define        NOP_48        NOP_47;_nop_();        //延时48个时钟周期       
#define        NOP_49        NOP_48;_nop_();        //延时49个时钟周期       
#define        NOP_50        NOP_49;_nop_();        //延时50个时钟周期       
#define        NOP_51        NOP_50;_nop_();        //延时51个时钟周期       
#define        NOP_52        NOP_51;_nop_();        //延时52个时钟周期       
#define        NOP_53        NOP_52;_nop_();        //延时53个时钟周期       
#define        NOP_54        NOP_53;_nop_();        //延时54个时钟周期       
#define        NOP_55        NOP_54;_nop_();        //延时55个时钟周期       
#define        NOP_56        NOP_55;_nop_();        //延时56个时钟周期       
#define        NOP_57        NOP_56;_nop_();        //延时57个时钟周期       
#define        NOP_58        NOP_57;_nop_();        //延时58个时钟周期       
#define        NOP_59        NOP_58;_nop_();        //延时59个时钟周期       
#define        NOP_60        NOP_59;_nop_();        //延时60个时钟周期       
#define        NOP_61        NOP_60;_nop_();        //延时61个时钟周期       
#define        NOP_62        NOP_61;_nop_();        //延时62个时钟周期       
#define        NOP_63        NOP_62;_nop_();        //延时63个时钟周期       
#define        NOP_64        NOP_63;_nop_();        //延时64个时钟周期       
#define        NOP_65        NOP_64;_nop_();        //延时65个时钟周期       
#define        NOP_66        NOP_65;_nop_();        //延时66个时钟周期       
#define        NOP_67        NOP_66;_nop_();        //延时67个时钟周期       
#define        NOP_68        NOP_67;_nop_();        //延时68个时钟周期       
#define        NOP_69        NOP_68;_nop_();        //延时69个时钟周期       
#define        NOP_70        NOP_69;_nop_();        //延时70个时钟周期       
#define        NOP_71        NOP_70;_nop_();        //延时71个时钟周期       
#define        NOP_72        NOP_71;_nop_();        //延时72个时钟周期       
#define        NOP_73        NOP_72;_nop_();        //延时73个时钟周期       
#define        NOP_74        NOP_73;_nop_();        //延时74个时钟周期       
#define        NOP_75        NOP_74;_nop_();        //延时75个时钟周期       
#define        NOP_76        NOP_75;_nop_();        //延时76个时钟周期       
#define        NOP_77        NOP_76;_nop_();        //延时77个时钟周期       
#define        NOP_78        NOP_77;_nop_();        //延时78个时钟周期       
#define        NOP_79        NOP_78;_nop_();        //延时79个时钟周期       
#define        NOP_80        NOP_79;_nop_();        //延时80个时钟周期       
#define        NOP_81        NOP_80;_nop_();        //延时81个时钟周期       
#define        NOP_82        NOP_81;_nop_();        //延时82个时钟周期       
#define        NOP_83        NOP_82;_nop_();        //延时83个时钟周期       
#define        NOP_84        NOP_83;_nop_();        //延时84个时钟周期       
#define        NOP_85        NOP_84;_nop_();        //延时85个时钟周期       
#define        NOP_86        NOP_85;_nop_();        //延时86个时钟周期       
#define        NOP_87        NOP_86;_nop_();        //延时87个时钟周期       
#define        NOP_88        NOP_87;_nop_();        //延时88个时钟周期       
#define        NOP_89        NOP_88;_nop_();        //延时89个时钟周期       
#define        NOP_90        NOP_89;_nop_();        //延时90个时钟周期       
#define        NOP_91        NOP_90;_nop_();        //延时91个时钟周期       
#define        NOP_92        NOP_91;_nop_();        //延时92个时钟周期       
#define        NOP_93        NOP_92;_nop_();        //延时93个时钟周期       
#define        NOP_94        NOP_93;_nop_();        //延时94个时钟周期       
#define        NOP_95        NOP_94;_nop_();        //延时95个时钟周期       
#define        NOP_96        NOP_95;_nop_();        //延时96个时钟周期       
#define        NOP_97        NOP_96;_nop_();        //延时97个时钟周期       
#define        NOP_98        NOP_97;_nop_();        //延时98个时钟周期       
#define        NOP_99        NOP_98;_nop_();        //延时99个时钟周期       
#define        NOP_100        NOP_99;_nop_();        //延时100个时钟周期       

#define NOP(N)         NOP_##N                        //延时 N个时钟周期

#endif

yuyu87 发表于 2023-3-4 21:25:15

可以实现,宏编译可以重复引用来实现,我们一般在头文件中有类似的代码,#ifndef,但现在要反着用,把你重复要用的放在一个.h文件里,引用时,可以循环实现,另外一个定义循环几次,论坛有个大神叫傻孩子,它的公众号上有这样一个文章,并且专门写了一个库,在mdk的软件包里能找到,叫什么xxxCount

ycheng2004 发表于 2023-3-4 22:38:14

kinoko 发表于 2023-3-4 21:10
你这种想法之前试过,因为频繁调用,最后代码量巨大,8位机舍不得,还是老老实实用循环。

...
(引用自4楼)

顶,这个方法好,运算快,

cnxh 发表于 2023-3-4 23:38:47

kinoko 发表于 2023-3-4 21:10
你这种想法之前试过,因为频繁调用,最后代码量巨大,8位机舍不得,还是老老实实用循环。

...
(引用自4楼)

谢谢,这个不错,就是lcd端口想稍微零活通用的延时一下,调用循环函数,cpu时钟慢有时用一个nop就够了,调用函数和循环浪费时间,换个快的cpu就改一下个数定义就可以了

mcu5i51 发表于 2023-3-6 09:25:39

#define nops(n)\
    #if n>0 nop;\
    #if n>1 nop;\
    ...
    #if n>99 #error
这样会不会好些,没有测试只是思路

mcu5i51 发表于 2023-3-6 09:26:28

忘记加#endif了

cnxh 发表于 2023-3-8 17:08:43

mcu5i51 发表于 2023-3-6 09:25
#define nops(n)\
    #if n>0 nop;\
    #if n>1 nop;\
(引用自8楼)

你确定 #if可以在#define的右侧可正常编译通过

#define nops(n)\
   #if n>0 nop;\

mcu5i51 发表于 2023-3-9 08:14:43

cnxh 发表于 2023-3-8 17:08
你确定 #if可以在#define的右侧可正常编译通过

#define nops(n)\
(引用自10楼)

测试了,不行

cnxh 发表于 2023-3-10 06:50:58

mcu5i51 发表于 2023-3-9 08:14
测试了,不行
(引用自11楼)

有可行的方法吗,我以前有需要,试过弄不了

mcu5i51 发表于 2023-3-10 15:04:38

cnxh 发表于 2023-3-10 06:50
有可行的方法吗,我以前有需要,试过弄不了
(引用自12楼)

目前没有,可以试试宏定义"开关"语句,不用跳出功能,从高到底的顺序执行nop,不过和编译器有关,常数调转依赖优化的,理论上会删除死代码,实测keil51的没有优化,老实的跳转了;
针对楼主的用途,建议定义常用的延时宏,不同芯片修改就好了,us以上的可以用定时器写函数处理
页: [1]
查看完整版本: 预编译能否自动展开循环