在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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è)搶先式“裸奔“系統(tǒng)的設(shè)計(jì)

            一個(gè)搶先式“裸奔“系統(tǒng)的設(shè)計(jì)

            作者: 時(shí)間:2012-12-16 來(lái)源:網(wǎng)絡(luò) 收藏


            2 程序主執(zhí)行函數(shù)main()函數(shù)
            c.JPG
            d.JPG
            main()函數(shù)也非常簡(jiǎn)單。首先,調(diào)用Sys_init()完成單片機(jī)硬件系統(tǒng)的初始化;然后調(diào)用I2c_svr(),完成I2C總線通信系統(tǒng)的初始化,并執(zhí)行數(shù)據(jù)傳輸,本函數(shù)稍后將作詳細(xì)的介紹;接下來(lái)是一個(gè)while(1)主循環(huán),其中的mainfunc()是執(zhí)行主要任務(wù)的函數(shù),完成系統(tǒng)的主要功能,并返回一個(gè)bool變量,這個(gè)變量用于I2C總線數(shù)據(jù)傳輸?shù)恼?qǐng)求;
            這里定義了一個(gè)bool型變量bi2csvr。作用:由mainfunc()執(zhí)行結(jié)果來(lái)置位,系統(tǒng)根據(jù)此標(biāo)志,啟動(dòng)數(shù)據(jù)通信,并在數(shù)據(jù)傳輸完成后清零這個(gè)標(biāo)志。

            3 I2C總線通信服務(wù)程序
            通信服務(wù)程序I2c_svr()函數(shù)代碼如下:
            e.JPG
            這個(gè)函數(shù)看起來(lái)也不復(fù)雜,但是需要讀者用RTOS任務(wù)的概念來(lái)理解這個(gè)函數(shù)。
            首先,關(guān)于寄存器組,這里的I2C服務(wù)程序I2c_svr()使用了單獨(dú)的寄存器組(寄存器組1),由于#pragmarb(1)編譯指令并不會(huì)讓編譯器自動(dòng)生成切換寄存器組的指令,所以I2c_svr()中又通過(guò)修改PSW特殊寄存器來(lái)切換到工作寄存器組1。當(dāng)然,要切換寄存器組,還需要確認(rèn)在切換前,本函數(shù)沒(méi)有使用工作寄存器。
            同時(shí),I2c_svr()的初始化部分還執(zhí)行了特殊功能寄存器壓棧保存和切換堆棧指針SP,這些本是實(shí)時(shí)內(nèi)核調(diào)度器里要完成的任務(wù),在這里的出現(xiàn)相當(dāng)于建立了新的任務(wù)。
            接下來(lái)的while(1)表明,這里相當(dāng)于實(shí)時(shí)系統(tǒng)里的一個(gè)任務(wù)了。
            這個(gè)任務(wù)很簡(jiǎn)單,i2write()的功能就是通過(guò)I2C總線,發(fā)送數(shù)據(jù)緩沖區(qū)里所有的數(shù)據(jù),在這里就不做詳細(xì)介紹了。在發(fā)送完成后,清零數(shù)據(jù)發(fā)送請(qǐng)求標(biāo)志位bi2csvr,然后執(zhí)行延時(shí)等待。

            4 定時(shí)中斷和延時(shí)函數(shù)
            搶先系統(tǒng)的關(guān)鍵部分是定時(shí)中斷timer1()和延時(shí)函數(shù)idelay(),代碼如下:
            f.JPG
            首先看tsksw()宏,它的作用是保存堆棧指針并切換堆棧。這等同于RTOS里任務(wù)的上下文切換,但這里僅切換一下堆棧指針即可。
            接下來(lái)看這個(gè)定時(shí)中斷服務(wù)函數(shù)timer1(),其中systern_tmr()是個(gè)修改定時(shí)器TH0的函數(shù),這里不作介紹了。隨后,約束判斷(后面再作詳細(xì)介紹)再通過(guò)tsksw()函數(shù)進(jìn)行任務(wù)間的切換。
            接下來(lái)看延時(shí)函數(shù)idelay(),它提供I2C總線時(shí)序里要求的延時(shí)函數(shù)。注意:我們通常都是使用若干nop或者類似“for(x=LOOP;x>0;x——);”的延時(shí)來(lái)完成的,但這里一改這類傳統(tǒng)的方式,而是通過(guò)“任務(wù)切換”將CPU控制權(quán)交給另外一個(gè)任務(wù)main來(lái)實(shí)現(xiàn)的。需要特別指出,idelay()里的關(guān)中斷很重要,學(xué)習(xí)過(guò)RTOS的讀者應(yīng)該都記得RTOS里面的“臨界段代碼”的概念。
            最后,介紹上面未詳細(xì)說(shuō)明的定時(shí)中斷服務(wù)函數(shù)timer1()中任務(wù)切換的約束判斷。bi2csvr是I2C總線請(qǐng)求標(biāo)志,如果這個(gè)標(biāo)志為零,則表示不需要I2C總線的通信服務(wù),定時(shí)中斷里也就不需要做任務(wù)切換;此外,bi2cdly也是個(gè)控制切換的小技巧,該標(biāo)志在idelay()中置位,在定時(shí)中斷服務(wù)中判斷并清零。也就是在執(zhí)行idelay()后發(fā)生的第一次定時(shí)中斷里只清除這個(gè)標(biāo)志,而在第二次定時(shí)中斷中才可能發(fā)生任務(wù)切換,以此保證idelay()的延時(shí)時(shí)間一定不少于一個(gè)定時(shí)器的溢出周期。


            評(píng)論


            相關(guān)推薦

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

            關(guān)閉