找回密码
 立即注册
查看: 496|回复: 11

实用高效的NOP调用函数

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-16 10:55:41 | 显示全部楼层 |阅读模式
项目添加NOPS.ASM,包含头文件NOPS.H就可以使用了,函数调用方式效率高,不占内存,不影响全局寄存器优化,

因为是调用方式调用返回占6个周期,所以1~6的调用都是6个周期,7个以后是真实的周期,主要用于GPIO模拟接口的短延时,

//NOPS.ASM





PUBLIC        __nops32
PUBLIC        __nops31
PUBLIC        __nops30
PUBLIC        __nops29
PUBLIC        __nops28
PUBLIC        __nops27
PUBLIC        __nops26
PUBLIC        __nops25
PUBLIC        __nops24
PUBLIC        __nops23
PUBLIC        __nops22
PUBLIC        __nops21
PUBLIC        __nops20
PUBLIC        __nops19
PUBLIC        __nops18
PUBLIC        __nops17
PUBLIC        __nops16
PUBLIC        __nops15
PUBLIC        __nops14
PUBLIC        __nops13
PUBLIC        __nops12
PUBLIC        __nops11
PUBLIC        __nops10
PUBLIC        __nops9
PUBLIC        __nops8
PUBLIC        __nops7
PUBLIC        __nops6
PUBLIC        __nops5
PUBLIC        __nops4
PUBLIC        __nops3
PUBLIC        __nops2
PUBLIC        __nops1

;$REGUSE function (R1-R6, A, B, C)
$REGUSE        __nops32()
$REGUSE        __nops31()
$REGUSE        __nops30()
$REGUSE        __nops29()
$REGUSE        __nops28()
$REGUSE        __nops27()
$REGUSE        __nops26()
$REGUSE        __nops25()
$REGUSE        __nops24()
$REGUSE        __nops23()
$REGUSE        __nops22()
$REGUSE        __nops21()
$REGUSE        __nops20()
$REGUSE        __nops19()
$REGUSE        __nops18()
$REGUSE        __nops17()
$REGUSE        __nops16()
$REGUSE        __nops15()
$REGUSE        __nops14()
$REGUSE        __nops13()
$REGUSE        __nops12()
$REGUSE        __nops11()
$REGUSE        __nops10()
$REGUSE        __nops9()
$REGUSE        __nops8()
$REGUSE        __nops7()
$REGUSE        __nops6()
$REGUSE        __nops5()
$REGUSE        __nops4()
$REGUSE        __nops3()
$REGUSE        __nops2()
$REGUSE        __nops1()

?PR?__nops?nops                SEGMENT CODE
RSEG  ?PR?__nops?nops

__nops:
__nops32:        NOP
__nops31:        NOP
__nops30:        NOP
__nops29:        NOP
__nops28:        NOP
__nops27:        NOP
__nops26:        NOP
__nops25:        NOP
__nops24:        NOP
__nops23:        NOP
__nops22:        NOP
__nops21:        NOP
__nops20:        NOP
__nops19:        NOP
__nops18:        NOP
__nops17:        NOP
__nops16:        NOP
__nops15:        NOP
__nops14:        NOP
__nops13:        NOP
__nops12:        NOP
__nops11:        NOP
__nops10:        NOP
__nops9:        NOP
__nops8:        NOP
__nops7:        NOP
__nops6:
__nops5:
__nops4:
__nops3:
__nops2:
__nops1:
        RET

        END

//NOPS.H



#ifndef __NOPS_H__
#define __NOPS_H__







//_________________________________________________________________
// 函数声明
//_________________________________________________________________
void __nops1(void);                //最少6个NOP
void __nops2(void);                //最少6个NOP
void __nops3(void);                //最少6个NOP
void __nops4(void);                //最少6个NOP
void __nops5(void);                //最少6个NOP
void __nops6(void);                //最少6个NOP
void __nops7(void);
void __nops8(void);
void __nops9(void);
void __nops10(void);

void __nops11(void);
void __nops12(void);
void __nops13(void);
void __nops14(void);
void __nops15(void);
void __nops16(void);
void __nops17(void);
void __nops18(void);
void __nops19(void);
void __nops20(void);

void __nops21(void);
void __nops22(void);
void __nops23(void);
void __nops24(void);
void __nops25(void);
void __nops26(void);
void __nops27(void);
void __nops28(void);
void __nops29(void);
void __nops30(void);

void __nops31(void);
void __nops32(void);



#endif
//_________________________________________________________________
// END
//_________________________________________________________________




nops.asm

1.74 KB, 下载次数: 25

NOPS.H

1.13 KB, 下载次数: 23

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-16 10:58:25 | 显示全部楼层



//使用
        IIC_SCL = 0;
        __nops12();
        IIC_SCL = 1;
        __nops12();

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-02 07:32:37

21

主题

564

回帖

2678

积分

金牌会员

积分
2678
发表于 2025-1-16 19:21:45 | 显示全部楼层
官方例程里面看到过,
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2025-1-16 20:08:52 | 显示全部楼层
官方头文件就要nop(n)了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-17 09:28:26 | 显示全部楼层
so*** 发表于 2025-1-16 20:08
官方头文件就要nop(n)了。

改进一下





#ifndef __NOPS_H__
#define __NOPS_H__




//_________________________________________________________________
// define
//_________________________________________________________________
#define __nops(n)        __nops##n()                //__nops(32) = __nops32()


//_________________________________________________________________
// 函数声明
//_________________________________________________________________
void __nops1(void);                //最少6个NOP
void __nops2(void);                //最少6个NOP
void __nops3(void);                //最少6个NOP
void __nops4(void);                //最少6个NOP
void __nops5(void);                //最少6个NOP
void __nops6(void);                //最少6个NOP
void __nops7(void);
void __nops8(void);
void __nops9(void);
void __nops10(void);

void __nops11(void);
void __nops12(void);
void __nops13(void);
void __nops14(void);
void __nops15(void);
void __nops16(void);
void __nops17(void);
void __nops18(void);
void __nops19(void);
void __nops20(void);

void __nops21(void);
void __nops22(void);
void __nops23(void);
void __nops24(void);
void __nops25(void);
void __nops26(void);
void __nops27(void);
void __nops28(void);
void __nops29(void);
void __nops30(void);

void __nops31(void);
void __nops32(void);



#endif
//_________________________________________________________________
// END
//_________________________________________________________________

NOPS.H

1.33 KB, 下载次数: 22

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-17 09:29:38 | 显示全部楼层
调用
    __nops(32);
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-17 09:31:22 | 显示全部楼层
这个与官方的不一样,官方是宏,是插入N个NOP,这里是函数调用(延时N个NOP周期),多次调用只增加调用的代码,本身占用30多个字节代码空间
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-02 07:55:56
已绑定手机

19

主题

3190

回帖

4870

积分

论坛元老

积分
4870
发表于 2025-1-17 10:51:57 | 显示全部楼层
不需要c文件吗?只有h文件
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-17 11:07:33 | 显示全部楼层
so*** 发表于 2025-1-17 10:51
不需要c文件吗?只有h文件

用汇编写的,项目添加nops.asm即可
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:154
  • 最近打卡:2025-04-30 08:40:57
已绑定手机

15

主题

630

回帖

730

积分

高级会员

积分
730
发表于 2025-1-18 21:12:29 来自手机 | 显示全部楼层
这个不错,谢谢分享
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 11:17 , Processed in 0.183213 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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