我知道这听起来很荒谬。但我想不出,或者没有充分地定义搜索,如何在C中使用代码使闪烁的LED以恒定频率运行,而程序的其余部分运行。设置并忘记一些事情。我今天看到了线程,虽然我的基本理解似乎有点复杂。
我正在Windows上开发,并在MikroC上运行PIC18,但是当我在Arduino上开发一个不同的项目时,我有同样的想法。
答案 0 :(得分:1)
查看Multithreading using C on PIC18
的答案对于标准C开发,这需要多线程,但this answer建议使用事件循环。
答案 1 :(得分:1)
大多数微控制器都有可用于此类目的的硬件定时器。因此,定时器中的代码将切换闪烁,主软件可以设置变量,告诉定时器代码是否应该闪烁
defaultConfig {
project.ext.set("archivesBaseName", "app-xxx." + defaultConfig.versionName);
}
答案 2 :(得分:1)
只需使用用于此类的微控制器硬件即可。输出比较定时器,PWM硬件等。如果您没有任何此类硬件,在大多数情况下,从中断切换I / O端口应该足够准确。
答案 3 :(得分:0)
在PIC上,你不一定会像忙碌等待循环这样简单的东西直接跳到像多线程库一样复杂的东西,正如一些评论中提出的那样。
让我们假设你在循环中每秒闪烁你的LED - 这使得循环中的代码(或从该循环内部调用)将近1秒来执行不同的事情。如果你可以将这些任务分成如此小的切片,使它们适合于间隔时间,当你需要回来时#34;为了使LED闪烁,这是一个开始。
显然,如果你在闪烁循环中执行任意代码,闪烁的频率将受到其他代码部分耗尽的时间的影响,你不能再使用CPU作为时间基础 - 你需要一些不同的东西检查是否闪烁。大多数MCU都有一个定时器,允许你这样做 - 读一个自由运行的定时器来检查你是否需要闪烁"这将是第一个简单的步骤。见下面的伪代码:
while (1){
if (((time = readTimer()) - oldTime) > INTERVAL){
/* Timer run-around ignored for reasons of simplicity */
oldTime = time;
blink();
}
else
doSomethingElse();
}
注意somethingElse()
必须在尽可能短的时间内完成,因为它的运行时间会影响闪烁的精确度。
如果你仍然想要以确切的间隔闪烁,你应该研究中断服务程序。了解如何使定时器以闪烁频率触发中断,并在中断服务程序中执行闪烁。这会释放你的主循环,你可以做任何你想要的长期运行任务。定时器将按您想要的频率触发中断,中断服务程序将切换指示灯。