tmos如何在中断中使用?使能休眠程序不正常


{
    uint32_t irq_status;
    while(1)
    {
        SYS_DisableAllIrq( &irq_status );
        if( true == g_irq_button_event ) {
            tmos_clear_event( main_func_get_taskid(), BUTTON_IRQ_EVENT);
            tmos_set_event( main_func_get_taskid(), BUTTON_IRQ_EVENT);
            g_irq_button_event = false;
        }
        SYS_RecoverIrq( irq_status );
        TMOS_SystemProcess();
    }
}
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void GPIOA_IRQHandler(void)
{
    if(GPIOA_ReadITFlagBit(BUTTON_MAINTENANCE_PIN)){
        g_irq_button_event = true;
        PRINT("aaaaaaaaaaaaaa\n");
        if(R32_PA_PIN & (BUTTON_MAINTENANCE_PIN))
            GPIOA_ITModeCfg(BUTTON_MAINTENANCE_PIN, GPIO_ITMode_LowLevel);
        else
            GPIOA_ITModeCfg(BUTTON_MAINTENANCE_PIN, GPIO_ITMode_HighLevel);
        //GPIOA_ClearITFlagBit(BUTTON_MAINTENANCE_PIN);
    }else{
        PRINT("bbbbbbbbbbbbb\n");
    }
}

按键状态变换一次就执行一次任务。在不开启休眠HAL_SLEEP时,运行正常,但是开启休眠后,就不能按一次按键打印一次,而且放开后才执行两次

tmos任务不要放在中断里去使用。

emobile_2022-03-02_18-44-08.png


我已经没有在中断里用了。中断里设置全局变量,主循环判断。但是按键按下或抬起逻辑都是不对


如果不用休眠,执行的正常的。主要开启休眠就不正常,不能正常打印,也就是任务函数不是每次都执行。


不能正常打印,是因为sleep之前,需要降主频,如果此时被GPIO唤醒,此时主频是比较低的状态,不是32M,所以在中断中打印也是不正常的。如果是睡眠状态下GPIO唤醒进入的中断,需要先设置主频,然后加至少1ms的延时。如图:1.png

void GPIOA_IRQHandler(void)

{

    SetSysClock(~~~);

    mDelaymS(1);

    if(GPIOA_ReadITFlagBit(BUTTON_MAINTENANCE_PIN)){
        g_irq_button_event = true;
        PRINT("a\n");
        if(R32_PA_PIN & (BUTTON_MAINTENANCE_PIN))
            GPIOA_ITModeCfg(BUTTON_MAINTENANCE_PIN, GPIO_ITMode_LowLevel);
        else
            GPIOA_ITModeCfg(BUTTON_MAINTENANCE_PIN, GPIO_ITMode_HighLevel);
        //GPIOA_ClearITFlagBit(BUTTON_MAINTENANCE_PIN);
    }else{
        PRINT("b\n");
    }
}



只有登录才能回复,可以选择微信账号登录