一、使用串口处理机制中对于FIFO的处理机制应用的解读

一、FIFO

First Input First Output的缩写,先入先出队列
使用的场景:一般是在
不同的时钟域之间的数据传输**(简单理解即:一个(读\写)快,另外的一个(读\写)慢的场景中。)
本质操作:就是将收的数据存储的一个线性的数组中,通过指针指向该数组的自加1(偏移)来遍历数据,达到读取或者写入的目的。
作用:起到缓冲环节,可防止数据的丢失。
对数据量大的进行存储,避免频繁的总线操作。并且可满足dma的操作。
在fifo中需要理解连个重要成员:
宽度:指一次写读操作的数据位数
深度:存储多少个宽度的数据。(如:存储8个16位宽的数据)。

第一类、FIFO处理机制如下:

FIFO信息的定义:

/*
该结构体定义成员有
缓存区,
长度,
输出,
输入的计数。
*/
typedef struct fifo_t {
   
    uint8_t *buf;
	uint32_t size;
	uint32_t in;
	uint32_t out;
} _fifo_str;
#define min(x,y) ((x) < (y)?(x):(y))  

1、初始化FIFO

fifo_str fifo_str;

int FifoInit(uint8_t *fifo_addr, uint32_t fifo_size)//初始化fifo
{
   
	_fifo_str *p = &fifo_str;
	
	if(fifo_addr == NULL || fifo_size == 0)//判断数据是否为空
		return -1;

	memset((char *)p, 0, sizeof(_fifo_str));//初始化结构体
	p->buf = fifo_addr;//对应宽度
    p->in = 0;//输入计数
    p->out = 0;//输出计数
    p->size = fifo_size;//对应深度
	return 0;
}

2、数据的长度获取

//数据的实际使用数据空间长度
int FifoDataLen(void)
{
   
	_fifo_str *p = &fifo_str;
	return (p->in - p->out);//输入计数-输出计数
}
//剩余数据空间长度
int FifoSpaceLen(void)
{
   
	_fifo_str *p = &fifo_str;
	
	return (p->size - (p->in - p->out));//定义长度-(实际长度)
}

3、FIFO的进和出处理

//获取fifo数据
//数据的内容缓存区,要读的长度
int FifoRead(uint8_t *buf, uint32_t len)
{
   
	uint32_t i = 0, j = 0;
	_fifo_str *p = &fifo_str;

	j = (p->out % p->size);//获取剩余空间长度未读量
	len = min(len, p->in - p->out);//防止长度为超出实际拥有的数据长度,即让读取的长度在  (0<设定len<定义的缓存区长度len )这间的实际长度
	i = min(len, p->size - j);//获取实际内容的长度,的数据长度
	memcpy(buf, p->buf + j, i);//将数据通道里的数据拷贝给缓存区
	memcpy(buf + i, p->buf, len - i);//将未有数据的区域存入,对应为写入数据的区域数据(即,有数据的填数据,没数据的地方补0)
	p->out += len;//已读的数据量
	return len;//实际读到的数据长度
}
//对fifo写入数据
int FifoWrite(uint8_t *buf, uint32_t len)
{
   
	uint32_t i = 0, j = 0;
	_fifo_str *p = &fifo_str;

	j = p->in % p->size;//获取要写入的剩余空间长度
	len = min(len, p->size - p->in + p->out);//得到实际写入的长度
	i = min(len, p->size - j);//实际写入数据的长度
	memcpy(p->buf + j, buf, i);//将写入的数据的内容拷贝值数据中。
	memcpy(p->buf, buf + i, len - i);//补充多余空间的内容
	p->in += len;//记录实际写入数据的数量
	return len;//返回写入的长度
}

4、置位记录量

//清空fifo 中的记录量
void FifoClear(void)
{
   
	_fifo_str *p = &fifo_str;
    p->in = 0;
    p->out = 0;
}

5、应用处理机制

#define LEN 2048
uint8_t pdata[LEN] = {
   0};
FifoInit(pdata, LEN);//初始化FIFO
uint8_t buf[32] = {
   0}; 
int tx_len = 0;
uint8_t tx_buf[100] = {
   0};

HAL_UART_Receive_IT(&huart1, buf, IT_LEN
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android应用程序的消息处理机制是指通过消息队列和处理器来实现线程间的通信和任务处理。在Android,消息处理机制是由Handler、Looper和Message组成的。 首先,每个应用程序都有一个消息队列,用于存储应用程序的消息。当一个线程发送消息到消息队列时,这个消息被以先进先出(FIFO)的顺序排列在队列,并被分配一个唯一的标识符。 其次,每个线程都有一个Looper实例,它负责管理该线程的消息队列。Looper通过无限循环,不断地从消息队列取出消息,并将消息传递给对应的处理器进行处理。 最后,处理器是消息的实际处理者,它通过继承Handler类来实现。处理器接收到从消息队列取出的消息后,根据消息的标识符进行相应的处理,可以执行任务、更新UI等操作。当任务处理完成后,处理器可以发送新的消息到消息队列,或者将结果返回给发送者。 这种消息处理机制的好处是可以实现异步操作和线程间的通信。例如,在Android,主线程(UI线程)不能处理耗时的任务,否则会导致应用程序的卡顿甚至崩溃。通过将耗时的任务放到子线程进行处理,并利用消息处理机制处理结果返回给主线程,可以避免阻塞主线程,提升应用程序的响应性能。 总之,Android应用程序的消息处理机制是通过消息队列、Looper和Handler来实现线程间的通信和任务处理,提高应用程序的并发性和响应性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值