预编译能否自动展开循环
预编译能否自动展开循环,即循环一次输出一个nop#define a(n)nop;nop;----n个nop
调用a(5),编译后输出5个nop,
a(8),编译后输出8个nop, 用for循环吧 可以实现,但不是这样写的 你这种想法之前试过,因为频繁调用,最后代码量巨大,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
可以实现,宏编译可以重复引用来实现,我们一般在头文件中有类似的代码,#ifndef,但现在要反着用,把你重复要用的放在一个.h文件里,引用时,可以循环实现,另外一个定义循环几次,论坛有个大神叫傻孩子,它的公众号上有这样一个文章,并且专门写了一个库,在mdk的软件包里能找到,叫什么xxxCount kinoko 发表于 2023-3-4 21:10
你这种想法之前试过,因为频繁调用,最后代码量巨大,8位机舍不得,还是老老实实用循环。
...
(引用自4楼)
顶,这个方法好,运算快, kinoko 发表于 2023-3-4 21:10
你这种想法之前试过,因为频繁调用,最后代码量巨大,8位机舍不得,还是老老实实用循环。
...
(引用自4楼)
谢谢,这个不错,就是lcd端口想稍微零活通用的延时一下,调用循环函数,cpu时钟慢有时用一个nop就够了,调用函数和循环浪费时间,换个快的cpu就改一下个数定义就可以了 #define nops(n)\
#if n>0 nop;\
#if n>1 nop;\
...
#if n>99 #error
这样会不会好些,没有测试只是思路 忘记加#endif了
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;\
cnxh 发表于 2023-3-8 17:08
你确定 #if可以在#define的右侧可正常编译通过
#define nops(n)\
(引用自10楼)
测试了,不行 mcu5i51 发表于 2023-3-9 08:14
测试了,不行
(引用自11楼)
有可行的方法吗,我以前有需要,试过弄不了 cnxh 发表于 2023-3-10 06:50
有可行的方法吗,我以前有需要,试过弄不了
(引用自12楼)
目前没有,可以试试宏定义"开关"语句,不用跳出功能,从高到底的顺序执行nop,不过和编译器有关,常数调转依赖优化的,理论上会删除死代码,实测keil51的没有优化,老实的跳转了;
针对楼主的用途,建议定义常用的延时宏,不同芯片修改就好了,us以上的可以用定时器写函数处理
页:
[1]