前面听说风很大755 2024-07-21 11:59 采纳率: 0%
浏览 24
已结题

while循环中OLED显示中断中的数据不正确

img

img

每10ms读取编码器的值,编码器值一个是由外部中断读的(左轮),一个是定时器捕获读的(右轮)。

img

在主循环里读取显示的两个编码器值不一样,此时没有转向,显示的两个值应该是一样的,但是中断读编码器的这个显示的是不符的(左轮),但是中断中读到的值是应该是对的,因为可以控制小车平衡。

如果control函数中只有读取这两个值的代码,显示的值就是符合的,两个轮子都是相同的转速。

这是什么原因造成的?两个编码器的值只在中断中读取和更新,这个值应该定时器10ms间隔读出来的。

所以主要的问题是中断中读取的值和主循环中显示的值不一致,用的标准库

  • 写回答

31条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-21 12:11
    关注
    获得0.40元问题酬金

    引自免费微信小程序:皆我百晓生

    从您提供的信息来看,问题可能出在数据同步和变量访问的并发性上。在多任务系统(特别是有中断参与的情况下),确保数据的一致性和同步是非常关键的。以下是几个可能导致问题的原因及相应的解决策略:

    1. 数据访问冲突

    问题描述: 当中断和主循环同时访问共享变量(如Encoder_LeftEncoder_Right)时,可能会发生数据的不一致,特别是在变量更新和读取之间的时间窗口内。

    解决策略:

    • 使用互斥锁(Mutex): 在STM32中,可以使用CMSIS OS提供的互斥锁机制保护共享资源。在读写共享变量前加锁,操作完成后解锁。但要注意,互斥锁通常不推荐用于中断上下文,因为它可能引起优先级反转问题。
    osMutexId_t mutex;
    // 初始化互斥锁
    osMutexDef(mutex);
    mutex = osMutexCreate(osMutex(mutex));
    
    // 在Control函数和主循环中使用
    osMutexWait(mutex, osWaitForever);
    // 访问和修改共享变量
    osMutexRelease(mutex);
    
    • 原子操作: 对于简单的数据类型,如整型,可以尝试使用硬件支持的原子操作(如STM32的__LDREX()__STREX())来确保读写操作的原子性。

    2. 中断与主循环的时序问题

    问题描述: 如果Control函数被频繁调用(每10ms),并且中断与主循环中对编码器值的读取时机非常接近,可能会捕捉到不同步的数据。

    解决策略:

    • 确保数据更新和显示同步: 可以考虑在Control函数处理完所有数据后,设置一个标志,主循环检测到这个标志后再进行显示更新。这样可以确保显示的数据是最新的且已完全计算完毕的。
    volatile bool dataReady = false;
    
    void Control(void)
    {
        // ... 处理数据 ...
        dataReady = true;
    }
    
    while (1)
    {
        if(dataReady)
        {
            OLED_ShowsignedNum(...); // 显示数据
            OLED_Update();
            dataReady = false;
        }
    }
    

    3. 缓存一致性

    问题描述: 在某些架构中,存在高速缓存和内存之间的数据一致性问题,虽然在大多数嵌入式MCU中这不是常见问题,但理论上如果您的STM32配置了DMA或类似功能,这可能成为一个因素。

    解决策略:

    • 强制数据同步: 使用适当的内存屏障指令(如DSBDMB)确保内存操作的顺序性,但这通常在直接操作硬件寄存器或涉及DMA传输时才需要考虑。

    4. 验证和测试

    • 增加调试信息: 在代码中添加更多的打印语句,记录每次中断和主循环读取变量时的具体时间戳和值,有助于追踪数据不一致发生的精确时刻。
    • 模拟低速运行: 尝试降低系统整体运行速度或增加延时,看是否能减少问题出现的概率,这有助于判断是否为时序或竞争条件问题。

    综上所述,确保数据访问的同步性和一致性是解决您遇到问题的关键。尝试上述建议,并根据实际运行情况调整策略。希望这些建议能帮助您找到并解决显示数据不一致的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月29日
  • 修改了问题 7月21日
  • 修改了问题 7月21日
  • 修改了问题 7月21日
  • 展开全部

悬赏问题

  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题