|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | 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 |
C任務(wù)的討論——什么樣的函數(shù)可以聲明為C任務(wù) |
| 作者:NE5532 欄目:單片機(jī) |
我們先看一個(gè)uS級(jí)的延遲函數(shù): #pragma ctask delay_us void delay_us(CHAR us_time) { while(us_time>1) us_time--; } 這個(gè)函數(shù)被聲明為C任務(wù) 他的匯編對(duì)應(yīng)于: _delay_us:: .dbline -1 .dbline 23 ; # include <iom8v.h> ; # include <macros.h> ; # include "C0501.h" ; ; void init_DEVICEs (void) ; { ; DDRD=0xFF; ; PORTD=0xFF; ; } ; ; void main(void) ; { ; CHAR addr[2]; ; CHAR DEVICE[1]; ; CHAR data_length; ; ; init_DEVICEs(); ; ; while(1) ; { ; DEVICE[0]=0xA0; ; addr[0]=0x00; ; addr[1]=0x00; rjmp L3 L2: .dbline 25 dec R16 L3: .dbline 24 ; data_length=1; ldi R24,1 cp R24,R16 brlo L2 .dbline -2 .dbline 26 ; i2c_trans(addr,DEVICE,data_length); ; } L1: .dbline 0 ; func end ret (照搬照考,里面有些亂七八糟的東西,沒(méi)有去理會(huì)它) 將聲明#pragma ctask delay_us去掉,從新編譯。 經(jīng)過(guò)UltraEdit32編輯器檢查,沒(méi)有發(fā)現(xiàn)這段函數(shù)編譯后有什么變化。 按照規(guī)定,能夠聲明為C任務(wù)的條件是:能夠肯定函數(shù)不會(huì)使用任何寄存器,但是這里,我們可以看到,程序用了R24和R16其中R24屬于C調(diào)用匯編時(shí)不用插入現(xiàn)場(chǎng)保護(hù)的寄存器。 按照沈老師《AVR單片機(jī)C語(yǔ)言開發(fā)入門指導(dǎo)》P181中例4.5,對(duì)這個(gè)函數(shù)少加改造后成為: #pragma ctask delay_us void delay_us(CHAR us_time) { while(us_time) us_time--; } 其對(duì)應(yīng)的匯編為: _delay_us:: .dbline -1 .dbline 23 ; # include <iom8v.h> ; # include <macros.h> ; # include "C0501.h" ; ; void init_DEVICEs (void) ; { ; DDRD=0xFF; ; PORTD=0xFF; ; } ; ; void main(void) ; { ; CHAR addr[2]; ; CHAR DEVICE[1]; ; CHAR data_length; ; ; init_DEVICEs(); ; ; while(1) ; { ; DEVICE[0]=0xA0; ; addr[0]=0x00; ; addr[1]=0x00; rjmp L3 L2: .dbline 25 dec R16 L3: .dbline 24 ; data_length=1; tst R16 brne L2 .dbline -2 .dbline 26 ; i2c_trans(addr,DEVICE,data_length); ; } L1: .dbline 0 ; func end ret 還是使用了R16,只不過(guò)R16是C編譯器不使用的罷了。 那么,我還有一個(gè)mS級(jí)的延遲函數(shù): #pragma ctask delay_ms void delay_ms(CHAR ms_time) { unsigned CHAR i; while(ms_time>0) { for (i=1;i<(unsigned int)2286;i++) ; ms_time--; } } 他對(duì)應(yīng)的匯編是: _delay_ms:: .dbline -1 .dbline 31 ; } ; } ; } ; } ; } rjmp L7 L6: .dbline 34 ; } ; } ; } .dbline 35 ; } ldi R20,1 rjmp L12 L9: .dbline 36 L10: .dbline 35 inc R20 L12: .dbline 35 cpi R20,238 brlo L9 .dbline 37 dec R16 .dbline 38 L7: .dbline 33 clr R2 cp R2,R16 brlo L6 .dbline -2 .dbline 39 ; } ; } ; } ; } L5: .dbline 0 ; func end ret 這里使用了R16和R20,其中R20是C調(diào)用匯編時(shí)必須插入現(xiàn)場(chǎng)保護(hù)的寄存器。按照一般的編譯器經(jīng)驗(yàn),for循環(huán)中的變量會(huì)被安排為寄存器變量,(很明顯,這里的R20被作為了for循環(huán)中的i變量使用)那么,在制定一個(gè)函數(shù)為C任務(wù)的時(shí)候,如果函數(shù)中含有for循環(huán)(或者while循環(huán))能否確定這個(gè)函數(shù)所使用的寄存器不破壞C的現(xiàn)場(chǎng)呢? 什么樣的函數(shù)可以被定義為C任務(wù)呢? |
| 2樓: | >>參與討論 |
| 作者: 音樂(lè)樂(lè)樂(lè) 于 2005/1/3 20:22:00 發(fā)布:
#pragma ctask 的函數(shù) 需要自己保護(hù)現(xiàn)場(chǎng),嵌入?yún)R編操作 |
|
| 3樓: | >>參與討論 |
| 作者: licel 于 2005/1/16 17:42:00 發(fā)布:
C 任務(wù)函數(shù) 確認(rèn)不需要保護(hù)堆棧和寄存器的函數(shù)可以聲明為C 任務(wù)函數(shù) |
|
| 4樓: | >>參與討論 |
| 作者: NE5532 于 2005/1/16 21:49:00 發(fā)布:
在不同的環(huán)境下,同一個(gè)任務(wù)可能使用或者不使用寄存器的。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |