kv2004 发表于 2022-6-21 19:05:53

STC8G低功耗指令后面要加NOP,否则唤醒不正常。

如题。
本来能够运行的C51程序。
在RTX51-TINY配置文件里,设置了CPU_IDLE_CODE EQU 1,启用了宏: CPU_IDLE ,宏里面有ORL        PCON,#1,
就是说,把 PCON的 IDL 位 启用了,当系统不忙时候,会进入 空闲状态(不是掉电状态)。
但,运行不正常了:串口数据到来之后,要经过几十毫秒,CPU才能退出空闲状态。
》>导致很奇怪的现象:只有最后一个字节被处理。<《

找了很长时间,发现了范例程序都是前后加很多_nop_() 也没有注意在文档中是否有对加_nop_()的说明--至少主要位置没有说明。
最后,在 ORL        PCON,#1 后面 *只*加上一个 NOP 就正常了。
我试过,进入空闲状态指令,前面可以不加NOP,后面可以只加一个NOP。

希望能说明一下:
1 为什么要加NOP;
2 前后加多少个,加这么多NOP的道理,我现在只在后面加1个就能用,只1个够吗,前面真的不用加NOP吗;
3 还有其他哪些指令需要在前面或者后面加NOP。

后来在文档里面搜“NOP”关键字,搜到了在范例程序里面的一点点信息,只是建议前后都加上NOP,最好写明原因,尤其是在描述相关寄存器时,最好写上“在后(前)面必须加NOP,否则运行不正常”。

kitten 发表于 2022-6-21 22:39:00

休眠唤醒?应该是唤醒以后要等时钟恢复吧,特别是外部晶振起振需要时间的。ST之类的有专门的说明唤醒时间的。STC不太了解

kv2004 发表于 2022-6-21 23:23:39

kitten 发表于 2022-6-21 22:39
休眠唤醒?应该是唤醒以后要等时钟恢复吧,特别是外部晶振起振需要时间的。ST之类的有专门的说明唤醒时间的 ...
(引用自2楼)

空闲状态的前后都是内部时钟,
可能和时钟有关系.官方应该给个理由,在范例程序里面,为什么在空闲指令前后都用4个NOP,一共8个NOP,
但,我试着,只在空闲指令后面用一个NOP,就能工作。如果一个NOP都不用,就不正常。
感觉空闲指令前面没有用 NOP的必要,
官方应该给个明确的说明。

youright 发表于 2022-6-22 00:18:58

前面无用,主要是后面,确保进入低功耗状态

kinoko 发表于 2022-6-22 00:28:32

stc的51是唤醒后先执行休眠指令的下一条指令再进中断,有些厂家的51是唤醒后进中断再执行下一条指令。根据stc这个特点的话,如果下一条指令是关中断或者清标志位,中断就错过了。上述只是理论,没实测过。

kv2004 发表于 2022-6-22 09:06:59

kinoko 发表于 2022-6-22 00:28
stc的51是唤醒后先执行休眠指令的下一条指令再进中断,有些厂家的51是唤醒后进中断再执行下一条指令。根据s ...
(引用自5楼)

不是这个原因,
因为,我这个空闲指令是在中断里,不存在再进入其他中断的可能。如果紧跟着的语句不是nop的话,就会出错。
          我也试过,在主程序(是指不是中断程序)里面用空闲指令,同样也是一样的现象。和开关中断,进出中断等等没有关系。
问题焦点是,前面需要几个NOP;后面需要几个NOP;一个够吗,两个够吗,为啥么用四个,什么机制导致,万一四个也不够呢.

和系统时钟[起振-停振]估计也没有关系,因为空闲模式下,外设都是正常工作的,系统时钟就从来也没停过。

飞扬的琳 发表于 2022-6-22 10:05:55

建议加3个NOP以上到 36个NOP,因为STC8G系列比传统8051约快12倍。

kv2004 发表于 2022-6-22 12:18:53

飞扬的琳 发表于 2022-6-22 10:05
建议加3个NOP以上到 36个NOP,因为STC8G系列比传统8051约快12倍。
(引用自7楼)

l{:funk:}
为什么这么加啊,36怎么来的,36/12=3?3个NOP怎么来的?为什么我1T速度(12M震荡),加1个NOP看似也能正常,如果一个正常,为嘛要加三个,36个?

飞扬的琳 发表于 2022-6-22 13:18:22

kv2004 发表于 2022-6-22 12:18
l
为什么这么加啊,36怎么来的,36/12=3?3个NOP怎么来的?为什么我1T速度(12M震荡),加1个NO ...
(引用自8楼)

建议 加 3个NOP 以上, 传统 INTEL 8051是 建议加 3个 NOP的,INTEL 1个 NOP12个时钟,3个NOP = 36个时钟;STC8, 1个 NOP一个时钟,也是建议加3个NOP以上

kv2004 发表于 2022-6-22 14:26:03

本帖最后由 kv2004 于 2022-6-22 14:36 编辑

飞扬的琳 发表于 2022-6-22 13:18
建议 加 3个NOP 以上, 传统 INTEL 8051是 建议加 3个 NOP的,INTEL 1个 NOP12个时钟,3个NOP = 36个时钟 ...
(引用自9楼)

1 这个范例程序是STC的(-->)1T(<--)单片机的。STC只在范例里面加了4个NOP,而你却建议36个。
2 这个范例是演示“掉电”而不是“空闲”,虽然它两个的范例程序都相似,都是加了4个NOP。
3 范例程序的注释(相当不规范更不权威)的位置,写到内部机制会先执行一个NOP,再进入中断...它只是描述了,中断的运行机制,而不是为什么(必须)要加NOP,试验很明显,除了NOP,其他指令都不行。而这一点,在这个范例程序的注释上并没有表达。

再表达一下,我关心的是没有NOP-->没有稳定运行,为什么;
                     不关心,被唤醒后,中断程序何时运行,这个进不进中断何时进中断等等其他问题都暂时不关心,这不是这个帖子要讨论的问题 。

小李非刀 发表于 2022-6-24 17:33:31

手册都有说明,必须加至少2个NOP。我一般加3~5个。

gzhuli 发表于 2022-6-24 17:49:43

kv2004 发表于 2022-6-22 14:26
1 这个范例程序是STC的(-->)1T(没有稳定运行,为什么;
                     不关心,被唤醒后,中 ...
(引用自10楼)

中国特色,让你加就加,不要问为什么,下一盘大棋不需要每一步都告诉你为什么。 {:lol:}

kinoko 发表于 2022-6-24 17:58:20

gzhuli 发表于 2022-6-24 17:49
中国特色,让你加就加,不要问为什么,下一盘大棋不需要每一步都告诉你为什么。   ...
(引用自12楼)

这个nop明显是迁就芯片设计,非要刨根问底,那要设计的人来解答了。

cne53102 发表于 2022-6-24 18:17:43

估计是时钟和取指令那块的事情吧?总感觉FPGA大神wye11083能猜到点什么

eddia2012 发表于 2022-6-24 18:41:38

51系列不管是进口国产或台产的都一样要求在休眠指令后面加NOP,我一般加4个NOP
页: [1]
查看完整版本: STC8G低功耗指令后面要加NOP,否则唤醒不正常。