【问题标题】:how to calculate machine cycle time of given micro controller unit如何计算给定微控制器单元的机器周期时间
【发布时间】:2018-08-25 07:31:17
【问题描述】:

我正在研究 si labs 的 8051 MCU。我想使用定时器产生精确的 1ms 延迟。为此,我想知道给定 MCU 的机器周期时间是多少。单片机完成一条机器指令所用的时间。然后我可以计算出完成1ms延迟需要多少个机器周期。

【问题讨论】:

  • 您说您想使用计时器,即用于创建计时的特殊工作的外围设备。但是您询问有关不使用计时器的信息,即 MCU 的机器周期,即您只需要通过与 CPU 循环来进行计时。请解释更多。
  • 要使用定时器,请阅读如何配置它、选择一个时间、启动它并在时间过去后使用它来触发代码。你应该有这方面的文件。我想你将不得不学习中断编程。另一种方法是轮询计时器,以检测时间已过。然而,这通常不是如何使用计时器。
  • 您可能应该迁移到较新的 Silabs 部件,例如 EFM32 系列。 8051 已经死了几十年了。为它编写 C 代码几乎和使用 Simplicity Studio 一样痛苦。

标签: c embedded


【解决方案1】:

要使用定时器,您需要知道定时器时钟的频率是多少。然后你只需要:timer_clocks=delay*frequency;

仅当您想要阻塞延迟时才需要知道指令时间。有两个来源:uC 文档或实验。要知道您需要多少个循环,只需将示波器连接到引脚并根据需要循环多次以归档所需的脉冲长度

【讨论】:

    【解决方案2】:

    通过计算 MCU 周期来创建时间延迟是一种糟糕的方法 - 特别是如果您使用 C 进行编码,而您无法控制编译器将生成的机器指令 - 您的循环可能会根据编译器选项(例如优化级别)而改变.

    此外,MCU 无法测量自己的时钟;它唯一的时间流逝概念是以时钟周期为单位——问它一个周期有多长就像问一个人一秒有多长。从 MCU 的角度来看,一个时钟周期有多长这个问题的答案始终是 1。

    作为系统的程序员,您有责任了解时钟速度。通常,硬件通过其晶体或振荡器速率来定义速度,而 MCU PLL 设置决定了乘数。大多数情况下,您会将这个速度作为常数嵌入到启动代码中。您的代码可能会访问此常量。

    即便如此,最好还是使用片上定时器单元而不是基于软件的指令计数来创建延迟(而且并非所有 8051 指令都是单周期的)。在这种情况下,您仍然需要知道时钟速度;那么定时器时钟可以进一步分频。

    【讨论】:

    • 可以通过内联汇编在很大程度上克服确定性问题(除了中断)。这样的程序延迟对于较短的插页式内容很有用,例如,bit-banging 接口比软件可以达到的最大速率稍慢,或者允许操作之间的稳定时间。
    • @ChrisStratton 当然可以,但是问题被标记为 [C],并且时间段为 1ms,所以...
    猜你喜欢
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多