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

登錄 免費(fèi)注冊(cè) 首頁 | 行業(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

μCOS-II下中斷服務(wù)子程序的編寫?

作者:上善若水 欄目:ARM技術(shù)
μCOS-II下中斷服務(wù)子程序的編寫?

在μCOS-II下中斷服務(wù)子程序的編寫和普通的前后臺(tái)系統(tǒng)有什么不同呢?在網(wǎng)上廣泛流傳的一篇文檔中闡述如下:
ISR:
{
保存處理器寄存器的值;
調(diào)用OSIntEnter();
執(zhí)行用戶的工作;
調(diào)用OSIntExit();
恢復(fù)處理器寄存器的值;
RTI;
}
用戶的中斷形式和以前一樣,沒有什么大的變化,僅僅是在原來用戶ISR的基礎(chǔ)上在固定的位置加了兩個(gè)函數(shù):OSIntEnter(), OSIntExit().

但看ZLG給出的串口驅(qū)動(dòng)中的中斷服務(wù)子程序如下:
void UART0_Exception(void)
{   ……
    OS_ENTER_CRITICAL();
    while(((IIR = U0IIR) & 0x01) == 0)
    {                                                   /* 有中斷未處理完 */
        SWITCH (IIR & 0x0e)
        {
            ……
            case 0x04:                                  /* 接收數(shù)據(jù)可用 */
                OSSemPost(Uart0Sem);                    /* 通知接收任務(wù) */
                U0IER = U0IER & (~0x01);                /* 禁止接收及字符超時(shí)中斷 */
                break;
            ……
        }
    }
    VICVectAddr = 0;            // 通知中斷控制器中斷結(jié)束
    OS_EXIT_CRITICAL();
}
在周立功《ARM嵌入式系統(tǒng)基礎(chǔ)教程》第428頁中對(duì)此有詳細(xì)的論述,(可是我不太明白)

請(qǐng)問大家通常在μCOS-II下編寫的中斷服務(wù)程序較之普通的前后臺(tái)系統(tǒng)有什么不同?能否給出個(gè)中斷服務(wù)子程序的示例程序讓我學(xué)習(xí)一下,謝謝。

2樓: >>參與討論
hotpower
我認(rèn)為主要是中斷返回后給高級(jí)別任務(wù)一次任務(wù)切換的機(jī)會(huì)
并不是每個(gè)中斷服務(wù)子程序都必須這樣,有時(shí)苦惱很糟糕.

采用OSIntEnter()/OS_ENTER_CRITICAL()/OSIntExit()/OS_EXIT_CRITICAL()
后,必然要增加系統(tǒng)的負(fù)擔(dān).
但如果不這樣做,如果中斷退出后,只能返回當(dāng)時(shí)被中斷的任務(wù),而這個(gè)任務(wù)可能是一個(gè)比較低級(jí)的任務(wù).
采用OS的中斷管理函數(shù)后,退出中斷可能會(huì)完成一次高級(jí)別的任務(wù)切換,而不必等待節(jié)拍中斷再切換高級(jí)別任務(wù).

一般在中斷中最好快速實(shí)現(xiàn)一般功能,若需長(zhǎng)時(shí)間工作,就不應(yīng)該呆在中斷中蠻干,這樣可能丟失很多有用的中斷.

事件激活一般需要實(shí)時(shí),但處理并非要立即處理,可以在退出中斷后交給處理任務(wù)來實(shí)現(xiàn)...

OSSemPost(Uart0Sem);                    /* 通知接收任務(wù) */
就是想將本來應(yīng)該在中斷中處理的任務(wù)移出中斷后能盡快地處理,而在其處理期間其他硬件中斷也可響應(yīng).

只用于接收的任務(wù)一般級(jí)別較高,因?yàn)樗皇且淮涡蕴幚?被動(dòng)處理).

這樣定義級(jí)別后,退出中斷后一般就可立即處理了,這與在中斷中處理而無其他中斷再來的情況是基本一樣的.

如果在中斷中只處理極短的時(shí)間,即遠(yuǎn)遠(yuǎn)小于調(diào)用OS管理函數(shù)的時(shí)間,那么用OS函數(shù),反而會(huì)帶來降低效率的反作用.

至于OS和前后臺(tái)有什么不同就很難說了,不過大家都想及時(shí)處理任務(wù),提高系統(tǒng)的效率.

不一定OS程序都比前后臺(tái)程序都好用,大馬拉小車真不如裸奔?jí)蚩?

當(dāng)然,在ARM中裸奔確實(shí)不雅,但裸奔也并非丟臉...

3樓: >>參與討論
上善若水
請(qǐng)問hotpower:
1、為什么“只用于接收的任務(wù)一般級(jí)別較高,”時(shí),那個(gè)用來接受的任務(wù)就是“一次性處理(被動(dòng)處理).”?

2、在什么情況下,μCOS-II下的中斷服務(wù)子程序可以象前后臺(tái)中的那樣編,也就是說不用將其用
OSIntEnter()/OS_ENTER_CRITICAL()/OSIntExit()/OS_EXIT_CRITICAL()封裝起來,只是在其中發(fā)送必要的信號(hào)量和郵箱?是不是當(dāng)希望中斷返回的任務(wù)中斷優(yōu)先級(jí)比較高?

3、在上面的程序中:
case 0x04:                                  /* 接收數(shù)據(jù)可用 */
      OSSemPost(Uart0Sem);                    /* 通知接收任務(wù) */
      U0IER = U0IER & (~0x01);                /* 禁止接收及字符超時(shí)中斷 */
      break;
為什么要在發(fā)送完信號(hào)量后禁止接收及字符超時(shí)中斷?
ZLG提供的串口驅(qū)動(dòng)中與此相配的一個(gè)用于接收的函數(shù)如下:
uint8 UART0Getch(void)
{
    uint8 err;
    OS_ENTER_CRITICAL();
    while ((U0LSR & 0x00000001) == 0)
    {                                           /* 沒有收到數(shù)據(jù) */
        U0IER = U0IER | 0x01;                   /* 允許接收中斷 */
        OSSemPend(Uart0Sem, 0, &err);           /* 等待接收數(shù)據(jù) */
    }
    err = U0RBR;                                /* 讀取收到的數(shù)據(jù) */
    OS_EXIT_CRITICAL();
    return err;
}
我想ZLG之所以不在中斷服務(wù)子程序中進(jìn)行接收處理,正是象您說的:“一般在中斷中最好快速實(shí)現(xiàn)一般功能,若需長(zhǎng)時(shí)間工作,就不應(yīng)該呆在中斷中蠻干,這樣可能丟失很多有用的中斷.”但這個(gè)接收無非就是“err = U0RBR;”一條語句,單獨(dú)處理來回開關(guān)中斷有必要嗎?ZLG這么處理的用意何在?  



4樓: >>參與討論
hotpower
這個(gè)問題有回到了前后臺(tái)
前后臺(tái)與OS有區(qū)別嗎???

有又沒有...因?yàn)镺S就是從好的前后臺(tái)程序中提煉的,不過是前后臺(tái)的通用版罷了.

OS簡(jiǎn)化了前后臺(tái)各自為戰(zhàn)的場(chǎng)面,但卻帶來了任務(wù)切換的負(fù)擔(dān).

前后臺(tái)中的后臺(tái)狀態(tài)或標(biāo)志輪詢次序?qū)嶋H就是OS的任務(wù)級(jí)別.
前后臺(tái)輪詢次序分配的好壞和選定OS的級(jí)別是一個(gè)道理.

OS的好處是任務(wù)的強(qiáng)占切換,而典型的后臺(tái)處理一般為順序的.
順序執(zhí)行是后臺(tái)處理的缺點(diǎn)所在,因?yàn)轫樞蚺帕械氖录叭蝿?wù)不可能在順序中2次以上的運(yùn)行.
必須要經(jīng)過一輪的查詢后才可以.

當(dāng)然也可以將后臺(tái)程序作成順序查詢,單次執(zhí)行.這樣就幾乎和OS一樣了!!!

在前后臺(tái)中,前臺(tái)(中斷)只執(zhí)行簡(jiǎn)單的處理,需要時(shí)向后臺(tái)發(fā)送消息或..(叫什么都不重要),然后在后臺(tái)(主循環(huán))中處理消息.
即消息環(huán)結(jié)構(gòu),隊(duì)列處理.

如果2次中斷的間隔在主循環(huán)/任務(wù)中的處理時(shí)間不夠的話,那么這種設(shè)計(jì)肯定是失敗的!!!

所以,這就是DSP程序很少用OS的原因所在吧...

個(gè)人認(rèn)為在OS程序中,能不用中斷盡量不要用中斷,就象windows讓你編驅(qū)動(dòng)程序一樣.線程實(shí)際上不就是OS的1個(gè)普通任務(wù)嗎???

直接操縱硬件不是OS的風(fēng)格,所謂的實(shí)時(shí)操作系統(tǒng)都是分時(shí)的,不過CPU處理速度快些.

我也很喜歡在中斷中干活,主要在定時(shí)中斷中,以時(shí)間片來分配任務(wù)及事件.
主循環(huán)什么都不干,及空閑任務(wù).

設(shè)想一下,如果每個(gè)任務(wù)(事先安排好順序的)都能在各自的時(shí)間片內(nèi)完成的話,
不就是一個(gè)特定的OS了嗎???

這種OS沒有任務(wù)的切換,因?yàn)樗麄兌际鞘孪燃s定好的.

我喜歡稱其為"零耗時(shí)",如果做好的話,會(huì)效率很高的,從效率上講決不次于OS.

一切隨其自然,這就是我"做人的道理",該用什么,自己能把握即好.

5樓: >>參與討論
上善若水
好精辟啊!
hotpower的確是高手,佩服!透徹的理解來源于踏實(shí)的實(shí)踐,這些我都記下了,細(xì)節(jié)方面的,我就自己去思考吧。留個(gè)聯(lián)系方式好嗎?博客也可以。

6樓: >>參與討論
hotpower
哈哈,過節(jié)多灌灌水,年后好日子就不多了
想起來就前怕(不是后怕)...幾個(gè)項(xiàng)目合起來逼我---肯定要跳樓的...

7樓: >>參與討論
hotpower
"龜殼"的取舍
在中斷中的OS管理函數(shù)實(shí)際是給中斷加了一個(gè)任務(wù)殼.

有了這些殼,中斷就成了OS的超級(jí)任務(wù)了...

入口OS只作些簡(jiǎn)單的計(jì)數(shù),出口為0時(shí)才真正進(jìn)行任務(wù)切換.

這種考慮主要在中斷嵌套時(shí),但OS退出時(shí)操作要復(fù)雜些.

如果沒這些殼,中斷只能返回以前被中斷的任務(wù)了,哪怕是最低級(jí)的任務(wù).

如果此任務(wù)不交權(quán),在中斷期間新任務(wù)(哪怕是最高級(jí)的任務(wù))必須等待

低級(jí)任務(wù)交權(quán)或節(jié)拍中斷到來才能切換到這個(gè)新任務(wù).

個(gè)人認(rèn)為如果任務(wù)都不太棘手,那么最好別加這個(gè)"龜殼"更好些...

8樓: >>參與討論
云中月8888
hotpower
artx 和μCOS-II比有何優(yōu)缺點(diǎn)?


9樓: >>參與討論
hotpower
我這些都是菜鳥一個(gè)
 
10樓: >>參與討論
云中月8888
你不是對(duì)artx很熟悉嗎?
用artx還是用μCOS-II,拿不定主意.



11樓: >>參與討論
上善若水
再問Hotpower:
1、什么樣的任務(wù)算“不太棘手”?

2、您分析了那么多的好處,為什么又說“最好別加這個(gè)"龜殼"更好些”?

3、您認(rèn)為哪個(gè)內(nèi)核更好點(diǎn)?

4、我的QQ:286242744。加我好嗎?有問題直接向您請(qǐng)教。


參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
外部FLASH下不能下載和調(diào)試LPC2200,求教ZLG
問一個(gè)LPC2214外部中斷1的問題
請(qǐng)教版主關(guān)于 EasyARM 2131 開發(fā)板的設(shè)計(jì)問題
問周公關(guān)于ISP?
請(qǐng)教:書本知識(shí)
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


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