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

网站上传教程网站做关键词

网站上传教程,网站做关键词,装修上什么网站比较好,wordpress思源字体什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个环。…什么是环形缓冲区 环形缓冲区,也称为循环缓冲区或环形队列,是一种特殊的FIFO(先进先出)数据结构。它使用一块固定大小的内存空间来缓存数据,并通过两个指针(读指针和写指针)来管理数据的读写。当任意一个指针到达缓冲区末尾时,会自动回绕到缓冲区开头,形成一个环。 环形缓冲区的用途 串口通信 在嵌入式设备中,串口是常用的通信接口。环形缓冲区可用于缓存收发数据,平衡通信速率差异。音视频数据处理 音视频数据往往是连续的数据流。使用环形缓冲区可以平滑数据的生成和消耗,避免数据丢失或延迟。传感器数据采集 传感器数据通常以固定频率采样。环形缓冲区可作为数据采集和处理之间的缓冲,降低实时性要求。多线程数据传递 在多线程编程中,环形缓冲区是一种简单高效的线程间通信方式,无需复杂的同步操作。数据打包与解析 一些通信协议使用特定的数据帧格式。环形缓冲区可用于数据的打包和解析,保证数据的完整性。 环形缓冲区的实现示例 #include stdio.h #include stdint.h #include stdbool.h// 环形缓冲区大小 #define BUFFER_SIZE 256// 定义解析器状态 typedef enum {STATE_WAIT_START, // 等待消息开始STATE_READ_LENGTH, // 读取消息长度STATE_READ_DATA // 读取消息数据 } ParserState;typedef struct {uint8_t buffer[BUFFER_SIZE];volatile uint16_t head;volatile uint16_t tail; } RingBuffer;void RingBuffer_Init(RingBuffer *rb) {rb-head 0;rb-tail 0; }bool RingBuffer_Write(RingBuffer *rb, uint8_t data) {uint16_t next (rb-head 1) % BUFFER_SIZE;if (next rb-tail) {// 缓冲区满return false;}rb-buffer[rb-head] data;rb-head next;return true; }bool RingBuffer_Read(RingBuffer *rb, uint8_t *data) {if (rb-head rb-tail) {// 判满return false;}*data rb-buffer[rb-tail];rb-tail (rb-tail 1) % BUFFER_SIZE;return true; }// 处理完整消息的函数 void process_message(const uint8_t *msg, uint8_t length) {for (uint8_t i 0; i length; i) {printf(%c, msg[i]);}printf(\n); }// 有限状态机解析器 void parse_messages(RingBuffer *rb) {static ParserState state STATE_WAIT_START;static uint8_t msg_length 0;static uint8_t msg_index 0;static uint8_t message[128]; //uint8_t byte;while (RingBuffer_Read(rb, byte)) {switch (state) {case STATE_WAIT_START: // 等待消息起始if (byte 0xAA) { // 0xAA是消息起始标志state STATE_READ_LENGTH;}break;case STATE_READ_LENGTH: // 读取消息长度msg_length byte;if (msg_length 0 msg_length sizeof(message)) {msg_index 0;state STATE_READ_DATA;} else {// 无效长度重置状态state STATE_WAIT_START;}break;case STATE_READ_DATA: // 读取消息数据message[msg_index] byte;if (msg_index msg_length) {process_message(message, msg_length);state STATE_WAIT_START;}break;default:state STATE_WAIT_START;break;}} }// 发送函数 void threadA_send(RingBuffer *rb, const uint8_t *msg, uint8_t length) {RingBuffer_Write(rb, 0xAA); // 起始标志RingBuffer_Write(rb, length); // 长度字段for (uint8_t i 0; i length; i) {RingBuffer_Write(rb, msg[i]);} }// 接收函数 void threadB_receive(RingBuffer *rb) {parse_messages(rb); }void test_ring_buffer(void) {// 1. 初始化环形缓冲区RingBuffer rb;RingBuffer_Init(rb);printf( 环形缓冲区测试开始 \n\n);// 2. 测试基本消息发送和接收printf(测试1: 基本消息收发\n);const uint8_t test_msg1[] Hello World;threadA_send(rb, test_msg1, sizeof(test_msg1) - 1);threadB_receive(rb);// 3. 测试空缓冲区printf(\n测试2: 空缓冲区读取\n);uint8_t temp;if (!RingBuffer_Read(rb, temp)) {printf(空缓冲区测试通过: 无法从空缓冲区读取数据\n);}// 4. 测试缓冲区满状态printf(\n测试3: 缓冲区满状态\n);uint8_t large_msg[BUFFER_SIZE];for (int i 0; i BUFFER_SIZE; i) {large_msg[i] A (i % 26); // 填充A-Z循环}bool write_result true;int write_count 0;while (write_result write_count BUFFER_SIZE 10) {write_result RingBuffer_Write(rb, large_msg[write_count % BUFFER_SIZE]);write_count;}printf(写入计数: %d (应小于缓冲区大小)\n, write_count - 1);// 5. 测试长消息分段发送printf(\n测试4: 长消息分段发送\n);RingBuffer_Init(rb); // 重新初始化const uint8_t long_msg[] This is a long message to test multiple segments;const int SEGMENT_SIZE 10;for (size_t i 0; i (size_t)(sizeof(long_msg) - 1); i (size_t)SEGMENT_SIZE) {size_t current_length ((sizeof(long_msg) - 1 - i) (size_t)SEGMENT_SIZE) ? (sizeof(long_msg) - 1 - i) : (size_t)SEGMENT_SIZE;threadA_send(rb, long_msg[i], current_length);threadB_receive(rb);}// 6. 测试无效消息printf(\n测试5: 无效消息处理\n);uint8_t invalid_msg[] {0xAA, 0xFF, 0x01, 0x02}; // 无效长度for (size_t i 0; i sizeof(invalid_msg); i) {RingBuffer_Write(rb, invalid_msg[i]);}threadB_receive(rb);// 7. 测试快速读写切换printf(\n测试6: 快速读写切换\n);const uint8_t test_msg2[] Test;for (int i 0; i 5; i) {threadA_send(rb, test_msg2, sizeof(test_msg2) - 1);threadB_receive(rb);}printf(\n 环形缓冲区测试完成 \n); }int main() {test_ring_buffer();return 0; }总结 与传统的数组或链表相比,环形缓冲区有以下优点: 1.无需频繁移动数据。环形缓冲区的读写指针移动不会导致数据搬移,效率更高。 2.自动处理缓冲区满和空的状态。通过读写指针的关系可以判断缓冲区状态,无需额外的计数器。 3. 适用于生产者-消费者模型。一个线程写入数据,另一个线程读取数据,天然支持异步处理。
http://www.hkea.cn/news/14533780/

相关文章:

  • 网站统计源码网站开发的基础是什么
  • 建设网站能挣钱吗wordpress空格消失
  • 好的建网站的公司南阳淅川县制作网站的公司
  • 做微信的网站火车头发布wordpress带磁力链
  • 建设北京公司网站网站无障碍建设规定
  • 做网站时的电话图标旅游景区网站建设规划方案
  • 网站首页制作教程视频长沙微网站制作
  • tp框架可以做网站吗h5游戏折扣平台app
  • 手机测评网站企业网站多大空间够用
  • 乐清做网站公司小程序免费制作平台有吗
  • 做网站你们用什么浏览器现代著名设计师及作品
  • 潍坊搜易网站建设vf建设银行网站
  • 二级建造师最好的网站plone wordpress
  • 网站管理人员队伍建设有待加强江门关键词优化广告
  • 建设银行官方网站个人系统板块修改路得威网站谁做的
  • flash网站模版制作的网站
  • 经营阅读网站需要怎么做网站建设代码好难啊
  • 做网站教材成都网站设计开发公司
  • 嘉兴外贸网站建设精美网页模板
  • 中国最好的建站公司wordpress加个微信登录
  • 营销型网站建设必须的步骤包括大连app开发制作
  • 交易平台网站建设策划书CQ网站建设
  • 无锡市城乡建设局网站wordpress中文杂志主题
  • 淘宝提货网站怎么做的网站生成app要多少钱
  • 网站首页三张海报做多大印发网站建设方案
  • 北京做家政网站有哪些平台今天安阳发生的重大新闻
  • 杭州小程序推广门户网站怎么做seo
  • 如何模仿网站模板wordpress狮子歌歌
  • dedecms搭建网站做营销型网站 公司
  • 成都医院网站建设制作个人网页的过程