实现我的中断的最快方法是什么?

问题描述

我有一个外部中断(在STM32F031K6上运行)。我希望它能尽快运行-理想情况是在1uS内运行。目前它的运行速度约为2.2uS。中断如下

void EXTI4_15_IRQHandler(void)
{

    if (ChangeFlag & 1<<3){
        GPIOA->BSRR |= (1<<4);}
    else
        GPIOA->BSRR |= (1<<20);

    ChangeFlag |= 1<<1;

    if (ChangeFlag & 1<<2)
    {
        GPIOA->BSRR |= (1<<12);}
    else
        GPIOA->BSRR |= (1<<28);

    ChangeFlag |= 1<<0;

    EXTI->PR |= 1<<11; //turn off interrupt request
}

特别是类似GPIOA-> BSRR | =(1

解决方法

您的示例不完整,我不明白ChangeFlag应该做什么。如果ChangeFlag是一个不稳定的全局变量,那么那里会有一些优化的潜力...

我可以告诉你的是BSRR是一个只写寄存器,对其进行读写修改是没有意义的。

BSRR register

仅用简单的赋值=替换| =运算符就可以摆脱一些汇编指令。

,

通过生成掩码,然后对GPIOA->BSRR进行一次写入,您将节省大量内存访问

void EXTI4_15_IRQHandler(void)
{
    uint32_t mask = 0;
    if (ChangeFlag & 1<<3)
        mask = (1<<4);
    else
        mask = (1<<20);

    if (ChangeFlag & 1<<2)
        mask |= (1<<12);
    else
        mask |= (1<<28);

    ChangeFlag |= (( 1 << 1 ) | (1 << 0));
    GPIOA->BSRR = mask;

    EXTI->PR |= 1<<11; //turn off interrupt request
}

正如@Vinci所说,在|=上使用GPIOx->BSRR运算符是没有意义的,因为它是只写寄存器,对其执行读-修改-写操作只是浪费循环。 / p>

如果change标志是一个不稳定的全局变量,那么您可以通过将其复制一次,保存到临时文件中并在条件条件下使用它来进行保存,则必须检查编译后的输出。

您的部分可以在高达48 MHz的频率下运行,在1μs内可以为您提供48个时钟周期,在异常发生和您的代码将状态推入堆栈的过程之间有16个周期,而对于弹出所有内容而言,则是相同的在异常退出时退后,即总共进行32个周期的内务处理,这使您在异常处理程序执行任何工作之前达到〜666 ns,为了保持在1μs的预算内,处理程序代码只有16个时钟周期。我不确定1μs是否可行。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...