如何解决实现我的中断的最快方法是什么?
我有一个外部中断(在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是一个只写寄存器,对其进行读写修改是没有意义的。
仅用简单的赋值=替换| =运算符就可以摆脱一些汇编指令。
,通过生成掩码,然后对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是否可行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。