当前位置: 首页 > news >正文

爱做电影网站苏州万浩伟网络科技有限公司

爱做电影网站,苏州万浩伟网络科技有限公司,南阳网站建设与管理,烟台论坛建站模板本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写#xff0c;需要的同学可以在这里获取#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总#xff1a; ht…本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写需要的同学可以在这里获取 https://item.taobao.com/item.htm?id728461040949 配套资料获取https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总 https://blog.csdn.net/qq_35181236/article/details/132779862 第29章 改进型环形缓冲区 29.1 基本概念 环形缓冲区是一个先进先出FIFO的闭环的存储空间。通俗的理解为在内存中规划了一块“圆形”的地将该“圆形”进行NRing Buffer的大小等分如下图所示 但是实际上处理器的内存不可能是这样一个闭环的存储方式而是一片连续的有起始有结束的空间 开发者在程序中只能申请一段有头有尾的内存通过软件设计将这片内存实现为一个环形的缓冲区。 一般而言对于环形缓冲区的操作需要了解几个基本单位 内存起始地址pHead内存结束地址pEnd内存总大小Length可写内存起始地址pwStart可写内存大小wLength可读内存起始地址prStart可读内存大小rLength 可以发现这几个单位中是存在算术关系的 ① ② ③ 将②式换算下以可写内存大小为结果 将可读的数据称作有效数据valid data可读的起始内存地址叫有效数据起始地址pValid可读的数据个数叫有效数据个数pValidLength。而可写的内存位于有效数据之后称之为pValidEnd 基于以上信息就可以将环形缓冲区的信息抽象为结构体RingBufferInfo typedef struct RingBuffInfo{unsigned char *pHead;unsigned char *pEnd; unsigned char *pValid; unsigned char *pValidEnd; unsigned int nBufferLength;unsigned int nValidLength; }RingBuffInfo;由于可写的数据个数是可以通过缓冲区大小nBufferLength和有效数据个数nValidLength计算得到因而未将其封装到RingBufferInfo结构体中。 对于环形缓冲区主要的操作有申请和释放空间读写数据、清除数据。将这些操作方法和缓冲区信息一起封装为结构体RingBuffer typedef struct RingBuffer{RingBuffInfo info;int (*Write)(struct RingBuffer *ptbuf, const unsigned char *src, unsigned int length);int (*Read)(struct RingBuffer *ptbuf, unsigned char *dst, unsigned int length);int (*Clear)(struct RingBuffer *ptbuf);int (*Free)(struct RingBuffer *ptbuf);struct RingBuffer *next; }RingBuffer;第07行的链表用来管理多个环形缓冲区把它们放在一个链表里。 29.2 申请缓冲区 先申请一个RingBuffer结构体再申请存储数据的空间最后初始化。代码如下 struct RingBuffer *RingBufferNew(unsigned int length) {struct RingBuffer *ptbuf;if(0 length) return NULL;ptbuf (struct RingBuffer*)malloc(sizeof(struct RingBuffer));if(NULL ptbuf) return NULL;if(NULL ! ptbuf-info.pHead){free(ptbuf-info.pHead);}ptbuf-info.pHead (uint8_t*)malloc(length);if(NULL ptbuf-info.pHead) {printf(Error. Malloc %d bytes failed.\r\n, length);return -EIO;}ptbuf-info.pValid ptbuf-info.pValidEnd ptbuf-info.pHead;ptbuf-info.pEnd ptbuf-info.pHead length;ptbuf-info.nValidLength 0;ptbuf-info.nBufferLength length;ptbuf-Write RingBufferWrite;ptbuf-Read RingBufferRead;ptbuf-Clear RingBufferClear;ptbuf-Free RingBufferFree;return ptbuf; }第06行使用C库函数malloc申请一个RingBuffer结构体第12行分配存储数据的内存第18~21行初始化缓冲区的信息第23~26行填充操作函数 29.3 释放缓冲区 先是否数据存储空间再释放RingBuffer结构体本身。代码如下 static int RingBufferFree(struct RingBuffer *ptbuf) {if(ptbuf NULL) return -EINVAL;if(ptbuf-info.pHeadNULL) return -EINVAL;free((uint8_t*)ptbuf-info.pHead);ptbuf-info.pHead NULL;ptbuf-info.pValid NULL;ptbuf-info.pValidEnd NULL;ptbuf-info.pEnd NULL;ptbuf-info.nValidLength 0;free((struct RingBuffer *)ptbuf);return ESUCCESS; }29.4 写数据到缓冲区 往缓冲区中写入数据需要考虑三个点 剩下的空间是否足够超过空间的数据是丢还是留写入数据时如果越界了就需要缓冲器的头部继续写 如果从pValidEnd开始写入数据不会超过缓冲区的结束地址那么直接从pValidEnd处开始写入数据即可 如果从pValidEnd开始写入数据会超过缓冲区的结束地址那么就需要考虑很多 计算从pValidEnd开始到pEnd可以写入多少个数据还剩多少个数据需要从pHead处开始写计算从pHead开始到pValid可以写入多少个数据是否足够写入剩下的数据不够的话如何处理 在本书实验例程中如果出现了剩余空间不足以容纳新数据时就用新数据覆盖旧数据 在这个过程中有效数据的起始地址和结束地址以及有效数据的个数需要随着数据的写入跟着变化这些数据的计算结合示意图可谓一目了然此处就不再列出计算公式了。 如果缓冲区的剩余空间足够容纳新数据那么写操作比较简单。代码如下 static int RingBufferWrite(struct RingBuffer *ptbuf, const unsigned char *src, unsigned int length) {......省略内容// copy buffer to pValidEndif( (ptbuf-info.pValidEnd length) ptbuf-info.pEnd ) // 超过了Buffer范围需要分为两段{len1 (unsigned)(ptbuf-info.pEnd - ptbuf-info.pValidEnd);len2 length - len1;memcpy((uint8_t*)ptbuf-info.pValidEnd, src, len1);memcpy((uint8_t*)ptbuf-info.pHead, src len1, len2);ptbuf-info.pValidEnd ptbuf-info.pHead len2; // 更新有效数据区尾地址}else{memcpy((uint8_t*)ptbuf-info.pValidEnd, src, length);ptbuf-info.pValidEnd ptbuf-info.pValidEnd length;}......省略内容 }如果缓冲区的剩余空间不足以容纳新数据在使用新数据覆盖老数据时涉及的计算比较繁琐代码如下 static int RingBufferWrite(struct RingBuffer *ptbuf, const unsigned char *src, unsigned int length) {......省略内容// 重新计算已使用区的起始位置if( (ptbuf-info.nValidLength length) ptbuf-info.nBufferLength ) // 要写入的数据超过了缓冲区总长度分为两段写{move_len ptbuf-info.nValidLength length - ptbuf-info.nBufferLength;if( (ptbuf-info.pValid move_len) ptbuf-info.pEnd ){len1 (unsigned)(ptbuf-info.pEnd - ptbuf-info.pValid);len2 move_len - len1;ptbuf-info.pValid ptbuf-info.pHead len2;}else{ptbuf-info.pValid ptbuf-info.pValid move_len;}ptbuf-info.nValidLength ptbuf-info.nBufferLength;}else{ptbuf-info.nValidLength ptbuf-info.nValidLength length;}return (int)length; }29.5 从缓冲区读数据 相比于写数据读数据的操作就简单了许多。读数据时从pValid处开始读如果越过了pEnd需要从pHead继续读取剩下的数据 而如果从pValid处读取的数据个数不会越过pEnd那么直接读出即可 环形缓冲区的读函数代码如下 static int RingBufferRead(struct RingBuffer *ptbuf, unsigned char *dst, unsigned int length) {unsigned int len1 0, len2 0;if(ptbuf-info.pHeadNULL) return -EINVAL;if(ptbuf-info.nValidLength0) return -ENOMEM;if(length ptbuf-info.nValidLength){length ptbuf-info.nValidLength;}if( (ptbuf-info.pValid length) ptbuf-info.pEnd ){len1 (unsigned int)(ptbuf-info.pEnd - ptbuf-info.pValid);len2 length - len1;memcpy(dst, (uint8_t*)ptbuf-info.pValid, len1);memcpy(dst len1, (uint8_t*)ptbuf-info.pHead, len2);ptbuf-info.pValid ptbuf-info.pHead len2;}else{memcpy(dst, (uint8_t*)ptbuf-info.pValid, length);ptbuf-info.pValid ptbuf-info.pValid length;}ptbuf-info.nValidLength - length;return (int)length; }29.6 清除缓冲区 清除缓冲区时让RingBuffer的各个成员恢复初始值即可 static int RingBufferClear(struct RingBuffer *ptbuf) {if(ptbuf NULL) return -EINVAL;if(ptbuf-info.pHeadNULL) return -EINVAL;if(ptbuf-info.pHead ! NULL){memset(ptbuf-info.pHead, 0, ptbuf-info.nBufferLength);}ptbuf-info.pValid ptbuf-info.pValidEnd ptbuf-info.pHead;ptbuf-info.nValidLength 0;return ESUCCESS; }本章完
http://www.w-s-a.com/news/376001/

相关文章:

  • 建站公司还有前途吗cf网站编程
  • 网站建设需求确认表建站工具 比较
  • 刚建设的网站多久能在百度查到考试系统 微网站是什么样的
  • 商城网站建设高端企业网站建设劣势
  • 网站建设征集通讯员的通知seo推广外包
  • 微信公众号微网站建设专业网站建设出售
  • 怎么用wordpress建立自己的网站加强校园网站建设
  • 用什么做网站后台的织梦网站怎么上传
  • 怎么获取网站数据做统计百度快照推广有效果吗
  • 淘宝领卷网站什么做制造网站开发
  • 如何做com的网站网站建设投标书模板
  • 郑州网络营销网站优化网站技术方案怎么写
  • 济南市住房和城乡建设局网站wordpress mnews主题
  • ios开发网站app网站建设企业有哪些方面
  • 网站主页 优帮云深圳代做网站后台
  • app 与网站网站建设要做什么
  • 厦门国外网站建设公司郑州核酸点推vip服务
  • 免费网线seo外链怎么做
  • 宽带技术网网站wordpress widget hook
  • 山西省住房和城乡建设厅网站报名wordpress添加标签插件
  • 网站怎么自己做外贸网站案例
  • 做网站的优势公司网站怎么做站外链接
  • 海城网站制作建设精准营销的营销方式
  • 北京短视频拍摄公司重庆网站seo推广公司
  • 广州免费推广网站建设4399网页游戏大全
  • 网站的构架与组成建站公司兴田德润
  • php网站部署步骤邯郸哪有做网站的
  • 做设计什么设计比较好的网站南充市住房和城乡建设局考试网站
  • 郑州做系统集成的公司网站龙岩
  • 厦门SEO_厦门网站建设网络营销课程视频