c - 嵌入式编程,等待12.5 us

标签 c embedded real-time

我正在 C2000 F28069 Experimenters Kit 上编程.我连续 5 次每 12.5 微秒切换一次 GPIO 输出。我决定我不想使用中断(尽管我会在绝对必要的情况下使用)。我只想在时钟周期方面等待那么多时间。

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

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

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

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

最佳答案

总结:使用PWM或Timer外设产生输出脉冲。

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

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

但你是用 C 语言而不是汇编语言编写的。

因此,您必须问的第一个问题是为您的循环实际生成的机器代码是什么。第二个问题是您是否启用了优化器,以及启用到什么级别。

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

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

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

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

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

工具套件应该有一个机制来分析你正在运行的代码。在为追求优化而采取大胆措施之前,请先使用它来确定实际的瓶颈。即使它缺乏合适的分析,您也可能有备用的 GPIO 引脚,可以在代码的关键部分切换并使用逻辑分析仪或示波器进行测量。

关于c - 嵌入式编程,等待12.5 us,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17327201/

相关文章:

javascript - Rails 实时数据库查询跑马灯/股票代码

c - 如何将 char 指针值分配给整数/char 变量或数组

将字符串更改为帕斯卡大小写

embedded - 如何使用 OpenOCD ping 芯片(检测芯片是否已连接)

linux - Linux 机器上的 SD 卡吞吐量

两个任务之间的同步

c - 为什么 nanosleep() 会增加一个恒定的延迟,我该如何避免呢?

hadoop - 进行实时数据分析的最佳方式

c - 忽略字符串中的逗号

c - 尽管有无限的 ulimit,为什么非常大的堆栈分配会失败?