2

我正在C2000 F28069 Experimenters Kit上编程。我连续 5 次每 12.5 微秒切换一次 GPIO 输出。我决定我不想使用中断(尽管如果我绝对需要的话我会这样做)。我只想在时钟周期方面等待那段时间。

我的时钟运行在 80MHz,所以 12.5 us 应该是 1000 个时钟周期。当我使用循环时:

for(i=0;i<1000;i++)

我得到的结果太长了(不是 12.5 us)。我还可以使用哪些其他技术?

sleep(n);我可以在微控制器上使用吗?如果是这样,我需要下载哪个头文件,在哪里可以找到它?另外,现在我考虑一下,sleep(n);需要一个 int 输入,所以这甚至行不通……还有其他想法吗?

4

3 回答 3

7

摘要:使用 PWM 或定时器外设来生成输出脉冲。

首先,CPU 的时钟速度与实际代码执行速度有着复杂的关系,在许多 CPU 中,不同的执行阶段涉及不止一个时钟频率。例如,您引用的芯片有几个内部时钟源。此外,每条单独的指令可能需要不同数量的时钟来执行,并且一些内核可以同时执行部分(或全部)几条指令。

要在不使用定时中断或其他硬件设备的情况下严格创建一个需要 12.5 µs 执行的循环,需要用汇编语言仔细手工编码,并仔细计算每条指令的执行时间。

但是您是用 C 语言编写的,而不是汇编程序。

所以你要问的第一个问题是你的循环实际上生成了什么机器代码。第二个问题是您是否启用了优化器,以及启用到什么级别。

正如所写,一个体面的优化器将确定循环for (i=0; i<1000; i++) ;没有可见的副作用,因此只是一种缓慢的编写方式;,可以完全删除。

如果它确实编译了循环,则可以使用多达 5 条指令或少至一两条指令来天真地编写它。我个人并不熟悉这种特定的 TI CPU 架构,因此我不会尝试猜测最佳实现方式。

综上所述,了解 CPU 架构及其效率对于构建可靠且高效的嵌入式系统非常重要。但考虑到该芯片内置了为 PWM(脉冲宽度调制)输出以及通用硬件定时器/计数器提供硬件支持的外围设备,您最好学习使用硬件为您生成波形。

我会首先收集 CPU 内核及其外围设备上的所有可用文档,尤其是应用说明和示例代码。

C 编译器可以选择生成和保存汇编语言源文件。我将以此为指导来研究为关键循环和其他瓶颈生成的代码结构,以及编译器各种优化级别的影响。

该工具套件应该有一种机制来分析您的运行代码。在开始追求优化的英雄措施之前,首先使用它来确定实际的瓶颈。即使它缺乏像样的配置文件,您也可能有备用的 GPIO 引脚,可以在代码的关键部分进行切换并使用逻辑分析仪或示波器进行测量。

于 2013-06-26T18:22:19.483 回答
2

The chip you refer has PWM (pulse width modulation) hardware declared as one of major winning features. You should rely on this. Please refer to appropriate application guide. Generally you cannot guarantee 12.5uS periods from application layer (and should not try to do so). Even if you managed to do so directly from application layer it's bad idea. Any change in your firmware code can break this.

于 2013-06-26T19:35:13.510 回答
1

如果您已经按照@RBerteig 的建议使用具有 PWM 输出功能的定时器外设,那么您可以生成准确的时序信号,而软件开销为零。如果您需要与时钟同步进行其他工作,那么您也可以使用定时器中断来触发它。但是,如果您以 12.5us 的间隔处理中断,您可能会发现您的处理器花费大量时间进行上下文切换,而不是执行有用的工作。

如果您只是想要一个准确的延迟,那么您仍然应该使用硬件计时器并轮询其重新加载标志而不是处理其中断。这允许独立于编译器的代码生成或处理器速度的一致时序,并允许您在循环中添加其他代码而不延长总循环时间。您将在一个循环中轮询它,在此期间您也可以做其他工作。时序抖动和确定性将取决于您在循环中执行的其他工作,但对于空循环,对定时器的反应甚至可能比中断处理程序的延迟更快。

于 2013-06-26T18:58:12.370 回答