564022008 发表于 2025-1-13 15:08:10

C51 中断内可以调用函数指针么

困惑点:由于51单片机的局部变量实际占用的内存空间是共享的,不知道函数指针这样的调用关系,
       编译器能否自动识别正确,如果不能就会导致局部变量数据错乱。



void (*uart2_rx_int_callback)(void) = NULL;
void (*uart2_tx_int_callback)(void) = NULL;


void UART2_ISR_Handler (void) interrupt UART2_VECTOR
{
    if(RI2)
    {
      CLR_RI2();
      if (uart2_rx_int_callback) {
            uart2_rx_int_callback();
      }
    }

    if(TI2)
    {
      CLR_TI2();
      if (uart2_tx_int_callback) {
            uart2_tx_int_callback();
      }
    }
}


u8 mw_prtc_cal_sum(u8 *p_buf,u8 l)
{
    u16 sum = 0;
    u8 i;
    for (i = 0;i < l;i ++) {
      sum += p_buf;
    }
    i = sum & 0x00ff;
    return i;
}


void mw_uart_rx_int_callback(void)
{
    static u8 i = 0;
    static bit re_head = 0;
    static bit re_length= 0;
    static u8 j;
    static u8 sum = 0;
   
    if (!MW_COM.B_RX_busy) {
      mw_rx_buf = MW_UART_SBUF;
      
      if (!re_head) {
            if (i > MW_PRTC_POSI_HEAD_END) {
                if ((mw_rx_buf == MW_PRTC_HEAD1) && (mw_rx_buf == MW_PRTC_HEAD2_F_SLAVE)) {
                  re_head = 1;
                  mw_rx_buf = MW_PRTC_HEAD1;
                  mw_rx_buf = MW_PRTC_HEAD2_F_SLAVE;
                  i = MW_PRTC_POSI_LENGTH;
                } else {
                  i = 0;
                }
            }
      } else {
            if (!re_length) {
                if (i > MW_PRTC_POSI_LENGTH_END) {
                  re_length = 1;
                  MW_COM.RX_Cnt = *(u16*)&mw_rx_buf + MW_PRTC_BEFOR_FUNC_LENGTH;
                }
            } else {
                if (i >= MW_COM.RX_Cnt) {
                  sum = mw_prtc_cal_sum(mw_rx_buf, MW_COM.RX_Cnt);
                  PRINTF_INFO_ARRA("rb",mw_rx_buf,j,MW_COM.RX_Cnt);
                  PRINTF_INFO("su=%02bx\r\n",sum);
                  if (sum == mw_rx_buf) {
                        MW_COM.B_RX_busy = 1;
                        i = 0;
                        re_head = 0;
                        re_length = 0;
                  }
                }
            }
      }
      if (i >= MW_RX_PROTOCOL_LENGTH_MAX) {
            i = 0;
            re_head = 0;
            re_length = 0;
            MW_COM.B_RX_busy = 0;
      }
    }
}

串口初始化时会给函数指针初始化

    uart2_tx_int_callback = mw_uart_tx_int_callback;
    uart2_rx_int_callback = mw_uart_rx_int_callback;

DebugLab 发表于 2025-1-14 06:33:37

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13643

564022008 发表于 2025-1-15 18:21:37

DebugLab 发表于 2025-1-14 06:33
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13643

好的多谢!
页: [1]
查看完整版本: C51 中断内可以调用函数指针么