datouyuan 发表于 2022-7-12 12:03
1.51的任何子程序都需要通过堆栈传递PC值,最少2字节。
2.51的中断子程序通过堆栈传递PC、ACC、PSW ,最少 ...
Y_G_G 发表于 2022-7-12 12:26
8051是软件堆栈,如果不是刻意去填满它,堆栈基本上是不会有问题的
卡死的问题不一定是堆栈的问题,可能是中 ...
hb_lhw 发表于 2022-7-12 15:00
每次中断,自动入栈一个PC寄存器,具体几个字节我忘了,然后中断返回的时候再自动出栈,楼主没考虑这个,所 ...
datouyuan 发表于 2022-7-12 12:03
1.51的任何子程序都需要通过堆栈传递PC值,最少2字节。
2.51的中断子程序通过堆栈传递PC、ACC、PSW ,最少 ...
Y_G_G 发表于 2022-7-12 12:26
8051是软件堆栈,如果不是刻意去填满它,堆栈基本上是不会有问题的
卡死的问题不一定是堆栈的问题,可能是中 ...
newlined 发表于 2022-7-12 14:28
谢谢您的回复,我明白了您的意思,您是说,中断触发间隔的时间短,而中断本身执行的时间长,结果就是CPU ...
Y_G_G 发表于 2022-7-12 16:56
大概就是这么个意思了
也就是说程序是在中断之间来回跑的
主程序几乎没有执行的时间
Y_G_G 发表于 2022-7-12 16:56
大概就是这么个意思了
也就是说程序是在中断之间来回跑的
主程序几乎没有执行的时间
188610329 发表于 2022-7-12 16:25
是不是堆栈大小的问题, 用KEIL 编译后,仿真一下,看一下 SP_max 就知道了。有什么好算得?
我现在好奇 ...
newlined 发表于 2022-7-12 14:21
谢谢您的回复,我算的是最多需要20字节,您算的最少需要20字节
我是这样理解的同为高级的2个中断B ...
考虑一个最复杂的情况,主程序在调用A3时,堆栈用了6个字节,这时发生E中断,E中断在调用E3时,堆栈用了8个字节,这是发生B中断,在B中断调用B2时,堆栈用了6个字节,这样堆栈最多用20个字节就可以了
newlined 发表于 2022-7-12 17:13
大约1小时前回复过,不知道回帖为什么没有了。今天下午我拿示波器跟踪了各个中断的执行时间,有2个是1毫 ...
188610329 发表于 2022-7-12 16:25
是不是堆栈大小的问题, 用KEIL 编译后,仿真一下,看一下 SP_max 就知道了。有什么好算得?
我现在好奇 ...
newlined 发表于 2022-7-13 13:32
您好,以前的程序就是没有对DPTR保护。看了您的发言后,我看了下程序,里边的确用了DPTR,不知道为什么程 ...
datouyuan 发表于 2022-7-12 17:35
C51中断中使用函数是很不好的习惯。
你把中断中的函数改成不是函数,以代码空间换时间和RAM。
应该能解决 ...
newlined 发表于 2022-7-13 13:47
您好,您这一说,我意识到一个问题,函数重入,这个程序编译时曾经出过这个警告,后来我把一个函数复制了 ...
一个函数复制了一份,另起了一个名字
datouyuan 发表于 2022-7-12 17:35
C51中断中使用函数是很不好的习惯。
你把中断中的函数改成不是函数,以代码空间换时间和RAM。
应该能解决 ...
newlined 发表于 2022-7-13 15:42
您说的对,开始我并没有理解您的意思,刚才看中断中的函数,我想到,假设在中断中,我使用了R0,然后调用 ...
好在我用R0都是用来访问间接寻址的地址,随用随赋值
datouyuan 发表于 2022-7-13 15:52
当然可以。但这又会增加堆栈需求。
汇编代码要自己考虑如何保护现场,恢复现场。
newlined 发表于 2022-7-13 16:11
您是说中断自己不能恢复现场,需要人为的PUSH,POP来恢复现场?而函数调用,C51的编译器可以调用函数时, ...
newlined 发表于 2022-7-13 16:11
您是说中断自己不能恢复现场,需要人为的PUSH,POP来恢复现场?而函数调用,C51的编译器可以调用函数时, ...
Y_G_G 发表于 2022-7-12 18:20
所谓"死机"和中断无法跳出,这不过是推测而已,说不定可能就是其它的小问题而已
汇编是很容易出问题的
如 ...
Y_G_G 发表于 2022-7-12 18:20
所谓"死机"和中断无法跳出,这不过是推测而已,说不定可能就是其它的小问题而已
汇编是很容易出问题的
如 ...
datouyuan 发表于 2022-7-13 17:12
只有PC值能自动恢复,其它值得恢复要靠软件操作。
newlined 发表于 2022-7-14 08:39
您好,是这样,程序是汇编的,扩展名是ASM,但是在KEIL C下编译的,我注意到一个问题,在KEIL C下新建一个 ...
newlined 发表于 2022-7-14 09:57
刚才仿真了下,只看的R0,在中断下,给它赋一个值,比如说5,然后调用一个函数,在函数中对R0修改为8,函 ...
newlined 发表于 2022-7-14 08:26
您好,这个可能不方便贴出,随说是20年的程序,但老板交代过。
经 188610329大神提醒,我DPTR没有保护造 ...
Y_G_G 发表于 2022-7-14 20:43
DPTR,R0,R1什么的,你在多个地方用到了,就进行保护,如果用不到就不用管
汇编子程序的原则是你在调用的时 ...
188610329 发表于 2022-7-14 21:07
R0~R7 属于 通用寄存器, 是不能PUSH的。
如果是完全自己写的代码,配合USING 可以用 PUSH AR0~AR7 方式 ...
Hephaestus 发表于 2022-7-14 19:44
你的软件用到了idata了吗?
Hephaestus 发表于 2022-7-14 21:41
函数的好处是可以复用,一处定义多处调用,节约程序空间。
但是对于大多数8位单片机编译器,包括C51,没 ...
188610329 发表于 2022-7-14 21:07
R0~R7 属于 通用寄存器, 是不能PUSH的。
如果是完全自己写的代码,配合USING 可以用 PUSH AR0~AR7 方式 ...
newlined 发表于 2022-7-15 11:15
您好,四组寄存器都已经用到了,其中有1组还是有2个同级别的低级中断共用的.考虑到这2个低级别中断不会同 ...
Y_G_G 发表于 2022-7-15 14:06
我感觉你还是把代码上传上来吧
既然你说是多年前的程序,那就说明以前的代码是对的,问题估计就是出现你自己 ...
188610329 发表于 2022-7-15 15:34
看你另外一个帖子, 你再找单片机原理的书? 所以,问题出在,你并不理解你的单片机?
我之前34楼的问题,你也 ...
Hephaestus 发表于 2022-7-15 20:13
现在越来越混乱了。楼主在20楼说重入警告,这是c51独有的,汇编的重入问题完全由用户控制,根本不可能出现 ...
188610329 发表于 2022-7-14 20:06
如果,你进入中断,用的是不同的寄存器组, 那么,你对 R0 的操作,是不会影响 主程序的 R0的,因为,此 ...
newlined 发表于 2022-7-16 08:42
程序中,四个工作区都用到了,其中两个低级中断共用一个区,因为不会同时被单片机响应,不会出问题。以前的堆 ...
newlined 发表于 2022-7-16 08:42
程序中,四个工作区都用到了,其中两个低级中断共用一个区,因为不会同时被单片机响应,不会出问题。以前的堆 ...
newlined 发表于 2022-7-16 08:24
不好意思,最近记忆力严重衰退,连老板都笑话我,也许我记串了。有一次,一个问题我们两个人,商讨后解决 ...
newlined 发表于 2022-7-16 08:42
程序中,四个工作区都用到了,其中两个低级中断共用一个区,因为不会同时被单片机响应,不会出问题。以前的堆 ...
datouyuan 发表于 2022-7-16 10:13
看来你这代码问题很大。
51的堆栈要安排在ram的最后。
例如你需要32字节堆栈,那么堆栈空间为0xe0~0xff ...
datouyuan 发表于 2022-7-16 11:58
这样只是解决了编译器报警问题。
前提你要保证你的业务逻辑是正确的,假如业务逻辑有bug,即使你添加了 ...
188610329 发表于 2022-7-16 18:00
堆栈不能这么搞, 堆栈是向上增长的,所以应该分配在内存的最末尾,而且,我不知道你用的什么单片机,最 ...
IMG_20220718_165504[1].jpg (3.82 MB, 下载次数: 717)
IMG_20220718_165516[1].jpg (3.14 MB, 下载次数: 705)
newlined 发表于 2022-7-18 16:53
我知道堆栈是向上生长的,程序中以前就是那样设定的,我也不知道为什么,我设定的话起码会设在80H之前, ...
188610329 发表于 2022-7-18 19:36
AR0~AR7 是伪地址, 属于KEIL A51 专用,在KEIL的帮助里面可以找到,一般讲汇编的书,不会写,要讲KEIL的 ...
Y_G_G 发表于 2022-7-19 01:18
你要看的是这一本书,网上应该可以搜索到不要钱的PDF版本,也可以买二手的,马云家30块左右,超过这个价钱就 ...
newlined 发表于 2022-8-1 08:21
看了这个帖子,我明白了,AR7是不是已经宏定义成了07H?我以前对地址了解不透彻,看来我要对这方面仔细揣 ...
188610329 发表于 2022-8-1 17:21
AR7 不一定是 07H, 也可能是 0FH, 17H 或者 1FH。 这牵涉到另一条 伪指令: USING , 当代码向上搜索 ...
Y_G_G 发表于 2022-8-1 13:17
这么些天了,还没有搞明白这个?
00H-1FH 这就是R0-R7的几个工作组
20H-2FH 这是可以位寻址的,位地址是从0 ...
newlined 发表于 2022-8-4 09:59
这一段我还不理解,但我会尽量避免出现这个问题,以后我会慢慢领会。现在我遇到一个新的问题,就是单片机 ...
188610329 发表于 2022-8-4 14:56
要说保护的话……
ISP_CMD, ISP_CONTR,之外,ISP_ADDRH, ISP_ADDRL 这些都要一起保护。
但是这些都没 ...
newlined 发表于 2022-8-6 14:32
读指令movc可以不需要保护iap相关寄存器吗?我仔细揣摩下。
Y_G_G 发表于 2022-7-19 01:18
你要看的是这一本书,网上应该可以搜索到不要钱的PDF版本,也可以买二手的,马云家30块左右,超过这个价钱就 ...
188610329 发表于 2022-8-7 17:59
STC的 Eeprom 是把 Flash 空间模拟成 Eeprom 来操作,尤其是STC8系列,他在物理上就是 ROM的一部分。所以 ...
newlined 发表于 2022-10-6 09:28
好的,您说的,我慢慢理会。这一段时间,正看程序,原程序中bug不少,比如,一个子程序,有时用LCALL调用 ...
188610329 发表于 2022-10-6 15:00
唉…… 这是基础中的基础啊……
给你举个例子吧:
有个函数:
newlined 发表于 2022-10-25 13:50
你好,这个例子,我一直试图理解,但我没有想通。我是这样理解的,LCALL 一个函数时,堆栈会保存当前调用 ...
newlined 发表于 2022-10-25 13:50
你好,这个例子,我一直试图理解,但我没有想通。我是这样理解的,LCALL 一个函数时,堆栈会保存当前调用 ...
188610329 发表于 2022-10-25 14:58
CALL 一次 就会把地址 存入栈 然后 跳转执行, 运行到 RET 就会从 栈中取出 地址, 返回CALL 的地方。 ...
Hephaestus 发表于 2022-10-25 18:44
我这个效率比你的还要高,连LJMP都省掉了,你的汇编还没学到家。
我用的是Intel MCS-51 MACRO ASS ...
Hephaestus 发表于 2022-10-25 18:44
我这个效率比你的还要高,连LJMP都省掉了,你的汇编还没学到家。
我用的是Intel MCS-51 MACRO ASS ...
newlined 发表于 2022-10-26 02:20
您这个看起来更简单,俗话说人外有人,天外有天,但我现在是更看不懂,感谢大家提供不同的代码让我 ...
Hephaestus 发表于 2022-10-26 03:38
这不是“人外有人,天外有天”的问题,时间久了你就能明白最重要的学问是数学和英语。
188610329 发表于 2022-10-26 20:02
所以,先把数学学好, 数一数你这编译出来多少字节, 在来讲话, 然后把语文学好,学学怎么讲话。
先不 ...
Hephaestus 发表于 2022-10-26 20:18
教你一句成语——不屑一顾。
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |