C 在特定的核心/线程上运行代码?

C 在特定的核心/线程上运行代码?,c,embedded,powerpc,C,Embedded,Powerpc,我正在多核系统上编写一些裸机嵌入式软件。我正在初始化核心0线程0作为主核心,并尝试在其他核心/线程上执行代码。我的问题是,如果没有Linux之类的操作系统来设置亲和性,我将如何在特定的核心/线程上执行代码?是否有一种通用的方法知道如何做到这一点,还是特定于处理器?处理器是NXP T2080,具有4个内核,每个内核具有2个线程 因为您在这里没有使用任何操作系统,所以管理所有执行(包括其他线程上的执行)完全取决于您的代码。您的管理方式主要取决于您自己的代码,但其中涉及一些硬件交互: 在SystemI

我正在多核系统上编写一些裸机嵌入式软件。我正在初始化核心0线程0作为主核心,并尝试在其他核心/线程上执行代码。我的问题是,如果没有Linux之类的操作系统来设置亲和性,我将如何在特定的核心/线程上执行代码?是否有一种通用的方法知道如何做到这一点,还是特定于处理器?处理器是NXP T2080,具有4个内核,每个内核具有2个线程

因为您在这里没有使用任何操作系统,所以管理所有执行(包括其他线程上的执行)完全取决于您的代码。您的管理方式主要取决于您自己的代码,但其中涉及一些硬件交互:

  • 在SystemInit上,您需要选择一个主线程。听起来你已经这么做了,但你没有说明怎么做

    在ppc机器上,每个线程都有其处理器标识寄存器(PIR)的唯一值。如果您知道PIR的值,那么您可以检查PIR,看看哪个是主要的。如果您不知道PIR值,那么可以使用atmoic集合和测试来选择主线程:增加值的第一个线程变为主线程,其他线程变为辅助线程

  • 根据您实现(1)的方式,其他线程将需要执行其他操作。他们空闲吗?还是绕着圈旋转

    如果它们处于空闲状态,则需要将它们从空闲状态带出(之后,它们将输入重置向量)。一旦他们在重置向量中执行代码,您就需要确保他们不会执行与主代码相同的操作,因此有一些方法将他们发送到自己的辅助特定代码

    如果它们在循环中旋转,将由主循环将它们从循环中取出(比如,通过设置它们读取的标志)并执行有用的代码

    既然您提到您使用的是C语言,那么这些辅助程序可能需要自己的堆栈。您需要在
    r1
    中使用它们自己的堆栈指针,适当地初始化它们的每线程C运行时

  • “有用代码”的定义取决于您,而让这些程序员运行该代码的方式是您自己的设计

    一个简单的方法是有一个任务的中心列表,其中主要任务排队,每个次要任务从该列表中退出一个任务(当然有适当的锁定)并执行它

    因为您想要控制关联性,所以您的解决方案将稍微复杂一些(例如,每线程队列),但它不需要有实质性的不同


  • 如果您想举个例子,请看一下我们在skiboot(64位PowerMachines的固件)中是如何做到这一点的:。

    是的,它是处理器specific@SamiKuhmonen好吧,我想。有做类似事情的经验吗。我只是不知道从哪里开始。我能想到的最好的方法是将线程指令指针移动到我希望它执行的代码,但我不确定。不幸的是,我自己没有这样做,只在单核系统上工作了那么低的级别。但我认为这就是解决问题的方法。处理器应该有一个数据表来解释什么是needed@SamiKuhmonen好的,谢谢你的建议!您是否在没有底层硬件抽象层或操作系统的情况下进行此操作?感谢所有有用的信息。我将开始研究如何实现这一点的源代码!