打印
[ZLG-MCU]

关于LM3S8962中断优先级设置的问题

[复制链接]
2325|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hhtek|  楼主 | 2008-2-16 20:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序段1:
开机之后设置
IntPrioritySet(INT_WATCHDOG,1<<5);//最高优先级
IntPrioritySet(INT_GPIOA,2<<5);//第二级中断优先级
很明显,看门狗的优先级较GPIOA的优先级要高,即看门狗可以中断GPIOA

程序段2:
开机之后设置,但是没有设置GPIOA的优先等级(即为默认优先级 PRI_0 为0x00)
IntPrioritySet(INT_WATCHDOG,7<<5);//最高优先级
那么问题是:看门狗和GPIOA的中断等级谁更高?

-------
我的程序中有一个现象:
IntPrioritySet(INT_GPIOA,2<<5);//第二级中断优先级
而我的INT_TIMER0A没有设置优先级,按理说应该是GPIOA的中断等级比TIMER0A的高,但是却发现GPIOA的中断服务程序却可以被TIMER0A中断

--------
请帮忙解释一下上述现象,谢谢

相关帖子

沙发
zlgmcu| | 2008-2-18 09:00 | 只看该作者

贴个中断优先级例程,请参考

#include  "hw_types.h"
#include  "hw_memmap.h"
#include  "hw_ints.h"
#include  "hw_sysctl.h"
#include  "hw_gpio.h"
#include  "src/interrupt.h"
#include  "src/sysctl.h"
#include  "src/gpio.h"

#define  SysCtlPeriEn       SysCtlPeripheralEnable
#define  GPIOPinTypeIn      GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut     GPIOPinTypeGPIOOutput
#define  GPIOPinIntEn       GPIOPinIntEnable
#define  GPIOPinIntClr      GPIOPinIntClear
#define  IntMasterEn        IntMasterEnable
#define  IntPriSet          IntPrioritySet

#define  KEY1       GPIO_PORTA_BASE, GPIO_PIN_2
#define  LED1       GPIO_PORTA_BASE, GPIO_PIN_3
#define  KEY2       GPIO_PORTB_BASE, GPIO_PIN_2
#define  LED2       GPIO_PORTB_BASE, GPIO_PIN_3

void  timeDelay (unsigned long  ulVal)
{
    do {
    } while ( --ulVal != 0 );
}

int  main (void)
{
    timeDelay(1500000L);                        // 开机延迟

    SysCtlPeriEn(SYSCTL_PERIPH_GPIOA);          // 使能GPIOA端口
    SysCtlPeriEn(SYSCTL_PERIPH_GPIOB);          // 使能GPIOB端口

    GPIOPinTypeIn(KEY1);                        // 设置KEY1所在管脚为输入模式
    GPIOPinTypeOut(LED1);                       // 设置LED1所在管脚为输出模式
    GPIOPinTypeIn(KEY2);                        // 设置KEY2所在管脚为输入模式
    GPIOPinTypeOut(LED2);                       // 设置LED2所在管脚为输出模式

    GPIOPinWrite(LED1, 0x08);                   // 熄灭LED1
    GPIOPinWrite(LED2, 0x08);                   // 熄灭LED2

    GPIOIntTypeSet(KEY1, GPIO_LOW_LEVEL);       // 设置KEY1所在管脚为低电平触发中断
    GPIOIntTypeSet(KEY2, GPIO_LOW_LEVEL);       // 设置KEY2所在管脚为低电平触发中断

    IntPriSet(INT_GPIOA, (1 << 5));             // 设置KEY1所在的GPIOA中断优先级为1
    IntPriSet(INT_GPIOB, (2 << 5));             // 设置KEY2所在的GPIOB中断优先级为2

    GPIOPinIntEn(KEY1);                         // 使能KEY1所在管脚的中断
    GPIOPinIntEn(KEY2);                         // 使能KEY2所在管脚的中断
    IntEnable(INT_GPIOA);                       // 使能GPIOA总中断
    IntEnable(INT_GPIOB);                       // 使能GPIOB总中断
    IntMasterEn( );                             // 使能处理器中断

    for (;;) {                                  // 死循环,等待按键中断的产生
    }
}

// GPIOA的中断服务函数
void  GPIO_Port_A_ISR (void)
{
    GPIOPinIntClr(KEY1);                        // 清除LEY1中断
    GPIOPinWrite(LED1, 0x00);                   // 点亮LED1
    for (;;) {                                  // 死循环,不退出中断服务函数
    }
}

// GPIOB的中断服务函数
void  GPIO_Port_B_ISR (void)
{
    GPIOPinIntClr(KEY2);                        // 清除LEY2中断
    GPIOPinWrite(LED2, 0x00);                   // 点亮LED2
    for (;;) {                                  // 死循环,不退出中断服务函数
    }
}

(zlgmcu_wdx)

使用特权

评论回复
板凳
zlgmcu| | 2008-2-18 09:02 | 只看该作者

程序工作原理

在程序运行后,如果先按KEY1点亮LED1,再按KEY2时LED2不亮,原因是KEY1优先级比KEY2优先级高,KEY2中断无法打断KEY1中断。
相反,如果先按KEY2点亮LED2,再按KEY1时则能够点亮LED1,这说明较高级的KEY1中断能够打断较低级的KEY2中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

23

帖子

0

粉丝