嵌入式C语言循环数组的读&写及判断数组满|空

.h文件

#ifndef __STRUCT_H
#define __STRUCT_H

#include "stm32f10x.h"                  // Device header

#define SIZE 12 //数组长度
typedef struct
{
	uint16_t addr_wr;        /* 写地址 */
    uint16_t addr_rd;        /* 读地址 */
    uint16_t length;         /* 数组长度*/
    uint8_t fifo[SIZE];//循环数组
}fifo;

extern fifo fifo_Test;//定义后声明,可作为全局变量
void reset_Fifo();//结构体重置,读地址,写地址,数组全部置零
void write_Fifo(uint8_t *write_arr,uint16_t *write_Arr_Length,uint8_t *fifo,uint16_t *length,uint16_t *addr_wr,uint16_t *addr_rd);//向循环数组写数据
void read_Fifo(uint8_t *read_arr,uint16_t *read_Arr_Length,uint8_t *fifo,uint16_t *length,uint16_t *addr_wr,uint16_t *addr_rd);//读循环数组数据
#endif

.c文件

#include "STRUCT.H"
#include "main.h"

fifo fifo_Test;

void reset_Fifo()
{
	fifo_Test.addr_rd = 0;//读地址置零
	fifo_Test.addr_wr = 0;//写地址置零
	fifo_Test.length = SIZE;//循环数组长度设置
	for(int i = 0;i<SIZE;i++)//数组所有元素置零
	{
		fifo_Test.fifo[i] = 0;
	}
}

void write_Fifo(uint8_t *write_arr,uint16_t *write_Arr_Length,uint8_t *fifo,uint16_t *length,uint16_t *addr_wr,uint16_t *addr_rd)//向循环数组写数据,其中write_arr为内容数组,write_Arr_Length为内容数组元素数,循环数组,循环数组长度,写地址,读地址
{
	for(int i=0;i<(*write_Arr_Length);i++)
	{
		if(((*addr_wr+1)%(*length)) != *addr_rd)//写地址的下一位不等于读地址,表明数组不是满的,可以继续写
		{
				fifo[*addr_wr] = write_arr[i];
				*addr_wr = ((*addr_wr+1)%(*length));//写地址+1,若写地址到循环数组长度了,就重新从1开始,但是不能超过读地址
		}
	}
	
}

void read_Fifo(uint8_t *read_arr,uint16_t *read_Arr_Length,uint8_t *fifo,uint16_t *length,uint16_t *addr_wr,uint16_t *addr_rd)
{
for(int i=0;i<(*read_Arr_Length);i++)
	{
		if((*addr_rd) != *addr_wr)//读地址不等于写地址,表明数组不是空的,可以读元素数据
		{
				  read_arr[i] = fifo[*addr_rd];
				*addr_rd = ((*addr_rd+1)%(*length));//读地址+1,
		}
	}
}

main.c文件

#include "stm32f10x.h"                  // Device header
#include "main.h"
#include "STRUCT.H"

uint8_t test_arr[10]={1,2,3,4,5,6,7,8,9,10};
uint16_t test_len = 10;

uint8_t test_arr_1[3]={8,9,10};
uint16_t test_len_1 = 3;

int main(void)
{
	reset_Fifo();//重置结构体
	
	write_Fifo(test_arr,&test_len,fifo_Test.fifo,&fifo_Test.length,&fifo_Test.addr_wr,&fifo_Test.addr_rd);//将test_arr10个元素写入循环数组中
	
	read_Fifo(test_arr_1,&test_len_1,fifo_Test.fifo,&fifo_Test.length,&fifo_Test.addr_wr,&fifo_Test.addr_rd);//读取循环数组前三个元素,储存在test_arr_1
	
	read_Fifo(test_arr_1,&test_len_1,fifo_Test.fifo,&fifo_Test.length,&fifo_Test.addr_wr,&fifo_Test.addr_rd);//再按顺序读取循环数组三个元素,储存在test_arr_1
	while (1)
	{

	}
}

每行都注释了,大家看注释

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值