搜索
bottom↓
回复: 12

预编译能否自动展开循环

[复制链接]

出0入0汤圆

发表于 2023-3-4 19:43:29 | 显示全部楼层 |阅读模式
预编译能否自动展开循环,即循环一次输出一个nop

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

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

出0入115汤圆

发表于 2023-3-4 19:51:46 来自手机 | 显示全部楼层
用for循环吧

出0入4汤圆

发表于 2023-3-4 20:20:34 | 显示全部楼层
可以实现,但不是这样写的

出110入26汤圆

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


  1. #ifndef                N_NOP_H
  2. #define                N_NOP_H

  3. #include <intrins.h>


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

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

  105. #endif
复制代码

出20入186汤圆

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

出0入30汤圆

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

...
(引用自4楼)

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

出0入0汤圆

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

...
(引用自4楼)

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

出0入0汤圆

发表于 2023-3-6 09:25:39 | 显示全部楼层
#define nops(n)\
    #if n>0 nop;\
    #if n>1 nop;\
    ...
    #if n>99 #error
这样会不会好些,没有测试只是思路

出0入0汤圆

发表于 2023-3-6 09:26:28 | 显示全部楼层
忘记加#endif了

出0入0汤圆

 楼主| 发表于 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;\

出0入0汤圆

发表于 2023-3-9 08:14:43 | 显示全部楼层
cnxh 发表于 2023-3-8 17:08
你确定 #if可以在#define的右侧可正常编译通过

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

测试了,不行

出0入0汤圆

 楼主| 发表于 2023-3-10 06:50:58 | 显示全部楼层
mcu5i51 发表于 2023-3-9 08:14
测试了,不行
(引用自11楼)

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

出0入0汤圆

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

目前没有,可以试试宏定义"开关"语句,不用跳出功能,从高到底的顺序执行nop,不过和编译器有关,常数调转依赖优化的,理论上会删除死代码,实测keil51的没有优化,老实的跳转了;
针对楼主的用途,建议定义常用的延时宏,不同芯片修改就好了,us以上的可以用定时器写函数处理
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 19:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表