|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
在UCOS-II中PWM中斷和定時器0之間中斷斷嵌套方面的問題, |
| 作者:xianfei520 欄目:ARM技術(shù) |
以下參照一個zlg提供的例子,我配置如下: void VICInit(void) { extern void IRQ_Handler(void); extern void Timer0_Handler(void); extern void PWMMR_Handler(void); VICIntEnClr = 0xffffffff; VICDefVectAddr = (uint32)IRQ_Handler; VICVectAddr0= (uint32)PWMMR_Handler;//PWMMR優(yōu)先級比Timer0高 VICVectCntl0 = (0x20 | 0x08); VICIntEnable = 1 << 8; VICVectAddr1 = (uint32)Timer0_Handler; VICVectCntl1 = (0x20 | 0x04); VICIntEnable = 1 << 4; } 問題是:因為我的pwm頻率高,有如下可能性: (1)在PWMMR中斷服務(wù)程序里,如果Timer0中斷發(fā)生,會不會有中斷嵌套可能; (2)在Timer0中斷服務(wù)程序里,如果PWMMR中斷發(fā)生,會不會有中斷嵌套可能; 第二種可能我覺得應(yīng)該有,問題是第一種情形有嗎???? |
| 2樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/5 11:39:00 發(fā)布:
zlg的一個例子: void UART0_Exception(void) { uint8 IIR, TEMP, i; VICIntEnClr = (1 << 6) | (1 << 4); VICVectAddr = 0; // 通知中斷控制器中斷結(jié)束 OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); while(((IIR = U0IIR) & 0x01) == 0) { /* 有中斷未處理完 */ SWITCH (IIR & 0x0e) { case 0x02: /* THRE中斷 */ for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向發(fā)送FIFO填充數(shù)據(jù) */ { if (QueueRead(&TEMP, UART0SendBuf) == QUEUE_OK) { U0THR = TEMP; } else { U0IER = U0IER & (~0x02); /* 隊列空,則禁止發(fā)送中斷 */ } } break; case 0x04: /* 接收數(shù)據(jù)可用 */ OSSemPost(Uart0Sem); /* 通知接收任務(wù) */ U0IER = U0IER & (~0x01); /* 禁止接收及字符超時中斷 */ break; case 0x06: /* 接收線狀態(tài) */ TEMP = U0LSR; break; case 0x0c: /* 字符超時指示 */ OSSemPost(Uart0Sem); /* 通知接收任務(wù) */ U0IER = U0IER & (~0x01); /* 禁止接收及字符超時中斷 */ break; default : break; } } VICIntEnable = (1 << 6) | (1 << 4); } void Timer0_Exception(void) { VICIntEnClr = 1 << 4; VICVectAddr = 0; // 通知中斷控制器中斷結(jié)束 OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); T0IR = 0x01; OSTimeTick(); VICIntEnable = 1 << 4; } void VICInit(void) { extern void IRQ_Handler(void); extern void Timer0_Handler(void); extern void UART0_Handler(void); VICIntEnClr = 0xffffffff; VICDefVectAddr = (uint32)IRQ_Handler; VICVectAddr14 = (uint32)UART0_Handler; VICVectCntl14 = (0x20 | 0x06); VICIntEnable = 1 << 6; VICVectAddr15 = (uint32)Timer0_Handler; VICVectCntl15 = (0x20 | 0x04); VICIntEnable = 1 << 4; } /************************************************************/ 請問下周公: OS_ENTER_CRITICAL();開啟之后,馬上就OS_EXIT_CRITICAL();中斷還怎么嵌套啊。。。。。沒有懂這里 |
|
| 3樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/5 14:02:00 發(fā)布:
為什么就沒有人愿意回答一下 周公能提供一個完整的中斷嵌套例子給我么 或者那位xdjm 愿意,我也真心感謝啊。。。。 我在前后臺pwm實現(xiàn)了所要去的功能(直線插補(bǔ)),當(dāng)然我PWM使用了PWM中斷了。不然也就沒有必要使用了中斷嵌套, |
|
| 4樓: | >>參與討論 |
| 作者: greatbin 于 2006/6/5 14:25:00 發(fā)布:
OS_EXIT_CRITICAL是退出臨界區(qū)的意思,即開中斷 |
|
| 5樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/5 15:23:00 發(fā)布:
hehe 我搞反了,但為什么 OS_ENTER_CRITICAL();馬上就OS_EXIT_CRITICAL(); 因為關(guān)中斷后,馬上就開中斷,還不如就直接開中斷得了。。。 還有,, 就拿以下來說: void Timer0_Exception(void) { (1) VICIntEnClr = 1 << 4; VICVectAddr = 0; // 通知中斷控制器中斷結(jié)束 OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); T0IR = 0x01; OSTimeTick(); VICIntEnable = 1 << 4; } (1)句的時候中斷時禁止的嗎???? |
|
| 6樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/6 11:48:00 發(fā)布:
沒有人做中斷嵌套嗎。。。。 頂起哦 |
|
| 7樓: | >>參與討論 |
| 作者: sixpower 于 2006/6/6 17:12:00 發(fā)布:
要用FIQ中斷才行的! |
|
| 8樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/6 20:06:00 發(fā)布:
re:sixpower 我調(diào)了幾天了。都要瘋了。。感覺遇到鬼了。 我的目的是用PWM 中PWMMR2控制x軸 PWMMR4控制y軸, 很奇怪的是,我單獨用走x軸,程序可以走, 但是,單獨走y軸,程序就跑飛, 我現(xiàn)在還沒有調(diào)試x,y都走(走斜線這種情況); 因為走x軸和y軸方法一樣, 我仔細(xì)對照程序,沒有發(fā)現(xiàn)不對的。。 我以為是命名的問題,結(jié)果也排除, 干脆我把走x的PWMMR2 放到走y這里來試試,結(jié)果還是不行, 于是我又重新把PWMMR2 放回走x軸,結(jié)果,x軸也不是剛才的目標(biāo),F(xiàn)在只能 中斷三十次。。奇怪啊。。搞這行怎么這樣子。。。 |
|
| 9樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/6 20:09:00 發(fā)布:
只是一個很簡單的中斷嵌套啊。。。 在前后臺上,我已經(jīng)都做好了。。。。。。 為什么放到ucos-ii中就不行了呢。。 ucos-ii還是能嵌套256個中斷,我暈啊。。 誰能幫幫我啊。。。 |
|
| 10樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/6 20:14:00 發(fā)布:
我的中斷嵌套寫法參照zlg的例子,見上面例子。 void UART0_Exception(void) { uint8 IIR, TEMP, i; VICIntEnClr = (1 << 6) | (1 << 4); VICVectAddr = 0; // 通知中斷控制器中斷結(jié)束 OS_ENTER_CRITICAL(); 我的中斷服務(wù)函數(shù) OS_EXIT_CRITICAL(); VICIntEnable = (1 << 6) | (1 << 4); } void Timer0_Exception(void) { VICIntEnClr = 1 << 4; VICVectAddr = 0; // 通知中斷控制器中斷結(jié)束 OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL(); T0IR = 0x01; OSTimeTick(); VICIntEnable = 1 << 4; } 以下是我的寫法: void VICInit(void) { extern void IRQ_Handler(void); extern void Timer0_Handler(void); extern void PWMMR24_Handler(void); VICIntEnClr = 0xffffffff; VICDefVectAddr = (uint32)IRQ_Handler; VICVectAddr14 = (uint32)UART0_Handler; VICVectCntl14 = (0x20 | 0x08); VICIntEnable = 1 << 8; VICVectAddr15 = (uint32)Timer0_Handler; VICVectCntl15 = (0x20 | 0x04); VICIntEnable = 1 << 4; } |
|
| 11樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/6 20:17:00 發(fā)布:
失誤 把 void UART0_Exception(void) { uint8 IIR, TEMP, i; VICIntEnClr = (1 << 6) | (1 << 4); VICVectAddr = 0; // 通知中斷控制器中斷結(jié)束 OS_ENTER_CRITICAL(); 我的中斷服務(wù)函數(shù) OS_EXIT_CRITICAL(); VICIntEnable = (1 << 6) | (1 << 4); } /*********************************************************/ 改為: void PWMMR24_Exception(void) { VICIntEnClr = (1 << 8) | (1 << 4); VICVectAddr = 0; // 通知中斷控制器中斷結(jié)束 OS_ENTER_CRITICAL(); 我的中斷服務(wù)函數(shù) OS_EXIT_CRITICAL(); VICIntEnable = (1 << 8) | (1 << 4); } |
|
| 12樓: | >>參與討論 |
| 作者: computer00 于 2006/6/6 20:25:00 發(fā)布:
一般用中斷嵌套的不多,所以研究這個的人也少了。 盡量將中斷服務(wù)程序弄短。 |
|
| 13樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/6 21:56:00 發(fā)布:
中斷服務(wù)程序很短的。。 只能插補(bǔ)50步左右,,應(yīng)該是我的中斷嵌套沒有對頭, 周公能不能幫我看看下,,,,,,,,,,, |
|
| 14樓: | >>參與討論 |
| 作者: sixpower 于 2006/6/7 10:20:00 發(fā)布:
to xianfei520 我原來也遇到你的問題! 后來發(fā)現(xiàn)不能用PWM中斷. 最后T1用FIQ 中斷就可以了, PWM可達(dá)10K,T1中斷用2.4K. /************************************* ** 函數(shù)名稱: FIQ_Exception ** 功能描述: 快速中斷異常處理程序,用戶根據(jù)需要自己改變程序 ********************************************/ void FIQ_Exception(void) { INT32U i; extern void PWM(void); i=VICFIQStatus; T1IR = 0xff; T1MR0 += (Fpclk / 2400); PWM(); } VICIntSelect = 0x00000000; // 設(shè)置所有通道為IRQ中斷 VICIntSelect =1 << 5; VICIntEnClr = 0xffffffff; VICDefVectAddr = (uint32)IRQ_Handler; VICVectAddr1 = (uint32)Timer0_Handler; VICVectCntl1 = (0x20 | 0x04); VICIntEnable = 1 << 4; T0IR = 0xffffffff; T0TC = 0; T0PR = 0; T0PC= 0; T0TCR = 0x01; T0MCR = 0x01; T0MR0 = (Fpclk / OS_TICKS_PER_SEC); // VICVectAddr2 = (uint32)Timer1_Handler; VICVectAddr2 = (uint32)FIQ_Exception; VICVectCntl2 = (0x20 | 0x05); VICIntEnable = 1 << 5; T1IR = 0xffffffff; T1TC = 0; T1TCR = 0x01; T1MCR = 0x01; T1MR0 = (Fpclk / 4800 ); VICVectCntl0 = (0x20 | 0x08); // PWM通道分配到IRQ slot 3 // VICVectAddr0 = (uint32)PWM_Handler; VICVectAddr0 = (uint32)FIQ_Exception; // VICIntEnable = 1 << 8; // 使能PWM中斷 OS_EXIT_CRITICAL(); } |
|
| 15樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/7 15:30:00 發(fā)布:
多謝sixpower;;;;; 可是我的PWM中斷都做好了。。難道真的不行這樣做嗎,, 周公發(fā)句話吧,,,,,,,,這樣中斷嵌套行不??? 有一事不明白,在UCOS-II中,time0作為時鐘中斷, 那加入其他的中斷都有可能發(fā)生中斷嵌套的啊, 就拿EINT0中斷來說,(當(dāng)把key1 配置為EITN0)可能你剛按key1的時候,time0 正在發(fā)生中斷呢。那不就是中斷嵌套嗎 。。不知道我這樣理解對不???? |
|
| 16樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/7 22:51:00 發(fā)布:
不甘心自己的心血,終于有些眉目了 今天下午突然心血來潮,一個三個if語句,適合每種if的情況就分別執(zhí)行, 我把最復(fù)雜的一個if給刪掉,調(diào)試的時候,(當(dāng)然不調(diào)試此種方法) 結(jié)果發(fā)現(xiàn)其余的兩種,即單獨走x軸或者是單獨走y軸都正常了。 怪事,我估計是空間問題,,可是我看了編譯的情況,還有很多剩的空間啊。。 郁悶,,,還沒有整理好。。等整理好之后一并拿來給大家討論。。。。 |
|
| 17樓: | >>參與討論 |
| 作者: hotpower 于 2006/6/7 22:59:00 發(fā)布:
pwm最好別用中斷~~~ |
|
| 18樓: | >>參與討論 |
| 作者: eleven11 于 2006/6/8 7:33:00 發(fā)布:
有一點你要明白 OS_ENTER_CRITICAL();后是不能用中斷了,也就不能中斷嵌套了 |
|
| 19樓: | >>參與討論 |
| 作者: sixpower 于 2006/6/8 9:32:00 發(fā)布:
關(guān)注中!! 要把成功經(jīng)驗和大家分享啊!! |
|
| 20樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/8 15:35:00 發(fā)布:
個人無回天之力,請大家?guī)兔,分析原?br>我的具體的做法就是上面一貼那樣說的。真郁悶的郁悶, 只要我屏蔽掉那個不使用的if{},程序就對了。把這個不使用的if{}加上, 程序就不對了。這里可以肯定的是我的中斷嵌套是對的,不然分別走就不對了。我把各自的編譯時候的資料給傳上來。 LineInterpolation(0,0,568056,0);這是我插補(bǔ)x軸的數(shù)據(jù); LineInterpolation(0,0,0,50000); 這是我插補(bǔ)y軸的數(shù)據(jù); LineInterpolation(0,0,500,50000); 這種x,y都插補(bǔ)的數(shù)據(jù)沒有做。 還有一問題:不知道大家見過沒有,我單步運行 y = y+1;初始時y=0; 可這句之后y就是0x40000004;怎么回事啊,是不是bug啊, 第一幅圖是沒有if{}的編譯數(shù)據(jù) |
|
| 21樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/8 15:38:00 發(fā)布:
沒有if{}的編譯數(shù)據(jù)
|
|
| 22樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/8 15:42:00 發(fā)布:
這個是加了if{ |
|
| 23樓: | >>參與討論 |
| 作者: xianfei520 于 2006/6/8 15:48:00 發(fā)布:
這個是加了if{}的 與剛才的比沒有大多少,怎么就有不同的結(jié)果呢。。
|
|
| 24樓: | >>參與討論 |
| 作者: win2000_li 于 2006/6/26 9:25:00 發(fā)布:
re:xianfen520你好!。 你用PWM來控制步進(jìn)電機(jī),其中的控制,就是PWM2,PWM4它們的周期是如何改變的??并且我想它們的頻率是不一樣的吧??? 請指點一下小弟。 |
|
| 25樓: | >>參與討論 |
| 作者: win2000_li 于 2006/6/26 9:32:00 發(fā)布:
re:xianfen520你好。! 我也在用PWM來控制步進(jìn)電機(jī),請指點PWM2,PWM4它們的頻率是不一樣,是怎么 做到的?能指點一下嗎? 能否留下一個QQ或E—MAIL,希望能交流一下。 我的e_mail:win2000-li@163.com QQ:276666457 |
|
| 26樓: | >>參與討論 |
| 作者: cloudld 于 2006/6/28 16:55:00 發(fā)布:
我也遇到類似問題 似乎是UCOS移植到ARM7的問題,中斷里沒有重新允許嵌套,中斷嵌套是不可以的。 可以來信交流:cloudlx1977@yahoo.com.cn |
|
| 27樓: | >>參與討論 |
| 作者: high 于 2006/6/28 19:54:00 發(fā)布:
沒有細(xì)看,但是有一個建議 os很吃內(nèi)存的。建議先把任務(wù)堆棧開大點。 如果嵌套,建議把IRQ堆棧也開大些。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |