datouyuan 發(fā)表于 2022-7-12 12:03
1.51的任何子程序都需要通過堆棧傳遞PC值,最少2字節(jié)。
2.51的中斷子程序通過堆棧傳遞PC、ACC、PSW ,最少 ...
Y_G_G 發(fā)表于 2022-7-12 12:26
8051是軟件堆棧,如果不是刻意去填滿它,堆棧基本上是不會(huì)有問題的
卡死的問題不一定是堆棧的問題,可能是中 ...
hb_lhw 發(fā)表于 2022-7-12 15:00
每次中斷,自動(dòng)入棧一個(gè)PC寄存器,具體幾個(gè)字節(jié)我忘了,然后中斷返回的時(shí)候再自動(dòng)出棧,樓主沒考慮這個(gè),所 ...
datouyuan 發(fā)表于 2022-7-12 12:03
1.51的任何子程序都需要通過堆棧傳遞PC值,最少2字節(jié)。
2.51的中斷子程序通過堆棧傳遞PC、ACC、PSW ,最少 ...
Y_G_G 發(fā)表于 2022-7-12 12:26
8051是軟件堆棧,如果不是刻意去填滿它,堆棧基本上是不會(huì)有問題的
卡死的問題不一定是堆棧的問題,可能是中 ...
newlined 發(fā)表于 2022-7-12 14:28
謝謝您的回復(fù),我明白了您的意思,您是說,中斷觸發(fā)間隔的時(shí)間短,而中斷本身執(zhí)行的時(shí)間長,結(jié)果就是CPU ...
Y_G_G 發(fā)表于 2022-7-12 16:56
大概就是這么個(gè)意思了
也就是說程序是在中斷之間來回跑的
主程序幾乎沒有執(zhí)行的時(shí)間
Y_G_G 發(fā)表于 2022-7-12 16:56
大概就是這么個(gè)意思了
也就是說程序是在中斷之間來回跑的
主程序幾乎沒有執(zhí)行的時(shí)間
188610329 發(fā)表于 2022-7-12 16:25
是不是堆棧大小的問題, 用KEIL 編譯后,仿真一下,看一下 SP_max 就知道了。有什么好算得?
我現(xiàn)在好奇 ...
newlined 發(fā)表于 2022-7-12 14:21
謝謝您的回復(fù),我算的是最多需要20字節(jié),您算的最少需要20字節(jié)
我是這樣理解的同為高級(jí)的2個(gè)中斷B ...
考慮一個(gè)最復(fù)雜的情況,主程序在調(diào)用A3時(shí),堆棧用了6個(gè)字節(jié),這時(shí)發(fā)生E中斷,E中斷在調(diào)用E3時(shí),堆棧用了8個(gè)字節(jié),這是發(fā)生B中斷,在B中斷調(diào)用B2時(shí),堆棧用了6個(gè)字節(jié),這樣堆棧最多用20個(gè)字節(jié)就可以了
newlined 發(fā)表于 2022-7-12 17:13
大約1小時(shí)前回復(fù)過,不知道回帖為什么沒有了。今天下午我拿示波器跟蹤了各個(gè)中斷的執(zhí)行時(shí)間,有2個(gè)是1毫 ...
188610329 發(fā)表于 2022-7-12 16:25
是不是堆棧大小的問題, 用KEIL 編譯后,仿真一下,看一下 SP_max 就知道了。有什么好算得?
我現(xiàn)在好奇 ...
newlined 發(fā)表于 2022-7-13 13:32
您好,以前的程序就是沒有對(duì)DPTR保護(hù)。看了您的發(fā)言后,我看了下程序,里邊的確用了DPTR,不知道為什么程 ...
datouyuan 發(fā)表于 2022-7-12 17:35
C51中斷中使用函數(shù)是很不好的習(xí)慣。
你把中斷中的函數(shù)改成不是函數(shù),以代碼空間換時(shí)間和RAM。
應(yīng)該能解決 ...
newlined 發(fā)表于 2022-7-13 13:47
您好,您這一說,我意識(shí)到一個(gè)問題,函數(shù)重入,這個(gè)程序編譯時(shí)曾經(jīng)出過這個(gè)警告,后來我把一個(gè)函數(shù)復(fù)制了 ...
一個(gè)函數(shù)復(fù)制了一份,另起了一個(gè)名字
datouyuan 發(fā)表于 2022-7-12 17:35
C51中斷中使用函數(shù)是很不好的習(xí)慣。
你把中斷中的函數(shù)改成不是函數(shù),以代碼空間換時(shí)間和RAM。
應(yīng)該能解決 ...
newlined 發(fā)表于 2022-7-13 15:42
您說的對(duì),開始我并沒有理解您的意思,剛才看中斷中的函數(shù),我想到,假設(shè)在中斷中,我使用了R0,然后調(diào)用 ...
好在我用R0都是用來訪問間接尋址的地址,隨用隨賦值
datouyuan 發(fā)表于 2022-7-13 15:52
當(dāng)然可以。但這又會(huì)增加堆棧需求。
匯編代碼要自己考慮如何保護(hù)現(xiàn)場(chǎng),恢復(fù)現(xiàn)場(chǎng)。
newlined 發(fā)表于 2022-7-13 16:11
您是說中斷自己不能恢復(fù)現(xiàn)場(chǎng),需要人為的PUSH,POP來恢復(fù)現(xiàn)場(chǎng)?而函數(shù)調(diào)用,C51的編譯器可以調(diào)用函數(shù)時(shí), ...
newlined 發(fā)表于 2022-7-13 16:11
您是說中斷自己不能恢復(fù)現(xiàn)場(chǎng),需要人為的PUSH,POP來恢復(fù)現(xiàn)場(chǎng)?而函數(shù)調(diào)用,C51的編譯器可以調(diào)用函數(shù)時(shí), ...
Y_G_G 發(fā)表于 2022-7-12 18:20
所謂"死機(jī)"和中斷無法跳出,這不過是推測(cè)而已,說不定可能就是其它的小問題而已
匯編是很容易出問題的
如 ...
Y_G_G 發(fā)表于 2022-7-12 18:20
所謂"死機(jī)"和中斷無法跳出,這不過是推測(cè)而已,說不定可能就是其它的小問題而已
匯編是很容易出問題的
如 ...
datouyuan 發(fā)表于 2022-7-13 17:12
只有PC值能自動(dòng)恢復(fù),其它值得恢復(fù)要靠軟件操作。
newlined 發(fā)表于 2022-7-14 08:39
您好,是這樣,程序是匯編的,擴(kuò)展名是ASM,但是在KEIL C下編譯的,我注意到一個(gè)問題,在KEIL C下新建一個(gè) ...
newlined 發(fā)表于 2022-7-14 09:57
剛才仿真了下,只看的R0,在中斷下,給它賦一個(gè)值,比如說5,然后調(diào)用一個(gè)函數(shù),在函數(shù)中對(duì)R0修改為8,函 ...
newlined 發(fā)表于 2022-7-14 08:26
您好,這個(gè)可能不方便貼出,隨說是20年的程序,但老板交代過。
經(jīng) 188610329大神提醒,我DPTR沒有保護(hù)造 ...
Y_G_G 發(fā)表于 2022-7-14 20:43
DPTR,R0,R1什么的,你在多個(gè)地方用到了,就進(jìn)行保護(hù),如果用不到就不用管
匯編子程序的原則是你在調(diào)用的時(shí) ...
188610329 發(fā)表于 2022-7-14 21:07
R0~R7 屬于 通用寄存器, 是不能PUSH的。
如果是完全自己寫的代碼,配合USING 可以用 PUSH AR0~AR7 方式 ...
Hephaestus 發(fā)表于 2022-7-14 19:44
你的軟件用到了idata了嗎?
Hephaestus 發(fā)表于 2022-7-14 21:41
函數(shù)的好處是可以復(fù)用,一處定義多處調(diào)用,節(jié)約程序空間。
但是對(duì)于大多數(shù)8位單片機(jī)編譯器,包括C51,沒 ...
188610329 發(fā)表于 2022-7-14 21:07
R0~R7 屬于 通用寄存器, 是不能PUSH的。
如果是完全自己寫的代碼,配合USING 可以用 PUSH AR0~AR7 方式 ...
newlined 發(fā)表于 2022-7-15 11:15
您好,四組寄存器都已經(jīng)用到了,其中有1組還是有2個(gè)同級(jí)別的低級(jí)中斷共用的.考慮到這2個(gè)低級(jí)別中斷不會(huì)同 ...
Y_G_G 發(fā)表于 2022-7-15 14:06
我感覺你還是把代碼上傳上來吧
既然你說是多年前的程序,那就說明以前的代碼是對(duì)的,問題估計(jì)就是出現(xiàn)你自己 ...
188610329 發(fā)表于 2022-7-15 15:34
看你另外一個(gè)帖子, 你再找單片機(jī)原理的書? 所以,問題出在,你并不理解你的單片機(jī)?
我之前34樓的問題,你也 ...
Hephaestus 發(fā)表于 2022-7-15 20:13
現(xiàn)在越來越混亂了。樓主在20樓說重入警告,這是c51獨(dú)有的,匯編的重入問題完全由用戶控制,根本不可能出現(xiàn) ...
188610329 發(fā)表于 2022-7-14 20:06
如果,你進(jìn)入中斷,用的是不同的寄存器組, 那么,你對(duì) R0 的操作,是不會(huì)影響 主程序的 R0的,因?yàn)椋?nbsp; ...
newlined 發(fā)表于 2022-7-16 08:42
程序中,四個(gè)工作區(qū)都用到了,其中兩個(gè)低級(jí)中斷共用一個(gè)區(qū),因?yàn)椴粫?huì)同時(shí)被單片機(jī)響應(yīng),不會(huì)出問題。以前的堆 ...
newlined 發(fā)表于 2022-7-16 08:42
程序中,四個(gè)工作區(qū)都用到了,其中兩個(gè)低級(jí)中斷共用一個(gè)區(qū),因?yàn)椴粫?huì)同時(shí)被單片機(jī)響應(yīng),不會(huì)出問題。以前的堆 ...
newlined 發(fā)表于 2022-7-16 08:24
不好意思,最近記憶力嚴(yán)重衰退,連老板都笑話我,也許我記串了。有一次,一個(gè)問題我們兩個(gè)人,商討后解決 ...
newlined 發(fā)表于 2022-7-16 08:42
程序中,四個(gè)工作區(qū)都用到了,其中兩個(gè)低級(jí)中斷共用一個(gè)區(qū),因?yàn)椴粫?huì)同時(shí)被單片機(jī)響應(yīng),不會(huì)出問題。以前的堆 ...
datouyuan 發(fā)表于 2022-7-16 10:13
看來你這代碼問題很大。
51的堆棧要安排在ram的最后。
例如你需要32字節(jié)堆棧,那么堆棧空間為0xe0~0xff ...
datouyuan 發(fā)表于 2022-7-16 11:58
這樣只是解決了編譯器報(bào)警問題。
前提你要保證你的業(yè)務(wù)邏輯是正確的,假如業(yè)務(wù)邏輯有bug,即使你添加了 ...
188610329 發(fā)表于 2022-7-16 18:00
堆棧不能這么搞, 堆棧是向上增長的,所以應(yīng)該分配在內(nèi)存的最末尾,而且,我不知道你用的什么單片機(jī),最 ...
IMG_20220718_165504[1].jpg (3.82 MB, 下載次數(shù): 717)
IMG_20220718_165516[1].jpg (3.14 MB, 下載次數(shù): 705)
newlined 發(fā)表于 2022-7-18 16:53
我知道堆棧是向上生長的,程序中以前就是那樣設(shè)定的,我也不知道為什么,我設(shè)定的話起碼會(huì)設(shè)在80H之前, ...
188610329 發(fā)表于 2022-7-18 19:36
AR0~AR7 是偽地址, 屬于KEIL A51 專用,在KEIL的幫助里面可以找到,一般講匯編的書,不會(huì)寫,要講KEIL的 ...
Y_G_G 發(fā)表于 2022-7-19 01:18
你要看的是這一本書,網(wǎng)上應(yīng)該可以搜索到不要錢的PDF版本,也可以買二手的,馬云家30塊左右,超過這個(gè)價(jià)錢就 ...
newlined 發(fā)表于 2022-8-1 08:21
看了這個(gè)帖子,我明白了,AR7是不是已經(jīng)宏定義成了07H?我以前對(duì)地址了解不透徹,看來我要對(duì)這方面仔細(xì)揣 ...
188610329 發(fā)表于 2022-8-1 17:21
AR7 不一定是 07H, 也可能是 0FH, 17H 或者 1FH。 這牽涉到另一條 偽指令: USING , 當(dāng)代碼向上搜索 ...
Y_G_G 發(fā)表于 2022-8-1 13:17
這么些天了,還沒有搞明白這個(gè)?
00H-1FH 這就是R0-R7的幾個(gè)工作組
20H-2FH 這是可以位尋址的,位地址是從0 ...
newlined 發(fā)表于 2022-8-4 09:59
這一段我還不理解,但我會(huì)盡量避免出現(xiàn)這個(gè)問題,以后我會(huì)慢慢領(lǐng)會(huì)。現(xiàn)在我遇到一個(gè)新的問題,就是單片機(jī) ...
188610329 發(fā)表于 2022-8-4 14:56
要說保護(hù)的話……
ISP_CMD, ISP_CONTR,之外,ISP_ADDRH, ISP_ADDRL 這些都要一起保護(hù)。
但是這些都沒 ...
newlined 發(fā)表于 2022-8-6 14:32
讀指令movc可以不需要保護(hù)iap相關(guān)寄存器嗎?我仔細(xì)揣摩下。
Y_G_G 發(fā)表于 2022-7-19 01:18
你要看的是這一本書,網(wǎng)上應(yīng)該可以搜索到不要錢的PDF版本,也可以買二手的,馬云家30塊左右,超過這個(gè)價(jià)錢就 ...
188610329 發(fā)表于 2022-8-7 17:59
STC的 Eeprom 是把 Flash 空間模擬成 Eeprom 來操作,尤其是STC8系列,他在物理上就是 ROM的一部分。所以 ...
newlined 發(fā)表于 2022-10-6 09:28
好的,您說的,我慢慢理會(huì)。這一段時(shí)間,正看程序,原程序中bug不少,比如,一個(gè)子程序,有時(shí)用LCALL調(diào)用 ...
188610329 發(fā)表于 2022-10-6 15:00
唉…… 這是基礎(chǔ)中的基礎(chǔ)啊……
給你舉個(gè)例子吧:
有個(gè)函數(shù):
newlined 發(fā)表于 2022-10-25 13:50
你好,這個(gè)例子,我一直試圖理解,但我沒有想通。我是這樣理解的,LCALL 一個(gè)函數(shù)時(shí),堆棧會(huì)保存當(dāng)前調(diào)用 ...
newlined 發(fā)表于 2022-10-25 13:50
你好,這個(gè)例子,我一直試圖理解,但我沒有想通。我是這樣理解的,LCALL 一個(gè)函數(shù)時(shí),堆棧會(huì)保存當(dāng)前調(diào)用 ...
188610329 發(fā)表于 2022-10-25 14:58
CALL 一次 就會(huì)把地址 存入棧 然后 跳轉(zhuǎn)執(zhí)行, 運(yùn)行到 RET 就會(huì)從 棧中取出 地址, 返回CALL 的地方。 ...
Hephaestus 發(fā)表于 2022-10-25 18:44
我這個(gè)效率比你的還要高,連LJMP都省掉了,你的匯編還沒學(xué)到家。
我用的是Intel MCS-51 MACRO ASS ...
Hephaestus 發(fā)表于 2022-10-25 18:44
我這個(gè)效率比你的還要高,連LJMP都省掉了,你的匯編還沒學(xué)到家。
我用的是Intel MCS-51 MACRO ASS ...
newlined 發(fā)表于 2022-10-26 02:20
您這個(gè)看起來更簡(jiǎn)單,俗話說人外有人,天外有天,但我現(xiàn)在是更看不懂,感謝大家提供不同的代碼讓我 ...
Hephaestus 發(fā)表于 2022-10-26 03:38
這不是“人外有人,天外有天”的問題,時(shí)間久了你就能明白最重要的學(xué)問是數(shù)學(xué)和英語。
188610329 發(fā)表于 2022-10-26 20:02
所以,先把數(shù)學(xué)學(xué)好, 數(shù)一數(shù)你這編譯出來多少字節(jié), 在來講話, 然后把語文學(xué)好,學(xué)學(xué)怎么講話。
先不 ...
Hephaestus 發(fā)表于 2022-10-26 20:18
教你一句成語——不屑一顧。
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |