嵌入式C语言中数据缓冲技术的应用实现

【摘要】 在嵌入式项目开发中,经常会涉及到数据的交互。比如汽车电子产品中的CAN通信,数据的收发经常是偶发的,一般有事件产生,就会回触发一些网络数据,这些网络数据在总线上往往是偶尔产生的,而且可能会集中触发。但是对于单个处理器,是不能及时处理多个集中触发的任务的,因此必须要借助数据缓冲技术。当然首先需要硬件资源支持,再才能通过软件依次处理这些缓冲数据。
我们先来看一下CAN总线系统:…

在嵌入式项目开发中,经常会涉及到数据的交互。比如汽车电子产品中的CAN通信,数据的收发经常是偶发的,一般有事件产生,就会回触发一些网络数据,这些网络数据在总线上往往是偶尔产生的,而且可能会集中触发。但是对于单个处理器,是不能及时处理多个集中触发的任务的,因此必须要借助数据缓冲技术。当然首先需要硬件资源支持,再才能通过软件依次处理这些缓冲数据。

我们先来看一下CAN总线系统:

嵌入式C语言中数据缓冲技术的应用实现

我们还是以实际项目举例,比如选用NXP KEA128的单片机,其CAN接收、发送缓冲区特性描述如下:

• 采用FIFO 存储方案的5个接收缓冲区

• 3 个发送缓冲区,采用“本地优先级”概念进行内部排序

这里相当于接收有5个缓冲区,发送有3个缓冲区。接收一般多于发送,因为发送是主动的,可控的;而接收是被动的,不可控的。

接收报文缓冲采用如下的结构:

嵌入式C语言中数据缓冲技术的应用实现

从Rx0到Rx4,采用FIFO也就是先进先出的原则。硬件接收缓冲器有5个,也就是说这款处理器,在一个处理周期内,底层最多存放5个数据帧,也就是说同一时间内只能接收5个数据帧,多了就会被覆盖掉。

接收报文中断函数


void MSCAN_RX_Handler(void)
{
stMsgBuf * pBuf;
......
pBuf = &(RxMsgBuf[RMB_i]);
pBuf->Dat[0] = MSCAN_REDSR0;
pBuf->Dat[1] = MSCAN_REDSR1;
pBuf->Dat[2] = MSCAN_REDSR2;
pBuf->Dat[3] = MSCAN_REDSR3;
pBuf->Dat[4] = MSCAN_REDSR4;
pBuf->Dat[5] = MSCAN_REDSR5;
pBuf->Dat[6] = MSCAN_REDSR6;
pBuf->Dat[7] = MSCAN_REDSR7;
pBuf->DatLen = (MSCAN_RDLR & 0x0F);
pBuf->IDReg[0] = MSCAN_RSIDR0;
pBuf->IDReg[1] = MSCAN_RSIDR1;
RMB_i++;
if (RMB_i >= 5)
{
RMB_i = 0;
}
......
}

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享