<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 建立一個(gè)屬于自己的AVR的RTOS(1)—函數的運行

建立一個(gè)屬于自己的AVR的RTOS(1)—函數的運行

作者: 時(shí)間:2016-12-03 來(lái)源:網(wǎng)絡(luò ) 收藏
自從03年以來(lái),對單片機RTOS的學(xué)習和應用的熱潮可謂一浪高過(guò)一浪.03年,在離開(kāi)校園前的,非典的那幾個(gè)月,在華師的后門(mén)那里買(mǎi)了本邵貝貝的《UCOSII》,通讀了幾次,沒(méi)有實(shí)驗器材,也不了了之。

在21IC上,大家都可以看到楊屹寫(xiě)的關(guān)于UCOSII在51上的移植,于是掀起了51上的RTOS的熱潮。

本文引用地址:http://dyxdggzs.com/article/201612/325272.htm

再后來(lái),陳明計先生推出的small rots,展示了一個(gè)用在51上的微內核,足以在52上進(jìn)行任務(wù)調度。

前段時(shí)間,在ouravr上面開(kāi)有專(zhuān)門(mén)關(guān)于AVR的Rtos的專(zhuān)欄,并且不少的兄弟把自己的作品拿出來(lái),著(zhù)實(shí)開(kāi)了不少眼界。這時(shí),我重新回顧了使用單片機的經(jīng)歷,覺(jué)得很有必要,從根本上對單片機的RTOS的知識進(jìn)行整理,于是,我開(kāi)始了編寫(xiě)一個(gè)用在A(yíng)VR單片機的RTOS。

當時(shí),我所有的知識和資源有:

Proteus6.7可以用來(lái)模擬仿真avr系列的單片機

WinAVR v2.0.5.48基于GCC AVR的編譯環(huán)境,好處在于可以在C語(yǔ)言中插入asm的語(yǔ)句

mega8 1K的ram有8K的rom,是開(kāi)發(fā)8位的RTOS的一個(gè)理想的器件,并且我對它也比較熟悉。

寫(xiě)UCOS的Jean J.Labrosse在他的書(shū)上有這樣一句話(huà),“漸漸地,我自然會(huì )想到,寫(xiě)個(gè)實(shí)時(shí)內核直有那么難嗎?不就是不斷地保存,恢復CPU的那些寄存器嘛。”

好了,當這一切準備好后,我們就可以開(kāi)始我們的Rtos for mega8的實(shí)驗之旅了。

本文列出的例子,全部完整可用。只需要一個(gè)文件就可以編譯了。我相信,只要適當可用,最簡(jiǎn)單的就是最好的,這樣可以排除一些不必要的干擾,讓大家專(zhuān)注到每一個(gè)過(guò)程的學(xué)習。

第一篇:函數的運行

在一般的單片機系統中,是以前后臺的方式(大循環(huán)+中斷)來(lái)處理數據和作出反應的。

例子如下:

makefile的設定:運行WinAvr中的Mfile,設定如下

MCU Type: mega8

Optimization level: s

Debug format :AVR-COFF

C/C++ source file:選譯要編譯的C文件

#include

void fun1(void)

{

unsigned char i=0;

while(1)

{

PORTB=i++;

PORTC=0x01<<(i%8);

}

}

int main(void)

{

fun1();

}

首先,提出一個(gè)問(wèn)題:如果要調用一個(gè)函數,真是只能以上面的方式進(jìn)行嗎?

相信學(xué)習過(guò)C語(yǔ)言的各位會(huì )回答,No!我們還有一種方式,就是“用函數指針變量調用函數”,如果大家都和我一樣,當初的教科書(shū)是譚浩強先生的《C程序設計》的話(huà),請找回書(shū)的第9.5節。

例子:用函數指針變量調用函數

#include

void fun1(void)

{

unsigned char i=0;

while(1)

{

PORTB=i++;

PORTC=0x01<<(i%8);

}

}

void (*pfun)(); //指向函數的指針

int main(void)

{

pfun=fun1; //

(*pfun)(); //運行指針所指向的函數

}

第二種,是“把指向函數的指針變量作函數參數”

#include

void fun1(void)

{

unsigned char i=0;

while(1)

{

PORTB=i++;

PORTC=0x01<<(i%8);

}

}

void RunFun(void (*pfun)()) //獲得了要傳遞的函數的地址

{

(*pfun)(); //在RunFun中,運行指針所指向的函數

}

int main(void)

{

RunFun(fun1); //將函數的指針作為變量傳遞

}

看到上面的兩種方式,很多人可能會(huì )說(shuō),“這的確不錯”,但是這樣與我們想要的RTOS,有什么關(guān)系呢?各位請細心向下看。

以下是GCC對上面的代碼的編譯的情況:

對main()中的RunFun(fun1);的編譯如下

ldi r24,lo8(pm(fun1))

ldi r25,hi8(pm(fun1))

rcall RunFun

對void RunFun(void (*pfun)())的編譯如下

/*void RunFun(void (*pfun)())*/

/*(*pfun)();*/

.LM6:

movw r30,r24

icall

ret

在調用void RunFun(void (*pfun)())的時(shí)候,的確可以把fun1的地址通過(guò)r24和r25傳遞給RunFun()。但是,RTOS如何才能有效地利用函數的地址呢?



關(guān)鍵詞: AVRRTOS函

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>