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

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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ù)
在UCOS-II中PWM中斷和定時器0之間中斷斷嵌套方面的問題,
以下參照一個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
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
為什么就沒有人愿意回答一下
周公能提供一個完整的中斷嵌套例子給我么
或者那位xdjm 愿意,我也真心感謝啊。。。。
我在前后臺pwm實現(xiàn)了所要去的功能(直線插補(bǔ)),當(dāng)然我PWM使用了PWM中斷了。不然也就沒有必要使用了中斷嵌套,

  

4樓: >>參與討論
greatbin
OS_EXIT_CRITICAL是退出臨界區(qū)的意思,即開中斷
 
5樓: >>參與討論
xianfei520
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
沒有人做中斷嵌套嗎。。。。
頂起哦

7樓: >>參與討論
sixpower
要用FIQ中斷才行的!
 
8樓: >>參與討論
xianfei520
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
只是一個很簡單的中斷嵌套啊。。。
在前后臺上,我已經(jīng)都做好了。。。。。。
為什么放到ucos-ii中就不行了呢。。

ucos-ii還是能嵌套256個中斷,我暈啊。。
誰能幫幫我啊。。。

10樓: >>參與討論
xianfei520
我的中斷嵌套寫法參照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
失誤

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
一般用中斷嵌套的不多,所以研究這個的人也少了。
盡量將中斷服務(wù)程序弄短。

13樓: >>參與討論
xianfei520
中斷服務(wù)程序很短的。。
只能插補(bǔ)50步左右,,應(yīng)該是我的中斷嵌套沒有對頭,
周公能不能幫我看看下,,,,,,,,,,,

14樓: >>參與討論
sixpower
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
多謝sixpower;;;;;
可是我的PWM中斷都做好了。。難道真的不行這樣做嗎,,
周公發(fā)句話吧,,,,,,,,這樣中斷嵌套行不???


有一事不明白,在UCOS-II中,time0作為時鐘中斷,
那加入其他的中斷都有可能發(fā)生中斷嵌套的啊,
就拿EINT0中斷來說,(當(dāng)把key1 配置為EITN0)可能你剛按key1的時候,time0
正在發(fā)生中斷呢。那不就是中斷嵌套嗎 。。不知道我這樣理解對不????

16樓: >>參與討論
xianfei520
不甘心自己的心血,終于有些眉目了
今天下午突然心血來潮,一個三個if語句,適合每種if的情況就分別執(zhí)行,
我把最復(fù)雜的一個if給刪掉,調(diào)試的時候,(當(dāng)然不調(diào)試此種方法)
結(jié)果發(fā)現(xiàn)其余的兩種,即單獨走x軸或者是單獨走y軸都正常了。
怪事,我估計是空間問題,,可是我看了編譯的情況,還有很多剩的空間啊。。
郁悶,,,還沒有整理好。。等整理好之后一并拿來給大家討論。。。。


17樓: >>參與討論
hotpower
pwm最好別用中斷~~~
 
18樓: >>參與討論
eleven11
有一點你要明白
OS_ENTER_CRITICAL();后是不能用中斷了,也就不能中斷嵌套了

19樓: >>參與討論
sixpower
關(guān)注中!!
要把成功經(jīng)驗和大家分享啊!!

20樓: >>參與討論
xianfei520
個人無回天之力,請大家?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
沒有if{}的編譯數(shù)據(jù)
 

22樓: >>參與討論
xianfei520
這個是加了if{
 
23樓: >>參與討論
xianfei520
這個是加了if{}的
與剛才的比沒有大多少,怎么就有不同的結(jié)果呢。。

24樓: >>參與討論
win2000_li
re:xianfen520你好!。
你用PWM來控制步進(jìn)電機(jī),其中的控制,就是PWM2,PWM4它們的周期是如何改變的??并且我想它們的頻率是不一樣的吧???
請指點一下小弟。



25樓: >>參與討論
win2000_li
re:xianfen520你好。!
我也在用PWM來控制步進(jìn)電機(jī),請指點PWM2,PWM4它們的頻率是不一樣,是怎么
做到的?能指點一下嗎?

能否留下一個QQ或E—MAIL,希望能交流一下。

我的e_mail:win2000-li@163.com
QQ:276666457




26樓: >>參與討論
cloudld
我也遇到類似問題
似乎是UCOS移植到ARM7的問題,中斷里沒有重新允許嵌套,中斷嵌套是不可以的。
可以來信交流:cloudlx1977@yahoo.com.cn

27樓: >>參與討論
high
沒有細(xì)看,但是有一個建議
os很吃內(nèi)存的。建議先把任務(wù)堆棧開大點。
如果嵌套,建議把IRQ堆棧也開大些。

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
哪兒可以找到ZLG移植的UCOS FOR ARM7(ADS下)?
用keil編譯LPC2102工程看不到編譯結(jié)果
求購二手SmartARM2200
USB接口中信號的隔離問題
ZLG/FS問題? (請周立功進(jìn)來看看)
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號