嵌入式编程,等待12.5微秒。

3

我正在使用C2000 F28069实验套件进行编程。 我想要在连续5次中每12.5微秒切换一次GPIO输出。 我决定不使用中断(虽然如果必须的话我会使用)。 我只希望以时钟周期数等待那么长的时间。

我的时钟在运行80MHz,因此12.5微秒应该是1000个时钟周期。当我使用循环时:

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

我得到了一个结果,它太长了(不是12.5微秒)。我可以使用哪些其他技术?
在微控制器上,我可以使用`sleep(n);`吗?如果可以,我需要下载哪个头文件以及在哪里可以找到它?另外,现在我想起来,`sleep(n);`需要一个int类型的输入,所以那甚至都行不通...还有其他的想法吗?

3
while循环可以生成一个运行超过1000个时钟周期的循环,因为它需要执行加法、分支等操作。循环内的每个操作都需要多于一条指令来完成。此外,在某些微控制器上,有些指令需要多个时钟周期才能完成。 - Kristopher Micinski
更不用说知道有哪些操作系统,如果有的话,还有哪些其他任务等等,这都是很好的了解。 - user405725
2
你不想使用中断的特定原因是什么?在微控制器上实现良好定义的延迟,结合硬件定时器和ISR似乎是您应该使用的组合。 - Oliver Charlesworth
同意Oli的观点。作为一名程序员、渴望成为硬件黑客和业余电子工程师,每当我与真正的电子工程师朋友谈论他们的嵌入式开发经历时,似乎他们最讨厌的事情就是忙等待循环。你应该设置一个定时器,将设备置于睡眠状态,并在收到中断时继续执行。 - Suboptimus
+1 对于至少提到具体 CPU 核心和执行环境的问题。通过几秒钟的谷歌搜索就可以获得足够的细节,以了解这很可能是没有操作系统的裸机环境。该提问者显然在嵌入式领域有很多要学习的地方,应该鼓励他继续提问。 - RBerteig
显示剩余2条评论
3个回答

8
简述:使用PWM或定时器外设生成输出脉冲。
首先,CPU的时钟速度与实际代码执行速度之间存在复杂关系,在许多CPU中,不同执行阶段涉及多个时钟速率。例如,您引用的芯片具有几个内部时钟源。此外,每个单独的指令可能需要不同数量的时钟来执行,有些核心可以同时执行部分或全部几个指令。
要严格创建一个需要12.5微秒执行的循环,而不使用定时中断或其他硬件设备,需要精心编写汇编语言,并仔细计算每个指令的执行时间。
但你是在用C语言编写。
因此,第一个问题是要问生成了什么机器代码用于循环。第二个问题是是否启用了优化器以及优化级别如何。
按照现有代码,一个好的优化器将确定循环for (i=0; i<1000; i++) ;没有可见的副作用,因此只是一种缓慢的编写;的方式,并且可以完全删除。
如果编译循环,它可能会使用多达5条指令或只有1到2条指令的方式进行简单编写。我个人不熟悉这种TI CPU架构,因此不会尝试猜测最佳实现方式。
所有这些都说明了,了解CPU架构及其效率对于构建可靠和高效的嵌入式系统非常重要。但是,考虑到芯片内置了提供PWM(脉冲宽度调制)输出以及通用硬件定时器/计数器的外围设备,您最好学习如何使用硬件为您生成波形。
我建议首先收集与CPU核心及其外围设备相关的所有文档,特别是应用笔记和示例代码。
C编译器将具有发出和保留汇编语言源文件的选项。我会将其用作指导,研究关键循环和其他瓶颈所生成的代码结构,以及编译器各种优化级别的影响。
工具套件应该具有一种机制来对运行代码进行分析。在追求优化措施之前,请首先使用它来确定实际瓶颈。即使缺乏良好的分析功能,您也可能拥有可以在关键代码部分切换并使用逻辑分析仪或示波器测量的备用GPIO引脚。

非常感谢。一个快速的跟进,现在不能使用for循环是有道理的。但我仍然遇到了时钟速度的困难。我正在使用CPU定时器0,设置周期为160000个周期,时钟频率为80MHz,这应该给我一个2毫秒的周期。但是,当我在示波器上查看时,实际上得到的是10倍以上。此外,是否有一种方法可以直接根据计时器的值设置中断?还是我必须使用不同周期(12.5微秒)的PWM,并在计时器重置时设置中断?您提到了计时器外设,但我不确定除了PWM之外还有哪些选项。 - user2525288
该芯片的时钟配置选项丰富多样。如果 SYSCLKOUT 确实运行在80MHz,那么您需要在 TIMER0 的预分频器和周期寄存器中设置除以160000来实现2ms的周期。请注意细节,加载的数值往往与所需周期相差一位。请仔细阅读上面链接中的技术参考手册,特别是关于 TIMER0/1/2 的章节,这些是除了 PWM 之外的计时器外设。 - RBerteig

2

您所提到的芯片具有PWM(脉冲宽度调制)硬件,这被声明为其主要优势之一。您应该依赖于此。请参考适当的应用指南。通常情况下,您不能从应用层保证12.5微秒的周期(也不应尝试这样做)。即使您直接从应用层成功实现了这一点,这也是一个坏主意。您固件代码的任何更改都可能破坏它。


1
如果您使用具有PWM输出功能的定时器外设,如@RBerteig所建议的,那么您可以生成一个准确的定时信号,而不需要任何软件开销。如果您需要与时钟同步执行其他工作,则可以使用定时器中断触发该操作。但是,如果您以12.5us的间隔处理中断,则可能会发现您的处理器花费大量时间在上下文切换而不是执行有用的工作。
如果您只是想要一个精确的延迟,则仍应使用硬件定时器并轮询其重新加载标志,而不是处理其中断。这允许独立于编译器的代码生成或处理器速度的一致计时,并允许您在循环内添加其他代码而不会延长总循环时间。您可以在轮询循环中轮询它,在此期间您可能还会执行其他工作。定时抖动和确定性取决于您在循环中执行的其他工作,但对于空循环,对定时器事件的反应可能比中断处理程序的延迟更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接