Ayb_ice 发表于 2025-1-16 10:55:41

实用高效的NOP调用函数

项目添加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
//_________________________________________________________________




Ayb_ice 发表于 2025-1-16 10:58:25




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

wangxiangtan 发表于 2025-1-16 19:21:45

官方例程里面看到过,

soma 发表于 2025-1-16 20:08:52

官方头文件就要nop(n)了。

Ayb_ice 发表于 2025-1-17 09:28:26

soma 发表于 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
//_________________________________________________________________

Ayb_ice 发表于 2025-1-17 09:29:38

调用
    __nops(32);

Ayb_ice 发表于 2025-1-17 09:31:22

这个与官方的不一样,官方是宏,是插入N个NOP,这里是函数调用(延时N个NOP周期),多次调用只增加调用的代码,本身占用30多个字节代码空间

soma 发表于 2025-1-17 10:51:57

不需要c文件吗?只有h文件

Ayb_ice 发表于 2025-1-17 11:07:33

soma 发表于 2025-1-17 10:51
不需要c文件吗?只有h文件

用汇编写的,项目添加nops.asm即可

wlhet 发表于 2025-1-18 21:12:29

这个不错,谢谢分享
页: [1] 2
查看完整版本: 实用高效的NOP调用函数