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上 除法的耗时是乘法的几十倍 。。。。。。。