GD32V 优化中遇到的问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值