1.11. unmask_irq

1.11.1. Abstract

unmask_irq,不可屏蔽中断

1.11.2. API说明


//不可屏蔽中断使能
void irq_unmask_set(u8 index)

//不可屏蔽中断失能
void irq_unmask_disable(u8 index)

//VM操作时保持不可屏蔽中断使能需要在不可屏蔽中断初始化时进行注册
vm_isr_response_index_register(u8 index)

注意:

  1. 不可屏蔽中断配置的中断函数要放在ram,包含不可屏蔽中断调用的子函数,都要放在ram。

  2. 操作VM的同时也需要保持不可屏蔽中断生效的话,需要调用vm_isr_response_index_register()进行注册。

1.11.3. 示例说明

初始化定时器来控制IO输出高低电平波形,中途用按键触发写vm操作或者延时关开中断来验证,在这两种状态下波形会持续输出。

1、定时器和不可屏蔽中断初始化

#define     APP_IO_DEBUG_0(i,x)       {JL_PORT##i->DIR &= ~BIT(x), JL_PORT##i->OUT &= ~BIT(x);}
#define     APP_IO_DEBUG_1(i,x)       {JL_PORT##i->DIR &= ~BIT(x), JL_PORT##i->OUT |= BIT(x);}

#define USE_RAM   AT_RAM // NOT_KEEP_RAM // 

static u8 timer_flag = 0;

AT_RAM static void timer_isr_callback()   //中断函数需要放ram,且不能加打印
{
    if (timer_flag) {
        timer_flag = 0;
        APP_IO_DEBUG_1(A,1);
    }else{
        timer_flag = 1;
        APP_IO_DEBUG_0(A,1);
    }
}

int timer_init(void)
{
    log_info("%s", __func__);
    timer_idle_set(0);
    const struct gptimer_config timer_config = {
        .timer.period_us = 50,     // 10us以上
        .irq_cb = timer_isr_callback,
        .irq_priority = 7,          // 0~6
        .mode = GPTIMER_MODE_TIMER, //设置工作模式
    };
    timer_tid = gptimer_init(TIMER3, &timer_config);
    log_info("%s[gptimer_init:%d]", __func__, timer_tid);

    //对定时器中断进行不可屏蔽中断使能
    irq_unmask_set(IRQ_TIME3_IDX);
    //VM操作时维持不可屏蔽中断需要进行中断注册
	extern void vm_isr_response_index_register(u8 index);
    vm_isr_response_index_register(IRQ_TIME3_IDX);

    gptimer_start(timer_tid);
    gptimer_dump();

    return timer_tid;
}

2、按键触发写vm操作或者延时关开中断,以transfer工程的trans_data应用为例进行说明。

static u8 test_buf[200];
static u8 test_flag = 0;

void trans_key_deal_test(uint8_t key_type, uint8_t key_value)
{
#if TCFG_LED_ENABLE
    led_operate(LED_KEY_UP);
#endif
    log_info(">>>>>>>>>>trans key test");

    #if 1 //写vm操作
	memset(test_buf, test_buf[0]+1, sizeof(test_buf));
    APP_IO_DEBUG_0(A,0);
	APP_IO_DEBUG_1(A,0);
    //vm id需要同步在user_cfg_id.h中注册
    syscfg_write(CFG_TEST_MODE_INFO, test_buf, sizeof(test_buf));
    APP_IO_DEBUG_0(A,0);

    #if 0 //延时关开中断
    APP_IO_DEBUG_0(A,0);
    APP_IO_DEBUG_1(A,0);
    local_irq_disable();
    delay_nops(1000000);
    log_info(">>> close irq");
    local_irq_enable();
    APP_IO_DEBUG_0(A,0);
    #endif	
}

3、最后执行后用逻辑分析仪抓到的电平波形如下:

unmask_irq_1.png