在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 建立一個(gè)屬于自己的AVR的RTOS(1)—函數(shù)的運(yùn)行

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

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

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

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

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

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

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

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

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

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

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

            好了,當(dāng)這一切準(zhǔn)備好后,我們就可以開始我們的Rtos for mega8的實(shí)驗(yàn)之旅了。

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

            第一篇:函數(shù)的運(yùn)行

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

            例子如下:

            makefile的設(shè)定:運(yùn)行WinAvr中的Mfile,設(shè)定如下

            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)題:如果要調(diào)用一個(gè)函數(shù),真是只能以上面的方式進(jìn)行嗎?

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

            例子:用函數(shù)指針變量調(diào)用函數(shù)

            #include

            void fun1(void)

            {

            unsigned char i=0;

            while(1)

            {

            PORTB=i++;

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

            }

            }

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

            int main(void)

            {

            pfun=fun1; //

            (*pfun)(); //運(yùn)行指針?biāo)赶虻暮瘮?shù)

            }

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

            #include

            void fun1(void)

            {

            unsigned char i=0;

            while(1)

            {

            PORTB=i++;

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

            }

            }

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

            {

            (*pfun)(); //在RunFun中,運(yùn)行指針?biāo)赶虻暮瘮?shù)

            }

            int main(void)

            {

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

            }

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

            以下是GCC對(duì)上面的代碼的編譯的情況:

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

            ldi r24,lo8(pm(fun1))

            ldi r25,hi8(pm(fun1))

            rcall RunFun

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

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

            /*(*pfun)();*/

            .LM6:

            movw r30,r24

            icall

            ret

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



            關(guān)鍵詞: AVRRTOS函

            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉