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; https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13643 DebugLab 发表于 2025-1-14 06:33
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=13643
好的多谢!
页:
[1]