void EXTI0_IRQHandler(void)
{
if (RESET != exti_interrupt_flag_get(recvPortPinBit)) {
exti_interrupt_flag_clear(recvPortPinBit);
parse();
}
}
#define THTEE_MS (81000) // 3000*27
#define TWO_MS (54000) // 2000*27
#define TWO_HALF_MS (67500) // 2500*27
void parse(void)
{
// pinPort = pin_gpio[pin], portPinBit = BIT(pin % 16);
// unsigned long long x = micro();
unsigned long long x = mtime_lo(); // 27 个计数值是 1us
unsigned long interval = (x - ts); // / 27;
ts = x;
if (interval > THTEE_MS) { // 不是传输的数据
counter = 0;
tmp = 0;
return;
}
if ((interval > TWO_MS) && (interval < TWO_HALF_MS)) {
tmp <<= 1;
tmp |= 1;
} else {
tmp <<= 1;
}
counter++;
if (counter == 32) {
ir_code = tmp;
counter = 0;
}
}
void EXTI0_IRQHandler(void)
{
if (RESET != exti_interrupt_flag_get(recvPortPinBit)) {
exti_interrupt_flag_clear(recvPortPinBit);
parse();
}
}
void parse(void)
{
unsigned long long x = mtime_lo(); // 27 个计数值是 1us
unsigned long interval = (x - ts) /27; // / 27;
ts = x;
if (interval > 3000) { // 不是传输的数据
counter = 0;
tmp = 0;
return;
}
if ((interval > 2000) && (interval < 2500)) {
tmp <<= 1;
tmp |= 1;
} else {
tmp <<= 1;
}
counter++;
if (counter == 32) {
ir_code = tmp;
counter = 0;
}
}
众所周知 中断中不能耗时太长,linux 为了处理这个问题特意引入了中断上下文,但是我又栽倒在这里了
在我优化代码时,代码二的耗时是代码一的十几倍,原因是 在gd32v上 除法的耗时是乘法的几十倍 。。。。。。。
文章描述了在GD32V微控制器上,作者在处理EXTI0_IRQHandler中断时遇到的问题,代码优化导致解析函数的执行时间大幅增加,主要原因是除法运算比乘法耗时更多。文中提到Linux中断上下文管理对长时间中断的处理,但此处却因硬件差异引发性能瓶颈。
1万+

被折叠的 条评论
为什么被折叠?



