找回密码
 立即注册
查看: 226|回复: 2

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-15 18:21:58
已绑定手机

1

主题

1

回帖

17

积分

新手上路

积分
17
发表于 2025-1-13 15:08:10 | 显示全部楼层 |阅读模式
困惑点:由于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[i++] = MW_UART_SBUF;
        
        if (!re_head) {
            if (i > MW_PRTC_POSI_HEAD_END) {
                if ((mw_rx_buf[i - 2] == MW_PRTC_HEAD1) && (mw_rx_buf[i - 1] == MW_PRTC_HEAD2_F_SLAVE)) {
                    re_head = 1;
                    mw_rx_buf[MW_PRTC_POSI_HEAD] = MW_PRTC_HEAD1;
                    mw_rx_buf[MW_PRTC_POSI_HEAD_END] = 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_POSI_LENGTH] + 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[i - 1]) {
                        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;
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-1-14 06:33:37 | 显示全部楼层
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-15 18:21:58
已绑定手机

1

主题

1

回帖

17

积分

新手上路

积分
17
发表于 2025-1-15 18:21:37 | 显示全部楼层
Debu*** 发表于 2025-1-14 06:33
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13643

好的多谢!
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 11:23 , Processed in 0.128760 second(s), 58 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表