LED 灯闪烁程序
最简单的 LED 闪烁程序会在驱动端口输出高电平和低电平之间不断循环。使用 <: 运算符在端口上输出值。在输出之间,您可以使用 delay_milliseconds 函数使任务暂停。在 timer.h 中定义了几个 delay_ 函数。
void flashing_led_task1 (port p, int delay_in_ms) {
while (1) {
p <: 0;
delay_milliseconds(delay_in_ms);
p <: 1;
delay_milliseconds(delay_in_ms);
}
}
上面的简单示例会在端口输出之间阻塞逻辑核心,效率较低。为了允许在输出之间进行其他计算,您需要使用定时器事件。这需要声明一个定时器类型的变量,然后使用 select 语句对定时器上的事件做出反应。
[[combinable]]
void flashing_led_task2 (port p, int delay_in_ms) {
timer tmr;
unsigned t;
// 将延迟从毫秒转换为100 MHz定时器滴答数
const int delay_ticks = delay_in_ms * 100000;
// 我们将要输出的值
unsigned val = 0;
// 读取初始定时器值
tmr :> t;
while (1) {
select {
// 当定时器移动到 (t + delay_ticks) 之后时触发此事件,即在我们取时间戳 t 后 delay_ticks 时间之后
case tmr when timerafter(t + delay_ticks) :> void:
p <: val;
val = ~val;
// 设置下一个事件
t += delay_ticks;
break;
}
}
}
请注意,此函数已标记为[[combinable]]。这意味着它可以与其他可组合函数共享逻辑核心,这些函数将处理闪烁 LED 任务的端口输出之间的其他事件。