嵌入式之XMOS打印Hello World

0 阅读2分钟

你好呀,我的老朋友!我是老寇,跟我一起学习嵌入式开发

XMOS xCORE 双 Tile 架构图

83bd2b922d9413d00229dc4625225b48.png

解释

这是 双 Tile 对称架构,一个 core 对应一个 硬件线程一个Tile只允许有8个硬件线程,通过 中间 switch 传输数据

XC介绍

XC = 为并发和实时硬件设计的 C 扩展语言

你想做的事C语言怎么做XC怎么做备注
写程序入口main()main()一样
顺序执行默认默认一样
同时做两件事很难非常简单XC最大优势
多任务需要操作系统语言自带XC更简单
任务通信共享变量channelXC更安全
等待事件中断selectXC更直观
控制IO调外设直接控制XC更底层
精确时间很难内建支持XC强项
锁(mutex)必须学不需要XC省事
容易写错XC更安全
项目例子

写一个简单例子

CMakeLists.txt

# 要求 CMake ≥ 3.21
cmake_minimum_required(VERSION 3.21)

# 加载 XCommon CMake 模块 (必须在 project() 之前)
include("$ENV{XMOS_CMAKE_PATH}/xcommon.cmake")

# 项目定义
project(xmos_demo)

# 目标平台
set(APP_HW_TARGET "XCORE-AI-EXPLORER")

# 源文件
set(APP_XC_SRCS
    src/main.xc
)

# 编译选项
# -O2 保持可调试性
# -g 生成调试信息
# -report 生成资源报告
set(APP_COMPILER_FLAGS
    -O2
    -g
    -report
)

# 注册 XMOS 应用
XMOS_REGISTER_APP()

main.xs

/**
 * XMOS 8 线程 Hello World 演示
 *
 * xCORE tile[0] 有 8 个硬件线程
 * par{} 中的每一项占用 1 个线程,真正同时执行(非操作系统调度)
 */

#include <platform.h>
#include <stdio.h>
#include <xs1.h>

/**
 * 每个线程执行的任务
 * 打印自己的线程编号
 */
void hello_task(int thread_id)
{
    printf("Hello World from thread %d!\n", thread_id);
}

int main(void)
{
    par
    {
        /**
         * 8 个任务 = 8 个硬件线程,同时启动
         * 打印顺序不固定,因为它们是真正的并行执行
         */
        on tile[0]: hello_task(0);
        on tile[0]: hello_task(1);
        on tile[0]: hello_task(2);
        on tile[0]: hello_task(3);
        on tile[0]: hello_task(4);
        on tile[0]: hello_task(5);
        on tile[0]: hello_task(6);
        on tile[0]: hello_task(7);
    }

    return 0;
}

步骤

su root

# 设置XMOS TooL环境,这步骤跳过,请自行设置

# 构建
cmake -B build
cmake --build build

# 模拟运行
xsim bin/xmos_demo.xe

# 烧录【根据自己需要使用不同命令】
xrun --io bin/xmos_demo.xe

# 烧录并运行【根据自己需要使用不同命令】
xflash bin/xmos_demo.xe

# 调试
xgdb bin/xmos_demo.xe
# 在 xgdb 中连接到目标
(gdb) connect
(gdb) run

运行结果

Hello World from thread 7!
Hello World from thread 1!
Hello World from thread 2!
Hello World from thread 3!
Hello World from thread 4!
Hello World from thread 5!
Hello World from thread 6!
Hello World from thread 0!

我是老寇,我们下次再见啦!