微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

cortex-m1 上的计时函数给出了奇怪的结果

如何解决cortex-m1 上的计时函数给出了奇怪的结果

我在 cortex-M1 上的计时功能有问题。我正在使用 Arty A7,我正在使用 systick 来计算函数的时钟持续时间。问题是我得到的时钟没有意义,在我的 PC 上对功能进行原型设计时,我使用 time.h 中的 clock() 测量了它的时钟持续时间 - 它花了大约 5000 个时钟。接下来我尝试在 cortex-M1 上测量它并使用 systick 计算时钟 - 现在结果显示数百万个时钟,我认为这没有意义。

这是我如何使用 systick 进行测量

#define STCTRL      (*( ( uint32_t *) 0xE000E010 ))
#define STRELOAD    (*( ( uint32_t *) 0xE000E014 ))
#define STCURR      (*( ( uint32_t *) 0xE000E018 ))

int main(void)
{
    SystemInit();
    STRELOAD = 16000000;
    uint32_t start,stop;

    STCTRL = (1<<0) | (1<<2);
    wait(1000);
    start = STCURR;
    function();
    stop = STCURR;
    STCTRL = (0<<0);
    printf("%d",(int)(start-stop));
}

我不确定这些信息的相关性,但是当我使用 gcc-9 编译并使用 -O3 -Otime 进行原型设计时,在为 cortex-M1 编译时我使用 armcc v5.06 - 使用标志更新 7:- c99 --gnu -c --cpu Cortex-M1 -D__EVAL --li -g -O3 -Otime

我的问题是这 2 个测量值如何以及为何如此不同?测量时钟周期(使用时钟()或系统棒)时我做错了吗?

解决方法

首先,您的寄存器定义是错误的,因为它们缺少 volatile

#define SysTick_TCTRL      (*((volatile uint32_t*)0xE000E010))
etc.

接下来,您需要将 SysTick_LOAD 设置为 (period - 1),而不是 period。在您的示例中,句点为 16000001。

在那之后,systick 倒计时并以 24 位或您设置的限制换行,因此您需要使用模数或只是 if-then-subtract 来撤消此操作。 Modulo 更整洁,但分歧会导致 ARMv6M 上的库。

if (start > stop)
{
  duration = (start - stop);
}
else
{
  duration = (period - (stop - start));
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。