- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2025-01-15 18:21:58
已绑定手机
新手上路
- 积分
- 17
|
困惑点:由于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; |
|