查看: 3969|回复: 2

[原创] 【LPC54114双核任务一】之一:双核的启动

[复制链接]
  • TA的每日心情
    开心
    2017-7-10 09:04
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    7

    主题

    69

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    342
    最后登录
    2020-7-29
    发表于 2017-6-23 18:09:17 | 显示全部楼层 |阅读模式
    本帖最后由 baicaiaichibaicai 于 2017-6-23 18:13 编辑

    板子还没到,但是离本周交卷的时间不多了,那就趁板子还没来,先来熟悉一下双核的启动,参考的是SDK_2.2.1_LPC54114J256\boards\lpcxpresso54114\multicore_examples\hello_world例程。
    系统复位后,执行的时片内ROM的代码,片内ROM功能有两个,一个是ISP,另外一个就是启动应用程序。
    ROM根据管脚判断是否进入ISP模式,如果不是进入ISP模式就根据镜像的头部信息来启动旧镜像/单镜像/双镜像,详见《UM10914.pdf》的Chapter 6: LPC5411x Boot process,我就挑最简单的流程,复位后没有进入ISP,直接进入旧镜像的启动。
    ROM执行完后,应该是M0+内核和M4内核同时运行(此处为猜测,未找到官方描述,有知道的同学还望指教一下)。
    看一下两者的入口代码Reset_Handler,两者的入口代码一样,见startup_LPC54114_cm4.s或者startup_LPC54114_cm0plus.s
    1.                 AREA    |.text|, CODE, READONLY

    2. cpu_id          EQU     0xE000ED00
    3. cpu_ctrl        EQU     0x40000800
    4. coproc_boot     EQU     0x40000804
    5. coproc_stack    EQU     0x40000808

    6. rel_vals
    7.                 DCD     cpu_id, cpu_ctrl, coproc_boot, coproc_stack
    8.                 DCW     0xFFF, 0xC24

    9. ; Reset Handler - shared for both cores
    10. Reset_Handler   PROC
    11.                 EXPORT  Reset_Handler               [WEAK]
    12.                 IMPORT  SystemInit
    13.                 IMPORT  __main

    14.                 IF      :LNOT::DEF:SLAVEBOOT
    15.                 ; Both the M0+ and M4 core come via this shared startup code,
    16.                 ; but the M0+ and M4 core have different vector tables.
    17.                 ; Determine if the core executing this code is the master or
    18.                 ; the slave and handle each core state individually.
    19. shared_boot_entry
    20.                 LDR     r6, =rel_vals
    21.                 MOVS    r4, #0                          ; Flag for slave core (0)
    22.                 MOVS    r5, #1

    23.                 ; Determine which core (M0+ or M4) this code is running on
    24.                 ; r2 = (((*cpu_id) >> 4) & 0xFFF); (M4 core == 0xC24)
    25. get_current_core_id
    26.                 LDR     r0, [r6, #0]
    27.                 LDR     r1, [r0]                        ; r1 = CPU ID status
    28.                 LSRS    r1, r1, #4                      ; Right justify 12 CPU ID bits
    29.                 LDRH    r2, [r6, #16]                   ; Mask for CPU ID bits
    30.                 ANDS    r2, r1, r2                      ; r2 = ARM COrtex CPU ID
    31.                 LDRH    r3, [r6, #18]                   ; Mask for CPU ID bits
    32.                 CMP     r3, r2                          ; Core ID matches M4 identifier
    33.                 BNE     get_master_status
    34.                 MOV     r4, r5                          ; Set flag for master core (1)

    35.                 ; Determine if M4 core is the master or slave
    36.                 ; r3 = ((*cpu_ctrl) & 1); (0 == m0+, 1 == M4)
    37. get_master_status
    38.                 LDR     r0, [r6, #4]
    39.                 LDR     r3, [r0]                        ; r3 = SYSCON co-processor CPU control status
    40.                 ANDS    r3, r3, r5                      ; r3 = (Bit 0: 1 = M4 is master, 0 = M4 is slave)

    41.                 ; Select boot based on selected master core and core ID
    42. select_boot
    43.                 EORS    r3, r3, r4                      ; r4 = (Bit 0: 0 = master, 1 = slave)
    44.                 BNE     slave_boot
    45.                 B       normal_boot

    46.                 ; Slave boot
    47. slave_boot
    48.                 LDR     r0, [r6, #8]
    49.                 LDR     r2, [r0]                        ; r1 = SYSCON co-processor boot address
    50.                 CMP     r2, #0                          ; Slave boot address = 0 (not set up)?
    51.                 BEQ     cpu_sleep
    52.                 LDR     r0, [r6, #12]
    53.                 LDR     r1, [r0]                        ; r5 = SYSCON co-processor stack address
    54.                 MOV     sp, r1                          ; Update slave CPU stack pointer
    55.                 ; Be sure to update VTOR for the slave MCU to point to the
    56.                 ; slave vector table in boot memory
    57.                 BX      r2                              ; Jump to slave boot address

    58.                 ; Slave isn't yet setup for system boot from the master
    59.                 ; so sleep until the master sets it up and then reboots it
    60. cpu_sleep
    61.                 MOV     sp, r5                          ; Will force exception if something happens
    62. cpu_sleep_wfi
    63.                 WFI                                     ; Sleep forever until master reboots
    64.                 B       cpu_sleep_wfi
    65.                 ENDIF

    66.                 ; Normal boot for master/slave
    67. normal_boot
    68.                 LDR     r0, =SystemInit
    69.                 BLX     r0
    70.                 LDR     r0, =__main
    71.                 BX      r0
    72.                 ENDP
    复制代码
    注释都比较清楚,大致的流程是:
    1. 先从寄存器地址0xE000ED00获取到CPU的ID,(本寄存器我在数据手册上面也没找到,有知道的同学还望再指教一下)。
    2. 在get_master_status中判断出执行这段代码是M0+核还是M4核。
    3. 在select_boot中判断,如果是M0+的核则跳转到slave_boot,如果是M4核则跳转到normal_boot
    4. 在normal_boot中调用SystemInit函数,接着调用MDK的内部函数__main最终在该函数中进入main函数
    5. 在slave_boot中判断SYSCON->BPBOOT是否为0,如果为0则跳转到cpu_sleep函数,否则跳转到以SYSCON->BPBOOT位地址的入口中执行。此时SYSCON->BPBOOT值应为0
    也就是说,M4内核程序正常执行,M0+内核进入休眠。
    M0+内核的启动是由M4内核触发的,编译M4内核的镜像时,要把M0+内核的镜像文件当作一个数据数组编译进来,在M4启动之后,通过设置SYSCON->BPBOOT和SYSCON->CPSTACK寄存器,最后在操作SYSCON->CPCTRL中的M0RST和M0EN位来启动M0+内核。
    大致的流程就是如此,欢迎同学指教。
    啥,你问我两个内核的中断向量表怎么处理。
    哦哦,在startup_LPC54114_cm4.c或者startup_LPC54114_cm0plus.c文件中的SystemInit函数有对中断向量表进行重定向
    SCB->VTOR = (uint32_t)&__Vectors;
    这样子即可保证两个内核触发中断时响应的地址无误。


    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-9-9 22:51
  • 签到天数: 415 天

    连续签到: 1 天

    [LV.9]以坛为家II

    79

    主题

    3088

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    5181
    最后登录
    2022-5-23
    发表于 2017-6-24 13:09:09 | 显示全部楼层
      赞一个
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-4-1 22:48
  • 签到天数: 302 天

    连续签到: 1 天

    [LV.8]以坛为家I

    87

    主题

    7322

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    4631
    最后登录
    2021-1-25
    发表于 2017-11-29 13:55:33 | 显示全部楼层
    看过了                       
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-31 06:49 , Processed in 0.082393 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表