|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
Keil c函數(shù)參數(shù)傳遞的討論 |
| 作者:yanfengzhu 欄目:單片機(jī) |
引起我注意Keil c函數(shù)參數(shù)傳遞的是在一個(gè)偶然的機(jī)會(huì),我在寫一個(gè)函數(shù)的時(shí)候:如下 write_byte(uLONG addr, uCHAR dat) { … } 我原本以為addr會(huì)通過R4—R7來傳遞,而dat則通過R3傳遞的,在調(diào)試的時(shí)候卻發(fā)現(xiàn)dat是通過固定地址儲(chǔ)存區(qū)傳遞的。因此引發(fā)了我想知道它到底是怎樣傳遞參數(shù)的。 因?yàn)榇蠹叶贾,keil c的參數(shù)傳遞規(guī)則 參數(shù) CHAR, int, LONG, generic 數(shù)目 1-byte pointer 2-byte pointer float pointer 1 R7 R6 & R7 R4-R7 R1-R3 2 R5 R4 & R5 3 R3 R2 & R3 我原本以為三個(gè)int參數(shù)都通過寄存器能傳遞,一個(gè)uLONG和一個(gè)uCHAR應(yīng)該也可以吧,真是有點(diǎn)不明白。如果寫為如下 write_byte(uLONG addr, uCHAR * dat) { … } 即一個(gè)uLONG參數(shù)和一個(gè)指針參數(shù)則都能通過寄存器傳遞。 導(dǎo)致上面第二個(gè)uCHAR參數(shù)不通過寄存器傳遞的原因大概是因?yàn)榈诙䝼(gè)uCHAR型參數(shù)一定要通過R5來傳遞吧,而第一個(gè)uLONG型參數(shù)正好用了R5,所以dat就只能通過固定地址的存儲(chǔ)區(qū)來傳遞了。 為此我就想測試一下如果不通過寄存器來傳遞參數(shù)或通過模擬棧來傳遞參數(shù)時(shí)參數(shù)的傳遞情況會(huì)是怎樣的。 第一個(gè)例子如下,通過寄存器傳遞參數(shù),代碼共101字節(jié)。 void delay(uLONG dlyh, uint dlyl) { while(dlyh--); while(dlyl--); } void main(void) { delay(0x100, 0x50); while(1); } 匯編代碼如下, RSEG ?PR?_delay?TEST_PARA _delay: USING 0 ; SOURCE LINE # 6 MOV dlyh?040+03H,R7 ;把從寄存器R4—R7傳來的第一個(gè)參數(shù) MOV dlyh?040+02H,R6 ;存入固定地址。 MOV dlyh?040+01H,R5 ;(有時(shí)真覺得這動(dòng)作啥冒) MOV dlyh?040,R4 ; { ; SOURCE LINE # 7 ?C0001: ; while(dlyh--); ; SOURCE LINE # 8 MOV R0,#LOW (dlyh?040) MOV A,#0FFH LCALL ?C?LLDIIDATA8 MOV A,R4 ORL A,R5 ORL A,R6 ORL A,R7 JNZ ?C0001 ?C0003: ; while(dlyl--); ; SOURCE LINE # 9 MOV A,dlyl?041+01H DEC dlyl?041+01H MOV R6,dlyl?041 JNZ ?C0009 DEC dlyl?041 ?C0009: ORL A,R6 JNZ ?C0003 ; } ; SOURCE LINE # 10 ?C0005: RET ; END OF _delay ; ; void main(void) RSEG ?PR?main?TEST_PARA main: USING 0 ; SOURCE LINE # 12 ; { ; SOURCE LINE # 13 ; delay(0x100, 0x50); ; SOURCE LINE # 14 MOV ?_delay?BYTE+04H,#00H ;傳遞第二個(gè)參數(shù) MOV ?_delay?BYTE+05H,#050H MOV R7,#00H ;傳遞第一個(gè)參數(shù) MOV R6,#01H MOV R5,#00H MOV R4,#00H |
| 2樓: | >>參與討論 |
| 作者: hotpower 于 2005/6/19 19:06:00 發(fā)布:
好帖... 鉆研的不錯(cuò),我總感覺LONG類型等最好用指針傳遞. MCU最好少用LONG類型. |
|
| 3樓: | >>參與討論 |
| 作者: brekai 于 2005/6/19 20:42:00 發(fā)布:
好想法. 強(qiáng)頂 |
|
| 4樓: | >>參與討論 |
| 作者: yanfengzhu 于 2005/6/22 15:18:00 發(fā)布:
謝謝兩位!這幾天沒什么時(shí)間上網(wǎng)。 |
|
| 5樓: | >>參與討論 |
| 作者: aoshi 于 2005/6/22 16:10:00 發(fā)布:
建議看下c51的相關(guān)文檔,也許能知道為什么 |
|
| 6樓: | >>參與討論 |
| 作者: chunk 于 2005/6/28 13:31:00 發(fā)布:
研究的不錯(cuò),但還是不夠精。至少還有兩個(gè)點(diǎn): (1)通過“指向函數(shù)的指針”調(diào)用該函數(shù) (2)從“中斷服務(wù)程序”中調(diào)用其它函數(shù) |
|
| 7樓: | >>參與討論 |
| 作者: binbinkx 于 2005/6/29 16:22:00 發(fā)布:
跪求幫助,keilC51 extern unsigned int SumXY(unsigned int X,Y); extern void Delay(unsigned CHAR T); void main(void) {unsigned int a,b,c; a=0x5500; b=0x00aa; while (1) { Delay(100); c=SumXY(a,b); } } #pragma ASM PUBLIC _SumXY ?PR?_SumXY?FUNCASM SEGMENT CODE RSEG ?PR?_SumXY?FUNCASM _SumXY: MOV A,R7 ADD A,R5 MOV A,R6 ADDC A,R4 MOV R6,A RET #pragma ENDASM void Delay(unsigned CHAR T) {unsigned CHAR i; for (i=0;i<T;i++) { for (i=0;i<T;i++) {} } } 編譯后的錯(cuò)誤: compiling ic.c... assembling ic.src... ic.src(64): error A33: CONFLICTING ATTRIBUTES ic.src(67): error A8: ATTEMPT TO DEFINE AN ALREADY DEFINED LABEL Target not created |
|
| 8樓: | >>參與討論 |
| 作者: chenhu 于 2005/6/29 22:37:00 發(fā)布:
在程序的開頭加上 #pragma SRC |
|
| 9樓: | >>參與討論 |
| 作者: ypli 于 2005/7/1 9:07:00 發(fā)布:
KEIL也要進(jìn)行相應(yīng)的設(shè)置吧! |
|
| 10樓: | >>參與討論 |
| 作者: liudewei 于 2005/7/1 23:19:00 發(fā)布:
最保險(xiǎn)就是看看編譯后的匯編代碼 |
|
| 11樓: | >>參與討論 |
| 作者: taoest 于 2005/7/2 0:32:00 發(fā)布:
各位大哥,都C了,還研究里面的實(shí)現(xiàn)細(xì)節(jié)做什么 各位大哥,都C了,還研究里面的實(shí)現(xiàn)細(xì)節(jié)做什么。 研究有用嗎? 就算研究出來了,某天KEIL換了一個(gè)更高效率的傳法,你又要重新研究過嗎? 還不如老老實(shí)實(shí)地寫C,用C能做好你要做的事情了。 |
|
| 12樓: | >>參與討論 |
| 作者: narcissa 于 2005/7/5 14:44:00 發(fā)布:
樓上兄弟趕的慢點(diǎn),咱追不上了 |
|
| 13樓: | >>參與討論 |
| 作者: Denorth00 于 2005/7/10 17:34:00 發(fā)布:
謝謝,有收獲! |
|
| 14樓: | >>參與討論 |
| 作者: foxfree520 于 2005/7/20 15:40:00 發(fā)布:
疑問 不好意思,我每看懂,你能否解釋一下呀? 謝謝 |
|
| 15樓: | >>參與討論 |
| 作者: yanfengzhu 于 2005/7/20 18:57:00 發(fā)布:
to foxfree520,不知是哪不明白? |
|
| 16樓: | >>參與討論 |
| 作者: SHUNQIAO 于 2005/8/1 11:19:00 發(fā)布:
好貼! |
|
| 17樓: | >>參與討論 |
| 作者: ketp 于 2005/8/1 12:54:00 發(fā)布:
- 參數(shù)的順序也是很重要的,象第一個(gè)例子,就可以調(diào)換一下參數(shù)的順序。 還有,用寄存器傳遞參數(shù)才有可能重入,你要是用過small RTOS 就知道這有多重要了。 |
|
| 18樓: | >>參與討論 |
| 作者: leisureok 于 2005/8/4 18:51:00 發(fā)布:
頂 以后還要學(xué)習(xí)。。 |
|
| 19樓: | >>參與討論 |
| 作者: zzm503 于 2005/9/1 8:25:00 發(fā)布:
學(xué)習(xí)緊。。!11111 |
|
| 20樓: | >>參與討論 |
| 作者: qwrrt 于 2005/9/20 8:12:00 發(fā)布:
行,有價(jià)值 多多努力 |
|
| 21樓: | >>參與討論 |
| 作者: QWRRT 于 2005/9/20 8:18:00 發(fā)布:
很有想法 我喜歡 |
|
| 22樓: | >>參與討論 |
| 作者: wuweikang 于 2005/10/2 11:22:00 發(fā)布:
通過固定存儲(chǔ)區(qū)傳遞參數(shù) 我比較喜歡通過固定存儲(chǔ)區(qū)傳遞參數(shù),就是定義全局變量。不夠這樣以來代碼不夠靈活。在全局變量比較少的小程序里可以用用。 |
|
| 23樓: | >>參與討論 |
| 作者: 國保 于 2005/10/30 9:58:00 發(fā)布:
不是很理解,自己先試試看. |
|
| 24樓: | >>參與討論 |
| 作者: zxpkongjun 于 2005/12/4 1:42:00 發(fā)布:
希望大家高手幫助 大家好 我是一名研一的學(xué)生,學(xué)的是信號(hào)處理.我現(xiàn)在想接觸單片機(jī),應(yīng)該怎么開始.匯編和C語言我都會(huì),當(dāng)傾向于用C語言,還有Keil C編譯器.我應(yīng)如何下手,是不是可以通過做一個(gè)具體的電路,應(yīng)該選擇那一種單片機(jī). |
|
| 25樓: | >>參與討論 |
| 作者: Jaddycui 于 2005/12/7 18:43:00 發(fā)布:
看看這些也許能找到問題的所在! 參數(shù)傳遞規(guī)則例子: fun1(int a) //a是第一個(gè)參數(shù),在R6,R7中傳遞. fun2(int b ,int c , int *d) //b在R6,R7中傳遞;C在R4,R5中傳遞;d在 //R1,R2,R3中傳遞. fun3(LONG e ,LONG f) //e在R4-R7中傳遞;f不能在寄存器中傳遞,只 //能在參數(shù)傳遞段中傳遞. fun3(float g ,CHAR h) //g在R4-R7中傳遞;h不能在寄存器中傳遞,只 //能在參數(shù)傳遞段中傳遞. |
|
| 26樓: | >>參與討論 |
| 作者: martial 于 2005/12/21 8:52:00 發(fā)布:
有點(diǎn)沒看明白??? 第一和第二個(gè)例子都是同一個(gè)C函數(shù),內(nèi)部由什么決定用哪種方式傳遞?? |
|
| 27樓: | >>參與討論 |
| 作者: ihoooo118 于 2005/12/21 10:55:00 發(fā)布:
re:Jaddycui 你好!我以前沒用過KEIL C fun3(LONG e ,LONG f) //e在R4-R7中傳遞;f不能在寄存器中傳遞,只 //能在參數(shù)傳遞段中傳遞 是不是這樣調(diào)就要出錯(cuò)? 參數(shù)傳遞段?是指什么,固定存儲(chǔ)區(qū)嗎? |
|
| 28樓: | >>參與討論 |
| 作者: 旋風(fēng)羊 于 2006/2/6 22:39:00 發(fā)布:
收了 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |