标题: _nop_()这个函数的括号里写入什么值 [打印本页]

作者: 可爱萌萌哒    时间: 2020-3-24 20:02
标题: _nop_()这个函数的括号里写入什么值
如题

作者: xxpp2011    时间: 2020-3-24 21:28
什么都不用填,只有定义函数时有输入参数的才要在括号里填
作者: billaj    时间: 2020-3-24 21:29
我一直以为这是个空操作符,就是让单片机白白浪费一个机器周期用的。。。。还能写入值的吗???我也坐等答案呢
作者: 可爱萌萌哒    时间: 2020-3-24 21:53
billaj 发表于 2020-3-24 21:29
我一直以为这是个空操作符,就是让单片机白白浪费一个机器周期用的。。。。还能写入值的吗???我也坐等答 ...

我初学  不太懂
作者: 可爱萌萌哒    时间: 2020-3-24 21:54
xxpp2011 发表于 2020-3-24 21:28
什么都不用填,只有定义函数时有输入参数的才要在括号里填

单独把它放在一行上,不用填入参数,就会延迟吗?
作者: yoxi    时间: 2020-3-24 22:16
_nop_()本身是一个操作为空的函数(不执行具体事情的函数(括号类也是空)),作用就是白白浪费单片机周期时间,起到简短延时效果
作者: jiasirer123    时间: 2020-3-24 22:41
nop后面有括号吗?
作者: 流星2019    时间: 2020-3-25 07:56
就是一个周期,就有的时候你要做很精确的延时的时候很多单片机自己延时函数做不到,一般us级别的,就要用到这个函数,可以仿真测下时间,然后决定用几个
作者: 黄youhui    时间: 2020-3-25 08:29
空白操作,不写值
作者: az12580    时间: 2020-3-25 16:56
不用填,这个是空操作符,延时函数里面的指令,相当于延时一个机器周期。
作者: 天风情    时间: 2020-3-25 17:07
不要填任何值
作者: 黎明初至    时间: 2020-3-25 17:28
nothing,就是一个空指令,会占用一个机器周期,汇编中为了防止程序跑飞也会对此调用该指令,防止程序死掉。
作者: rayin    时间: 2024-10-10 07:59
_nop_(); 是空转指令, 主要用于非常短暂的延时. 不需要参数.
作者: 蓝蓝小星星    时间: 2024-10-10 21:52
本帖最后由 蓝蓝小星星 于 2024-10-11 00:17 编辑

_nop_();的由来是宏定义

#define _nop_()  asm"nop"
作者: angmall    时间: 2024-10-11 13:50
可爱萌萌哒 发表于 2020-3-24 21:53
我初学  不太懂

_nop_();的由来是宏定义

函数原型

#define           _nop_()        __asm { nop }

/////////////////////////////////////////////////
#define NOP1()  _nop_()
#define NOP2()  NOP1(),NOP1()
#define NOP3()  NOP2(),NOP1()
#define NOP4()  NOP3(),NOP1()
#define NOP5()  NOP4(),NOP1()
#define NOP6()  NOP5(),NOP1()
#define NOP7()  NOP6(),NOP1()
#define NOP8()  NOP7(),NOP1()
#define NOP9()  NOP8(),NOP1()
#define NOP10() NOP9(),NOP1()
#define NOP11() NOP10(),NOP1()
#define NOP12() NOP11(),NOP1()
#define NOP13() NOP12(),NOP1()
#define NOP14() NOP13(),NOP1()
#define NOP15() NOP14(),NOP1()
#define NOP16() NOP15(),NOP1()
#define NOP17() NOP16(),NOP1()
#define NOP18() NOP17(),NOP1()
#define NOP19() NOP18(),NOP1()
#define NOP20() NOP19(),NOP1()
#define NOP21() NOP20(),NOP1()
#define NOP22() NOP21(),NOP1()
#define NOP23() NOP22(),NOP1()
#define NOP24() NOP23(),NOP1()
#define NOP25() NOP24(),NOP1()
#define NOP26() NOP25(),NOP1()
#define NOP27() NOP26(),NOP1()
#define NOP28() NOP27(),NOP1()
#define NOP29() NOP28(),NOP1()
#define NOP30() NOP29(),NOP1()
#define NOP31() NOP30(),NOP1()
#define NOP32() NOP31(),NOP1()
#define NOP33() NOP32(),NOP1()
#define NOP34() NOP33(),NOP1()
#define NOP35() NOP34(),NOP1()
#define NOP36() NOP35(),NOP1()
#define NOP37() NOP36(),NOP1()
#define NOP38() NOP37(),NOP1()
#define NOP39() NOP38(),NOP1()
#define NOP40() NOP39(),NOP1()
#define NOP(N)  NOP##N()


/////////////////////////////////////////////////


作者: 188610329    时间: 2024-10-11 20:45
_nop_()  根本不是来自宏定义!! 来自于 系统函数库!
你只需要使用
extern void          _nop_     (void);
来申明就能直接调用, 而不需要 劳神子 的 define
根据这个函数模型可以看出, 这是一个不传参的 函数。
作者: 蓝蓝小星星    时间: 2024-10-11 23:25
188610329 发表于 2024-10-11 20:45
_nop_()  根本不是来自宏定义!! 来自于 系统函数库!
你只需要使用
extern void          _nop_     (voi ...

使用函数传递空指令会发生LCALL跳转,而不是汇编NOP指令,所谓的库函数,就是系统封装好的指令。
部分编译器能看到NOP()被宏定义,部分编译器可能看不到。
通过宏定义还可以重定义自己喜好的写法。
作者: 188610329    时间: 2024-10-17 23:53
蓝蓝小星星 发表于 2024-10-11 23:25
使用函数传递空指令会发生LCALL跳转,而不是汇编NOP指令,所谓的库函数,就是系统封装好的指令。
部分编 ...

你用过么? 你能不想当然的 认为 有LCALL 而实际 编译一下看看么?
作者: 蓝蓝小星星    时间: 2024-10-18 00:09
188610329 发表于 2024-10-17 23:53
你用过么? 你能不想当然的 认为 有LCALL 而实际 编译一下看看么?



现在用过了,直接无法编译。

作者: 188610329    时间: 2024-10-18 14:14
蓝蓝小星星 发表于 2024-10-18 00:09
现在用过了,直接无法编译。

你这 多打一个 _ 以为大家看不见么? 不要自欺欺人好吧?
作者: 蓝蓝小星星    时间: 2024-10-20 04:02
188610329 发表于 2024-10-18 14:14
你这 多打一个 _ 以为大家看不见么? 不要自欺欺人好吧?




删除所有代码,只写2行足以测试,别总以为别人是傻子,你倒是来解释解释为什么不能通过编译。
至于为什么会多出来_,是因为按你的写法只声明了函数,但没有书写函数所以警告,编译器直接在出错函数前面加上_符号而已。

作者: 蓝蓝小星星    时间: 2024-10-20 04:05
188610329 发表于 2024-10-18 14:14
你这 多打一个 _ 以为大家看不见么? 不要自欺欺人好吧?




按正常书写方法,可通过编译,并产生了CALL指令,并非NOP指令。

作者: 188610329    时间: 2024-10-20 21:07
蓝蓝小星星 发表于 2024-10-20 04:05
按正常书写方法,可通过编译,并产生了CALL指令,并非NOP指令。

正常的书写方式,应该是这样:

编译后不会有任何错误。

Ctrl+F5 查看汇编指令后,也是一个空指令NOP。


嘴上说着别以为别人都是傻子,但是你却总以为别人都是傻子。
都说了这是系统函数库的东西了,你去KEIL 的 HELP 里面都能搜到这个指令,压根不需要什么自作聪明的 define, 只要一个extern 就能调用,你如果调用不了,就是你系统函数库出了问题!


作者: 蓝蓝小星星    时间: 2024-10-21 00:10
188610329 发表于 2024-10-20 21:07
正常的书写方式,应该是这样:

编译后不会有任何错误。

不是所有的编译器都支持这种写法,这是keil的写法,你找其他的编译器看看能支持?
按标准写法,肯定会成成call指令,如果是替换为nop只能说明这是编译器的关键字。
define的写法在一些编译器的未加密的库函数可以看到封装后的写法,但如果这时用keil就会报错。而define这种写法的通用性还可以用在keil上。
作者: 黄youhui    时间: 2024-10-21 08:18
可爱萌萌哒 发表于 2020-3-24 21:53
我初学  不太懂

你可以理解成void _nop_(void){;}这是个什么都不做就浪费单片机时间的函数就行了
作者: djalkdkal    时间: 2024-10-26 13:26
不用填
作者: jhl0928    时间: 2024-10-27 18:36
什么都不写,本来就是个空指令




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1