1. 多核并行LED闪烁

多核并行LED闪烁 学习卡片

任务说明

本案例在XMOS多核处理器上创建两个并行任务(逻辑核),分别控制两个LED以不同频率闪烁,用于验证多核并行执行能力。任务A控制LED0以1Hz频率闪烁(500ms亮/500ms灭),任务B控制LED1以2Hz频率闪烁(250ms亮/250ms灭)。两个任务通过par语句并行运行,互不阻塞。

硬件连接

以XMOS xCORE-200系列开发板为例,两个LED分别连接至1号Tile的X0D0和X0D1端口引脚,低电平点亮。若实际板卡引脚不同,仅需修改端口定义即可。

XMOS xCORE Tile 0 逻辑核 A 1Hz 闪烁 逻辑核 B 2Hz 闪烁 X0D0 X0D1 LED0 LED1 GND 多核并行LED闪烁硬件连接 500ms周期 250ms周期

代码实现

创建文件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均按各自频率稳定闪烁且互不影响,则证明两个逻辑核确实在并行执行各自的任务,多核并行能力验证通过。