Sylixos zynq bsp 启动流程分析

本文详细分析了startup.s文件中的启动流程,包括从reset函数开始,设置工作模式为SVC并关闭所有中断,初始化堆栈,关闭和无效化缓存,清理BSS段,初始化数据段,调用targetInit函数,以及进入内核初始化的过程。这个过程是嵌入式系统启动的关键步骤。
摘要由CSDN通过智能技术生成

1,分析startup.s 启动流程

pc 指针指向异常向量表的首地址及 reset 函数

FUNC_DEF(vector)
    B       reset
    LDR     PC, undefineEntry
    LDR     PC, swiEntry
    LDR     PC, prefetchEntry
    LDR     PC, abortEntry
    LDR     PC, reserveEntry
    LDR     PC, irqEntry
    LDR     PC, fiqEntry
    FUNC_END()

reset 函数分析

1)第一步 设置工作模式为 SVC模式并关闭所有中断;

2)第二步 初始化堆栈,其中分SMP和AMP模式;

3)第三步 关闭 D-Cache(回写并无效),关闭 I-Cache(无效),无效并关闭分支预测,关闭 MMU(无效 TLB);

4)第四步 初始化data段;

5)第五步 清零bss段;

6)第六步 调用 targetInit 函数 初始化时钟,一般情况下时钟基本上在uboot 时已经初始化了,所以基本上为空函数;

7)进入内核初始化函数,开始进行内核资源初始化;

;/*********************************************************************************************************
;  初始化各处理器模式的堆栈指针
;*********************************************************************************************************/

FUNC_DEF(armInitSP)

    MSR     CPSR_c, #(SVC32_MODE | DIS_INT)
    MOV     SP, R0
    SUB     R0, R0, #SVC_STACK_SIZE

    MSR     CPSR_c, #(SYS32_MODE | DIS_INT)
    MOV     SP, R0
    SUB     R0, R0, #SYS_STACK_SIZE

    MSR     CPSR_c, #(FIQ32_MODE | DIS_INT)
    MOV     SP, R0
    SUB     R0, R0, #FIQ_STACK_SIZE

    MSR     CPSR_c, #(IRQ32_MODE | DIS_INT)
    MOV     SP, R0
    SUB     R0, R0, #IRQ_STACK_SIZE

    MSR     CPSR_c, #(UND32_MODE | DIS_INT)
    MOV     SP, R0
    SUB     R0, R0, #UND_STACK_SIZE

    MSR     CPSR_c, #(ABT32_MODE | DIS_INT)
    MOV     SP, R0
    SUB     R0, R0, #ABT_STACK_SIZE

    MSR     CPSR_c, #(SVC32_MODE | DIS_INT)

    BX      LR

    FUNC_END()
FUNC_DEF(reset)

;/*********************************************************************************************************
;  进入 SVC32 模式(关中断)
;*********************************************************************************************************/

    MSR     CPSR_c, #(SVC32_MODE | DIS_INT)

;/*********************************************************************************************************
;  初始化堆栈
;*********************************************************************************************************/
#if LW_CFG_SMP_EN > 0
    BL      archMpCur

    LDR     R1 , =__stack_end                                          ;/*  栈区顶端地址                 */
LINE_LABEL(0)
    CMP     R0, #0
    SUBNE   R1, R1, #CPU_STACKS_SIZE
    SUBNE   R0, R0, #1
    BNE     0b
#else
    LDR     R1 , =__stack_end                                          ;/*  栈区顶端地址                 */
#endif
    MOV     R0, R1
    BL      armInitSP

;/*********************************************************************************************************
;  如果不是 Primary CPU, 则跳转到 secondaryCpuResetEntry
;*********************************************************************************************************/
#if LW_CFG_SMP_EN > 0
    BL      archMpCur
    CMP     R0, #0
    BLNE    secondaryCpuResetEntry
#endif

;/*********************************************************************************************************
;  关闭 D-Cache(回写并无效)
;  关闭 I-Cache(无效)
;  无效并关闭分支预测
;  关闭 MMU(无效 TLB)
;*********************************************************************************************************/

    BL      armDCacheV7ClearAll
    BL      armDCacheV7Disable
    BL      armICacheInvalidateAll
    BL      armICacheDisable

    BL      armBranchPredictorInvalidate
    BL      armBranchPredictionDisable

    BL      armMmuInvalidateTLB
    BL      armMmuDisable

;/*********************************************************************************************************
;  初始化 DATA 段
;*********************************************************************************************************/

    LDR     R1, =_etext                         ;/*  -> ROM data end                                     */
    LDR     R2, =_data                          ;/*  -> data start                                       */
    LDR     R3, =_edata                         ;/*  -> end of data                                      */
LINE_LABEL(1)
    CMP     R2, R3                              ;/*  check if data to move                               */
    LDRLO   R0, [R1], #4                        ;/*  copy it                                             */
    STRLO   R0, [R2], #4
    BLO     1b                                  ;/*  loop until done                                     */

;/*********************************************************************************************************
;  清 0 BSS 段
;*********************************************************************************************************/

    MOV     R0, #0                              ;/*  get a zero                                          */
    LDR     R1, =__bss_start                    ;/*  -> bss start                                        */
    LDR     R2, =__bss_end                      ;/*  -> bss end                                          */
LINE_LABEL(2)
    CMP     R1, R2                              ;/*  check if data to clear                              */
    STRLO   R0, [R1], #4                        ;/*  clear 4 bytes                                       */
    BLO     2b                                  ;/*  loop until done                                     */

    DSB

;/*********************************************************************************************************
;  调用 targetInit 函数
;*********************************************************************************************************/

    LDR     R10, =targetInit
    MOV     LR, PC
    BX      R10

;/*********************************************************************************************************
;  进入 halPrimaryCpuMain 函数 (argc = 0, argv = NULL, frame pointer = NULL)
;*********************************************************************************************************/

    MOV     R0, #0
    MOV     R1, #0
    MOV     R2, #0
    MOV     FP, #0

    LDR     R10, =halPrimaryCpuMain 
    MOV     LR, PC  
    BX      R10

    B       .

    FUNC_END()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VxWorks是一种实时操作系统,可用于嵌入式系统开发。它被广泛应用于航空航天、工业自动化、网络设备、汽车电子和医疗设备等领域。Zynq是一种由Xilinx推出的SoC(系统级芯片),它集成了运行处理器和可编程逻辑的功能。 BSP(板级支持包)是一种软件包,提供了针对特定硬件平台的驱动程序和操作系统接口。VxWorks针对Zynq SoC提供了相应的BSP,以便开发人员可以轻松地将VxWorks操作系统部署到Zynq SoC上。 VxWorks Zynq BSP是一个特定于Zynq SoC的软件包,包含了针对该硬件平台的驱动程序和操作系统接口。通过使用VxWorks Zynq BSP,开发人员可以更方便地进行嵌入式系统开发。BSP包含了设备驱动程序,例如网络、串口、存储等,使得开发人员可以直接使用这些驱动程序来访问硬件设备。此外,BSP还提供了与操作系统的接口,使得开发人员可以在操作系统上运行应用程序。 VxWorks Zynq BSP充分发挥了Zynq SoC的性能优势,通过紧密集成硬件和软件来提供高性能和可靠性。开发人员可以利用BSP来快速构建嵌入式系统,实时运行各种任务,并充分利用Zynq SoC的处理能力和可编程逻辑资源。 总之,VxWorks Zynq BSP是一种为Zynq SoC定制的软件包,为开发人员提供了快速开发嵌入式系统的工具和接口。它充分发挥了Zynq SoC的性能和功能,使得开发人员可以更容易地利用VxWorks操作系统来构建高性能和可靠性的嵌入式系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值