一个困扰我很久的问题
WangGaojie Lv4

大约在一年半前,我写了一篇文章介绍如何统计FreeRTOS系统中任务的实时CPU占用率的方法,其中最关键的是使用DWT计数器。我一直认为这个计数器在任意条件下都是能够正确运行的,直到我把它运用到Cortex-M7内核中。

正常情况下Cortex-M7内核的DWT计数器能够正常工作,只是需要操作一个访问锁寄存器LAR,但是我发现各个单片机对这个锁的实现并不是一致的,某些单片机不解锁仍然能够使用DWT功能,ARM的技术手册中也没有详细描述这寄存器。LAR锁不是今天讨论的主要内容,略过。我这里主要想说说单片机睡眠模式下遇到的DWT计数异常的问题。

当我使用FreeRTOS的低功耗模式时就发现了DWT异常的现象,当单片机进入休眠状态后,DWT的计数器并没有继续运行,这个现象我只在STM32H750这个单片机上碰到,由于我手上没有其它的CM7的单片机,所以我无法确认这个问题是不是这个单片机特有的。当出现这个问题后我就在CM4的单片机上尝试复现,但是在CM4的单片机中任务统计功能和低功耗都能很好的运行。

我在网上检索了很多的资料,都没有相关的描述,这让我非常怀疑是软件某个地方配置不当导致的,但是我却并没有发现可疑的地方。

当启用FreeRTOS的低功耗模式后,在tickless处理流程中,我确认DWT的CYCCNT寄存器没有继续计数,所以启用低功耗模式后,统计任务的CPU占用时间就不可靠了。

由于能够确认在tickless中CYCCNT的计数存在缺失,所以通过FreeRTOS的HOOK能够进行一定程度的补偿来确保任务CPU统计功能大致正常工作,但是这总是存在误差的,因为依靠traceINCREASE_TICK_COUNT()纠正的时间精度不够准确。

如果能确认这个问题是硬件导致的,我就放心了,因为我常常时不时的就在尝试完美解决这个问题,这个问题困扰我很久了。