音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
C任務(wù)的討論——什么樣的函數(shù)可以聲明為C任務(wù)
我們先看一個(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è)
#pragma ctask 的函數(shù)
 需要自己保護(hù)現(xiàn)場(chǎng),嵌入?yún)R編操作

3樓: >>參與討論
licel
C 任務(wù)函數(shù)
確認(rèn)不需要保護(hù)堆棧和寄存器的函數(shù)可以聲明為C 任務(wù)函數(shù)

4樓: >>參與討論
NE5532
在不同的環(huán)境下,同一個(gè)任務(wù)可能使用或者不使用寄存器的。
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
雙龍的ISP下載軟件燒TINY2313時(shí),為什麼不能選WDTON熔絲位?
請(qǐng)教“*.pdg”用什么軟件來(lái)讀這個(gè)文件
AVR的位操作
關(guān)于8515的T/C1模塊的問(wèn)題。希望得到幫助!
關(guān)于ATMEL 原裝JTAG ICE仿真問(wèn)題.
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)