0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

secondary cpu初始化状态设置

麦辣鸡腿堡 来源:TrustZone 作者:Hcoco 2023-12-05 15:27 次阅读

spin-table

spin-table启动流程的示意图如下:

图片

芯片上电后primary cpu开始执行启动流程,而secondary cpu则将自身设置为WFE睡眠状态,并且为内核准备了一块内存,用于填写secondary cpu的入口地址。

uboot负责将这块内存的地址写入devicetree中,当内核初始化完成,需要启动secondary cpu时,就将其内核入口地址写到那块内存中,然后唤醒cpu。

secondary cpu被唤醒后,检查该内存的内容,确认内核已经向其写入了启动地址,就跳转到该地址执行启动流程。

secondary cpu初始化状态设置

uboot启动时,secondary cpu会通过以下流程进入wfe状态(arch/arm/cpu/armv8/start.S):

#if defined(CONFIG_ARMV8_SPIN_TABLE) && !defined(CONFIG_SPL_BUILD)
	branch_if_master x0, x1, master_cpu1b	spin_table_secondary_jump2)
	…
master_cpu:                                                  (3bl	_main

(1)若当前cpu为primary cpu,则跳转到step 3,继续执行启动流程。其中cpu id是通过mpidr区分的,而启动流程中哪个cpu作为primary cpu可以任意指定。当指定完成后,此处就可以根据其身份确定相应的执行流程

(2)若当前cpu为slave cpu,则执行spin流程。它是由spin_table_secondary_jump函数实现的(arch/arm/cpu/armv8/start.S)。以下为其代码实现:

ENTRY(spin_table_secondary_jump)
.globl spin_table_reserve_begin
spin_table_reserve_begin:
0:	wfe                                           (1)
	ldr	x0, spin_table_cpu_release_addr       (2)
	cbz	x0, 0b                                (3)
	br	x0                                    (4)
.globl spin_table_cpu_release_addr                    (5)
	.align	3
spin_table_cpu_release_addr:
	.quad	0
.globl spin_table_reserve_end
spin_table_reserve_end:
ENDPROC(spin_table_secondary_jump)

(1)secondary cpu当前没有事情要做,因此执行wfe指令进入睡眠模式,以降低功耗

(2)spin_table_cpu_release_addr将由uboot传递给内核,根据step 5的定义可知,其长度为8个字节,在64位系统中正好可以保存一个指针。而它的内容在启动时会被初始化为0,当内核初始化完成后,在启动secondary cpu之前,会在uboot中将其入口地址写到该位置,并唤醒它

(3)当secondary cpu从wfe状态唤醒后,会校验内核是否在spin_table_cpu_release_addr处填写了它的启动入口。若未填写,则其会继续进入wfe状态

(4)若内核填入了启动地址,则其直接跳转到该地址开始执行内核初始化流程

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    447

    文章

    47788

    浏览量

    409131
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10442

    浏览量

    206564
  • SMP
    SMP
    +关注

    关注

    0

    文章

    68

    浏览量

    19450
收藏 人收藏

    评论

    相关推荐

    CW32L083 RTC初始化设置

    介绍CW32L083的RTC初始化设置
    的头像 发表于 06-24 10:16 973次阅读
    CW32L083 RTC<b class='flag-5'>初始化</b><b class='flag-5'>设置</b>

    反馈节点初始化的问题!

    本帖最后由 babyhappyqq 于 2015-10-9 15:06 编辑 使用状态机编写了一个串口测试软件,其中,一个输入控件连接到反馈节点的初始化端口,进行累加,之后与常数进行比较。比较
    发表于 10-09 15:01

    uPP初始化复位问题

    uPP初始化子程序里,为什么uPP复位的时候,UPCTL寄存器、UPICR寄存器等没有清零,寄存器里一直有初值存在,当改变初始化配置时,一直配置不成其他状态,例:当最开始是16位通道的状态
    发表于 05-18 19:18

    RCC初始化设置时钟来源

    这里写自定义目录标题RCC初始化设置时钟来源RCC图是STM32F103STM32F207的RCC结构体多了很多内容,RCC->AHB1ENR之类控制外设时钟。RCC->PLLCFGR
    发表于 08-10 06:23

    GPIO初始化设置

    1.GPIO 初始化设置:#define LED0_PIN GET_PIN(A, 8)#define LED1_PIN GET_PIN(D, 2) /* set LED0 pin mode
    发表于 08-24 07:23

    DTC的初始化设置

    一、DTC的初始化设置SREFx 设置基准电压INCH 选择ADC输入通道/*设置ADC,采集电压*/void InitADC(void){ /*
    发表于 11-29 07:10

    USART初始化结构体详解

    USART 初始化结构体详解标准库函数对每个外设都建立了一个初始化结构体,比如USART_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如USART
    发表于 02-22 06:08

    如何在Segger J-Flash中设置芯片初始化序列?

    设置初始化命令包括读写特定地址、校验、暂停CPU设置芯片复位方式等。支持的完整的指令列表请参考J-Flash用户手册中的介绍。下面简单介绍一些常用的
    发表于 01-05 13:54

    RDA1846S初始化设置

    RDA1846S初始化设置RDA1846S初始化设置RDA1846S初始化设置
    发表于 01-15 17:08 0次下载

    如何在Segger J-Flash中设置芯片初始化序列?

    许多微控制器在烧录之前需要一个自定义的初始化序列来初始化目标硬件,例如初始化PLL时钟,关闭看门狗或定义Flash的等待状态。在使用这些对初始化
    的头像 发表于 12-12 10:56 1538次阅读

    CPU CACHE策略的初始化

    build_mem_type_table()函数的功能是获取当前CPU的CACHE类型,据此初始化mem_type。
    的头像 发表于 06-05 15:03 884次阅读
    <b class='flag-5'>CPU</b> CACHE策略的<b class='flag-5'>初始化</b>

    如何在内核中启动secondary cpu

    启动secondary cpu 内核在启动secondary cpu之前当然需要为其准备好执行环境,因为内核中cpu最终都将由调度器管理,故
    的头像 发表于 12-05 15:46 262次阅读
    如何在内核中启动<b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>

    secondary cpu执行流程介绍

    : 由于其底层相关初始化流程与primary cpu类似,因此此处不再介绍。我们这里主要看一下它是如何通过secondary_start_kernel启动idle线程的: asmlinkage
    的头像 发表于 12-05 16:12 336次阅读
    <b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>执行流程介绍

    SMP多核secondary cpu启动流程

    ,详细分析可以参考上篇博文。其中以下流程执行secondary cpu启动相关的一些初始化工作: 在初始化完成且hotplug线程创建完成后,就可通过以下流程唤醒
    的头像 发表于 12-05 17:41 278次阅读
    SMP多核<b class='flag-5'>secondary</b> <b class='flag-5'>cpu</b>启动流程

    串口初始化一般是初始化哪些内容

    串口初始化是指在使用串口进行数据通信之前,对串口进行一系列的设置和配置,以确保串口能够正常工作。串口初始化的内容主要包括以下几个方面: 串口硬件设置:首先,需要确定要使用的串口是哪一个
    的头像 发表于 01-04 09:39 683次阅读