1. 多核并行LED闪烁
任务说明
本案例在XMOS多核处理器上创建两个并行任务(逻辑核),分别控制两个LED以不同频率闪烁,用于验证多核并行执行能力。任务A控制LED0以1Hz频率闪烁(500ms亮/500ms灭),任务B控制LED1以2Hz频率闪烁(250ms亮/250ms灭)。两个任务通过par语句并行运行,互不阻塞。
硬件连接
以XMOS xCORE-200系列开发板为例,两个LED分别连接至1号Tile的X0D0和X0D1端口引脚,低电平点亮。若实际板卡引脚不同,仅需修改端口定义即可。
代码实现
创建文件par_led_blink.xc,完整代码如下:
#include <xs1.h>
#include <platform.h>
#include <timer.h>
// LED端口定义:低电平点亮
port p_led0 = XS1_PORT_1A; // X0D0
port p_led1 = XS1_PORT_1B; // X0D1
// 任务A:控制LED0以1Hz频率闪烁(500ms亮/500ms灭)
void led0_blink_task(void)
{
timer tmr;
unsigned int next_time;
tmr :> next_time; // 读取当前时间
while (1) {
p_led0 <: 0; // 点亮LED0(低电平有效)
next_time += 500000; // 500ms = 500,000 时钟周期(100MHz)
tmr when timerafter(next_time) :> void;
p_led0 <: 1; // 熄灭LED0
next_time += 500000;
tmr when timerafter(next_time) :> void;
}
}
// 任务B:控制LED1以2Hz频率闪烁(250ms亮/250ms灭)
void led1_blink_task(void)
{
timer tmr;
unsigned int next_time;
tmr :> next_time;
while (1) {
p_led1 <: 0; // 点亮LED1
next_time += 250000; // 250ms = 250,000 时钟周期
tmr when timerafter(next_time) :> void;
p_led1 <: 1; // 熄灭LED1
next_time += 250000;
tmr when timerafter(next_time) :> void;
}
}
// 主入口:并行运行两个任务
int main(void)
{
par {
led0_blink_task();
led1_blink_task();
}
return 0;
}
代码说明
代码中par语句将两个任务分配到不同的逻辑核上并行执行。每个任务内部使用timer实现精确延时,timerafter确保延时不受其他任务影响。XMOS标准时钟频率为100MHz,因此500ms对应500,000个时钟周期,250ms对应250,000个时钟周期。端口XS1_PORT_1A和XS1_PORT_1B分别映射到X0D0和X0D1引脚。
编译与运行
在XMOS开发环境(xTIMEcomposer或命令行)中执行以下步骤:
xcc -target=XCORE-200-EXPLORER par_led_blink.xc -o par_led_blink.xe
xrun --io par_led_blink.xe
若使用其他开发板,请将-target参数替换为对应的目标文件。
验证方法
运行程序后观察两个LED的闪烁行为:
- 判定标准1:LED0以1Hz频率闪烁(每秒亮灭各一次),周期稳定无抖动。
- 判定标准2:LED1以2Hz频率闪烁(每秒亮灭各两次),周期稳定无抖动。
- 判定标准3:两个LED独立闪烁,互不干扰——LED0的闪烁节奏不会因LED1的快速切换而改变,反之亦然。
若两个LED均按各自频率稳定闪烁且互不影响,则证明两个逻辑核确实在并行执行各自的任务,多核并行能力验证通过。