|
|||||||||||
| 技術(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ù)子程序的編寫和普通的前后臺(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 于 2006/2/6 12:52:00 發(fā)布:
我認(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樓: | >>參與討論 |
| 作者: 上善若水 于 2006/2/6 14:08:00 發(fā)布:
請(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 于 2006/2/6 15:38:00 發(fā)布:
這個(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樓: | >>參與討論 |
| 作者: 上善若水 于 2006/2/6 16:41:00 發(fā)布:
好精辟啊! hotpower的確是高手,佩服!透徹的理解來源于踏實(shí)的實(shí)踐,這些我都記下了,細(xì)節(jié)方面的,我就自己去思考吧。留個(gè)聯(lián)系方式好嗎?博客也可以。 |
|
| 6樓: | >>參與討論 |
| 作者: hotpower 于 2006/2/6 16:54:00 發(fā)布:
哈哈,過節(jié)多灌灌水,年后好日子就不多了 想起來就前怕(不是后怕)...幾個(gè)項(xiàng)目合起來逼我---肯定要跳樓的...
|
|
| 7樓: | >>參與討論 |
| 作者: hotpower 于 2006/2/6 17:12:00 發(fā)布:
"龜殼"的取舍 在中斷中的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 于 2006/2/6 19:48:00 發(fā)布:
hotpower artx 和μCOS-II比有何優(yōu)缺點(diǎn)? |
|
| 9樓: | >>參與討論 |
| 作者: hotpower 于 2006/2/6 19:58:00 發(fā)布:
我這些都是菜鳥一個(gè) |
|
| 10樓: | >>參與討論 |
| 作者: 云中月8888 于 2006/2/6 20:12:00 發(fā)布:
你不是對(duì)artx很熟悉嗎? 用artx還是用μCOS-II,拿不定主意. |
|
| 11樓: | >>參與討論 |
| 作者: 上善若水 于 2006/2/6 20:16:00 發(fā)布:
再問Hotpower: 1、什么樣的任務(wù)算“不太棘手”? 2、您分析了那么多的好處,為什么又說“最好別加這個(gè)"龜殼"更好些”? 3、您認(rèn)為哪個(gè)內(nèi)核更好點(diǎn)? 4、我的QQ:286242744。加我好嗎?有問題直接向您請(qǐng)教。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |