找回密码
 立即注册
查看: 50|回复: 5

AI8H单片串口通讯例程问题

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:53
  • 最近打卡:2025-05-07 16:41:06

3

主题

6

回帖

293

积分

中级会员

积分
293
发表于 5 天前 | 显示全部楼层 |阅读模式
在AI8H有这样的串口例程

串口中断函数
{
    if (RI)
    {
        RI = 0;                                 //清中断标志
        buffer[wptr++] = SBUF;
        wptr &=0x0f;//0000 1111
                                //测试端口
    }
    if (TI)
    {
        TI = 0;                                 //清中断标志
        busy = 0;                             //发送完成。
    }
   
}

其中,wptr &=0x0f;不理解含义。

主函数中
while(1)
    {
        if(rptr != wptr)
        {
         UartSend(buffer[rptr++]);
         rptr &= 0x0f;
        }
    }

同样不理解 rptr &= 0x0f;,哪位老师帮忙解释一下吗
回复

使用道具 举报 送花

3

主题

1102

回帖

915

积分

等待验证会员

积分
915
发表于 5 天前 | 显示全部楼层
在单片机串口通信的环形缓冲区设计中,wptr &= 0x0F和rptr &= 0x0F这两条语句体现了典型的循环队列实现技术。以下从计算机体系结构和嵌入式系统设计角度进行专业分析:

1. 循环队列的数学原理:
0x0F的二进制表示为0000 1111,按位与操作等效于对16取模运算(wptr % 16)
通过位运算替代除法取模,将算法复杂度从O(n)降低到O(1),在8位单片机中可节省约20-30个时钟周期
该实现要求缓冲区长度必须为2的整数次幂(本例中16=2^4),否则需改用传统取模运算

2. 内存布局优化:
创建16字节对齐的缓冲区:uint8t buffer[16] attribute((aligned(16)))
利用指针回绕特性,将物理线性存储映射为逻辑环形结构
读/写指针使用uint8t类型,通过隐式截断实现自然溢出,但显式位与操作提高可读性

3. 临界区保护机制:
原始代码存在潜在竞态条件:当主循环读取rptr时,可能被中断服务程序修改wptr
改进方案:
   
  1. c
  2.      EA = 0; // 关中断
  3.      uint8t localrptr = rptr;
  4.      EA = 1; // 开中断
  5.      if(localrptr != wptr) {
  6.          // 处理数据
  7.      }
复制代码

4. 性能优化指标:
中断服务时间:典型值应小于100μs(在24MHz时钟下约2400个周期)
缓冲区空/满判断优化:
   
  1. c
  2.      #define BUFSIZE 16
  3.      #define BUFMASK (BUFSIZE-1)
  4.      
  5.      // 写入时检查
  6.      if(((wptr + 1) & BUFMASK) == rptr) {
  7.          // 缓冲区满处理
  8.      }
  9.      
  10.      // 替代方案:使用计数器减少判断复杂度
  11.      volatile uint8t count = 0;
  12.      void UARTISR() {
  13.          if(RI) {
  14.              if(count < BUFSIZE) {
  15.                  buffer[wptr++] = SBUF;
  16.                  wptr &= BUFMASK;
  17.                  count++;
  18.              }
  19.          }
  20.      }
复制代码

5. 扩展应用场景:
多缓冲区分层设计:DMA+双缓冲用于大数据量传输,环形缓冲用于命令解析
流量控制机制:当缓冲区使用率超过75%时,通过硬件流控(RTS/CTS)或软件XON/XOFF控制数据流
错误检测增强:增加奇偶校验位检查或CRC校验段

6. 实时性分析:
设波特率为115200bps,每字节传输时间约87μs
最坏情况下,主循环必须在1687μs=1.39ms内处理完所有数据
通过引入优先级中断或DMA传输可降低CPU负载

该设计模式体现了嵌入式系统中经典的"生产者-消费者"模型,在保证实时性的同时实现了资源受限环境下的高效数据管理。实际工程应用中还需考虑电源管理、错误恢复等可靠性设计要素。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:526
  • 最近打卡:2025-05-09 08:02:13
已绑定手机

48

主题

1755

回帖

2750

积分

金牌会员

积分
2750
发表于 5 天前 | 显示全部楼层
wptr=wptr & 0x0f
这样能不能理解?屏蔽wptr的高4位
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:418
  • 最近打卡:2025-05-09 08:54:03
已绑定手机

39

主题

2016

回帖

6879

积分

论坛元老

积分
6879
发表于 4 天前 | 显示全部楼层
wptr 与 rptr 是串口发送/接收的数据计数器,表示发送/接收的数据个数。
wptr &=0x0f;    rptr &= 0x0f;
以上指令取计数器的低4位,也就是说计数器的有效范围是0~15(0x00~0x0F)。
buffer缓冲区存放的数据上限是15个字节。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:53
  • 最近打卡:2025-05-07 16:41:06

3

主题

6

回帖

293

积分

中级会员

积分
293
发表于 3 天前 | 显示全部楼层
国芯人*** 发表于 2025-5-5 20:03
在单片机串口通信的环形缓冲区设计中,wptr &= 0x0F和rptr &= 0x0F这两条语句体现了典型的循环队列实现技术 ...

感谢大佬详细的回答,限于自己知识面,还得去补充知识去理解。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:53
  • 最近打卡:2025-05-07 16:41:06

3

主题

6

回帖

293

积分

中级会员

积分
293
发表于 3 天前 | 显示全部楼层
乘风*** 发表于 2025-5-6 09:57
wptr 与 rptr 是串口发送/接收的数据计数器,表示发送/接收的数据个数。
wptr &=0x0f;    rptr &= 0x0f;
以 ...

也就是不能超过15个数据。这样好理解
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-10 03:46 , Processed in 0.164087 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表