欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: STC8H單片機的RAM好像不能全部使用,難道技術(shù)手冊錯了?大家又遇到過嗎 [打印本頁]

作者: 紅燒魚頭    時間: 2022-9-16 17:00
標(biāo)題: STC8H單片機的RAM好像不能全部使用,難道技術(shù)手冊錯了?大家又遇到過嗎
用STC8H3K32S2這個單片機芯片,技術(shù)手冊里寫著RAM是128字節(jié),
但是編譯時發(fā)現(xiàn)超過110字節(jié)就會報錯,

難道技術(shù)手冊錯了?

1663318747895.jpg (151.23 KB, 下載次數(shù): 75)

1663318747895.jpg

1663318816001.jpg (5.94 KB, 下載次數(shù): 80)

1663318816001.jpg

作者: 188610329    時間: 2022-9-16 21:30
你看看你打框的上面一行 超出了0x26個字節(jié),所以,成功編譯的只有111字節(jié)。所以,原代碼,你總共要用data,大約166字節(jié)。
作者: yzwzfyz    時間: 2022-9-17 08:06
128個RAM中,系統(tǒng)需要用一部分,但你無法知道系統(tǒng)是如何規(guī)劃RAM的。
比如:系統(tǒng)用了30個,你就只能用98個了。
如果你用匯編寫程序,則沒有這個問題,RAM由你規(guī)劃使用。
作者: 紅燒魚頭    時間: 2022-9-17 08:33
188610329 發(fā)表于 2022-9-16 21:30
你看看你打框的上面一行 超出了0x26個字節(jié),所以,成功編譯的只有111字節(jié)。所以,原代碼,你總共要用data, ...

可是我減少了一個字節(jié)的全局變量,編譯就通過了啊

1663374767701.jpg (5.67 KB, 下載次數(shù): 78)

1663374767701.jpg

作者: 紅燒魚頭    時間: 2022-9-17 08:35
yzwzfyz 發(fā)表于 2022-9-17 08:06
128個RAM中,系統(tǒng)需要用一部分,但你無法知道系統(tǒng)是如何規(guī)劃RAM的。
比如:系統(tǒng)用了30個,你就只能用98個 ...

我算了下,定義的全局變量占50多字節(jié),系統(tǒng)占用的有將近70字節(jié)這么多嗎?!
作者: 紅燒魚頭    時間: 2022-9-17 08:41
yzwzfyz 發(fā)表于 2022-9-17 08:06
128個RAM中,系統(tǒng)需要用一部分,但你無法知道系統(tǒng)是如何規(guī)劃RAM的。
比如:系統(tǒng)用了30個,你就只能用98個 ...

我算了下,全局變量占用50字節(jié)左右,剩下的70字節(jié)都是系統(tǒng)占用了嗎?!
作者: 624353765    時間: 2022-9-17 09:19
不要把全局變量放在data中,data內(nèi)存都當(dāng)作堆棧內(nèi)存,主要用于局部變量和壓棧變量的使用,其他內(nèi)存都放在idata或xdata中
作者: wkman    時間: 2022-9-17 09:54
基礎(chǔ)性常識問題啊,堆棧指針之類的,要動態(tài)占用部分 data區(qū),要留下足夠的空間
作者: cjjdemon    時間: 2022-9-17 09:58
編譯的時候,程序選large,這樣就會優(yōu)先放xdata啦
作者: 紅燒魚頭    時間: 2022-9-17 09:59
qq624353765 發(fā)表于 2022-9-17 09:19
不要把全局變量放在data中,data內(nèi)存都當(dāng)作堆棧內(nèi)存,主要用于局部變量和壓棧變量的使用,其他內(nèi)存都放在id ...

好的,我已經(jīng)把全局變量放在idata里了,編譯通過了。
再請教一下 :我看有人說RAM的高128字節(jié)是特殊功能寄存器,但是idata就是RAM的高128字節(jié)吧?不沖突嗎?
作者: 紅燒魚頭    時間: 2022-9-17 10:07
cjjdemon 發(fā)表于 2022-9-17 09:58
編譯的時候,程序選large,這樣就會優(yōu)先放xdata啦

這樣好像會變慢?為什么不推薦用 idata 呢?
作者: 紅燒魚頭    時間: 2022-9-17 10:09
wkman 發(fā)表于 2022-9-17 09:54
基礎(chǔ)性常識問題啊,堆棧指針之類的,要動態(tài)占用部分 data區(qū),要留下足夠的空間

好吧,基本功不行
作者: szb314    時間: 2022-9-17 11:19
紅燒魚頭 發(fā)表于 2022-9-17 10:07
這樣好像會變慢?為什么不推薦用 idata 呢?

確實速度差一點,優(yōu)先用完idata 沒問題
作者: coody_sz    時間: 2022-9-17 20:59
樓主可以通過*.m51文件查看具體的變量安排。
STC8H3K系列的內(nèi)存遵守標(biāo)準(zhǔn)51的架構(gòu)要求,直接尋址(也可簡介尋址)的SRAM是低128字節(jié),高128字節(jié)只能間接尋址(idata),擴(kuò)展的xdata有3072個字節(jié)。

作者: cjjdemon    時間: 2022-9-17 22:37
紅燒魚頭 發(fā)表于 2022-9-17 10:07
這樣好像會變慢?為什么不推薦用 idata 呢?

放idata也行,idata也比較小呀,xdata就很大了哦,實際上不會慢多少的。
作者: 紅燒魚頭    時間: 2022-9-19 08:02
cjjdemon 發(fā)表于 2022-9-17 22:37
放idata也行,idata也比較小呀,xdata就很大了哦,實際上不會慢多少的。

使用xdata的話,還需要把AUXR的EXTRAM設(shè)為0,這個只要在初始化的時候設(shè)置一次就好了吧?不用每次調(diào)用xdata都專門調(diào)用一次EXTRAM=0吧?
作者: yzwzfyz    時間: 2022-9-19 08:51
1、編譯器一般會從30H開始規(guī)劃RAM的使用,這樣你只能用30H-7FH。
2、系統(tǒng)會根據(jù)程序中,子程序調(diào)用的深度,預(yù)留堆棧的數(shù)量,又用掉一些。
3、函數(shù)在返回數(shù)據(jù)時,也會用堆棧傳遞結(jié)果,再用掉一些。
4、你的#INCLUDE  “??”,函數(shù)中,也會規(guī)劃掉一些RAM。
……,以上你不易計算清楚,系統(tǒng)用70個以上很正常。

另外,你在10#樓的疑問,回復(fù)你一下:
對于256字節(jié)的RAM芯片,高端的128個RAM(80-FFH)與特殊寄存器的地址(80-FFH)的確是重復(fù)的!!!
CPU為了防止沖突,對此區(qū)間的訪問作出區(qū)分規(guī)定:
高端的128個RAM(80-FFH)必須用【間接訪問指令】讀取,
而對特殊寄存器則采用【直接訪問指令】讀取。
如果你精通匯編,這一點就清楚了!
而對于低端的RAM(0-7FH)則隨便你用哪種方式訪問。
當(dāng)你用C寫程序時,編譯器會替你注意的,但需要你知它:變量放在哪!
編譯器會將你的C程序,編譯成匯編,并注意到【訪問指令】用直接還是間接。

STC在特殊寄存器上做了大量的文章,擴(kuò)充了許多標(biāo)準(zhǔn)51沒有東東,乃至用滿了80-FFH特殊寄存器地址,還不夠!
于是STC人又在XRAM區(qū)域,取出部分地址,用作【擴(kuò)展特殊寄存器】,對此,標(biāo)準(zhǔn)的編譯方式無法作出區(qū)分的,寫程序時,需要你按STC的CPU說明來寫。
這也是,有些程序在不同芯片之間不能通用的原因之一。也是為什么要用#INCLUDE將芯片型號,告訴編譯器的原因之一。
以上希望能幫到你。如果你想在單片機上成為高手,必須精通匯編,即使用你不用它,而用C寫程序。

作者: wufa1986    時間: 2022-9-19 15:08
需要堆棧用于調(diào)用程序,局部變量,中斷處理
作者: 紅燒魚頭    時間: 2022-9-20 07:59
yzwzfyz 發(fā)表于 2022-9-19 08:51
1、編譯器一般會從30H開始規(guī)劃RAM的使用,這樣你只能用30H-7FH。
2、系統(tǒng)會根據(jù)程序中,子程序調(diào)用的深度 ...

謝謝大佬!這幾天我也查了一些資料,大概都明白了。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1