首页 > 其他分享 >嵌入式start.S启动文件详细介绍

嵌入式start.S启动文件详细介绍

时间:2025-01-07 13:02:51浏览次数:3  
标签:__ 初始化 定义 la t0 嵌入式 start handler 详细

 先来看一个具体的嵌入式工程的start.S文件:

#include "hpm_csr_regs.h"

    .section .start, "ax"

    .global _start
    .type _start,@function

_start:
    /* Initialize global pointer */
    .option push
    .option norelax

    la gp, __global_pointer$
    la tp, __thread_pointer$
    .option pop

    /* reset mstatus to 0*/
    csrrw x0, mstatus, x0

#ifdef __riscv_flen
    /* Enable FPU */
    li t0, CSR_MSTATUS_FS_MASK
    csrrs t0, mstatus, t0

    /* Initialize FCSR */
    fscsr zero
#endif

    /* Enable LMM1 clock */
    la t0, 0xF4000800
    lw t1, 0(t0)
    ori t1, t1, 0x80
    sw t1, 0(t0)

#ifdef INIT_EXT_RAM_FOR_DATA
    la t0, _stack_safe
    mv sp, t0
    call _init_ext_ram
#endif

    /* Initialize stack pointer */
    la t0, _stack
    mv sp, t0

    /*
     * Initialize LMA/VMA sections.
     * Relocation for any sections that need to be copied from LMA to VMA.
     */
    call c_startup

#if defined(__SES_RISCV)
    /* Initialize the heap */
    la a0, __heap_start__
    la a1, __heap_end__
    sub a1, a1, a0
    la t1, __SEGGER_RTL_init_heap
    jalr t1
#endif

    /* Do global constructors */
    call __libc_init_array

#ifndef NO_CLEANUP_AT_START
    /* clean up */
    call _clean_up
#endif

#ifdef __nds_execit
    /* Initialize EXEC.IT table */
    la t0, _ITB_BASE_
    csrw uitb, t0
#endif

#if defined(CONFIG_FREERTOS) && CONFIG_FREERTOS
    #define HANDLER_TRAP freertos_risc_v_trap_handler

    /* Use mscratch to store isr level */
    csrw mscratch, 0
#elif defined(CONFIG_UCOS_III) && CONFIG_UCOS_III
    #define HANDLER_TRAP ucos_risc_v_trap_handler

    /* Use mscratch to store isr level */
    csrw mscratch, 0
#elif defined(CONFIG_THREADX) && CONFIG_THREADX
    #define HANDLER_TRAP tx_risc_v_trap_handler
    #define HANDLER_S_TRAP tx_risc_v_trap_handler

    /* Use mscratch to store isr level */
    csrw mscratch, 0
#else
    #define HANDLER_TRAP irq_handler_trap
#endif

#ifndef USE_NONVECTOR_MODE
    /* Initial machine trap-vector Base */
    la t0, __vector_table
    csrw mtvec, t0

    /* Enable vectored external PLIC interrupt */
    csrsi CSR_MMISC_CTL, 2
#else
    /* Initial machine trap-vector Base */
    la t0, HANDLER_TRAP
    csrw mtvec, t0

    /* Disable vectored external PLIC interrupt */
    csrci CSR_MMISC_CTL, 2
#endif

    /* System reset handler */
    call reset_handler

    /* Infinite loop, if returned accidentally */
1:    j 1b

    .weak exit
exit:
1:    j 1b

    .section .isr_vector, "ax"
    .weak nmi_handler
nmi_handler:
1:    j 1b

#include "../vectors.h"

这段代码是一个RISC-V架构下的裸机(bare-metal)启动代码示例,它使用了一些特定于RISC-V的指令和SEGGER Embedded Studio(SES)相关的宏定义。下面是对代码主要部分的详细解释:

  1. 全局入口点

    • _start 标签是程序的入口点。在RISC-V中,链接器通常期望找到这个标签作为程序的起始执行点。
  2. 全局和线程指针初始化

    • 使用 la(load address)指令将全局指针(gp)和线程指针(tp)分别初始化为 __global_pointer$__thread_pointer$ 的地址。这些符号通常在链接脚本中定义。
  3. 重置 mstatus 寄存器

    • 通过 csrrw(atomic read-set-write CSR)指令将 mstatus 寄存器重置为0。mstatus 寄存器包含了机器模式的状态信息。
  4. 启用浮点单元(如果可用)

    • 如果定义了 __riscv_flen,则启用浮点单元(FPU),并初始化浮点控制状态寄存器(FCSR)。
  5. 启用LMM1时钟

    • 通过一系列指令访问某个内存地址(0xF4000800),并修改该地址处的值以启用LMM1时钟。
  6. 初始化外部RAM(如果需要)

    • 如果定义了 INIT_EXT_RAM_FOR_DATA,则初始化外部RAM作为数据存储区域,并设置堆栈指针。
  7. 堆栈指针初始化

    • 将堆栈指针(sp)初始化为 _stack 标签对应的地址。
  8. 初始化LMA/VMA段

    • 调用 c_startup 函数来初始化程序的LMA(加载时内存地址)和VMA(虚拟内存地址)段,并进行必要的复制。
  9. 初始化堆(如果使用的是SEGGER RTL)

    • 如果定义了 __SES_RISCV,则初始化堆空间,并调用SEGGER的堆初始化函数。
  10. 执行全局构造函数

    • 调用 __libc_init_array 函数来执行C标准库的全局构造函数。
  11. 清理(如果定义了清理函数)

    • 如果定义了 NO_CLEANUP_AT_START 之外的宏,则调用 _clean_up 函数进行清理工作。
  12. 初始化EXEC.IT表(如果定义了相关宏)

    • 如果定义了 __nds_execit,则初始化EXEC.IT表,并设置 uitb 寄存器。
  13. 设置陷阱处理程序

    • 根据是否定义了FreeRTOS、uCOS-III或ThreadX,设置不同的陷阱处理程序。
  14. 设置陷阱向量基地址

    • 根据是否使用向量化模式,设置 mtvec 寄存器为陷阱向量表的基地址或陷阱处理程序的地址。
  15. 系统重置处理程序

    • 调用 reset_handler 函数作为系统重置时的处理程序。
  16. 无限循环

    • 如果程序意外返回,则进入一个无限循环,防止程序继续执行未定义的行为。
  17. 弱定义的退出和中断处理程序

    • 提供了 exitnmi_handler 的弱定义,这些函数在默认情况下执行无限循环。exit 函数可以被用户代码覆盖以实现特定的退出行为。
  18. 中断向量表

    • 包含了中断向量表的定义,并可能包含其他中断处理程序的弱定义。
  19. 包含外部向量定义

    • 通过 #include "../vectors.h" 包含外部定义的中断向量和其他相关定义。

 

标签:__,初始化,定义,la,t0,嵌入式,start,handler,详细
From: https://blog.csdn.net/m0_59091453/article/details/144982886

相关文章

  • 2025网络安全学习路线 非常详细 推荐学习
    关键词:网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线首先咱们聊聊,学习网络安全方向通常会有哪些问题1、打基础时间太长学基础花费很长时间,光语言都有几门,有些人会倒在学习linux系统及命令的路上,更多的人会倒在学习语言上;2、知识点掌握程度不清楚对于......
  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-11- 标签页(tab)操作 - 下篇 (详细教
    1.简介本来按照计划这一系列的文章应该介绍Context和Page两个内容的,但是宏哥看了官方文档和查找资料发现其实和宏哥在Python+Playwright系列文章中的大同小异,差不了多少,再在这一个系列介绍就有点画蛇添足,索性就不介绍和讲解了,有兴趣的自己可以看宏哥之前写的,或者自己查找资料和官......
  • Vue核心知识: Pinia 各种情况详细举例
    让我们一起走向未来......
  • 基于 docker 安装 nginx 详细教程
    1.创建普通用户用于管理docker在本教程中我们创建一个普通用户来进行后续的docker相关服务的配置与运维。当然本操作是非必须的,你可以直接使用root用户来直接操作,对整个流程没有影响。不想创建用户请直接跳过第一部分,从第二部分开始操作即可。创建普通用户 lidyuseraddl......
  • LPDDRX功能模块详细介绍
    LPDDRX(LowPowerDoubleDataRateX)是一种专为低功耗应用设计的内存技术,广泛应用于手持设备、电池供电设备和超便携设备中。LPDDRX功能模块详细介绍如下:ControlLogic(控制逻辑):负责接收和处理来自内存控制器的命令,并根据这些命令协调其他功能模块的操作。控制逻辑是LPD......
  • Uno Platform是一个基于C#开源、功能强大、灵活的跨平台开发框架,用于快速构建单一代码
    UnoPlatform是一个基于C#开源、功能强大、灵活的跨平台开发框架,用于快速构建单一代码库原生移动、Web、桌面和嵌入式应用程序思维导航前言项目介绍项目特点与优势主题样式风格项目源代码对应平台运行效果项目源码地址优秀项目和框架精选DotNetGuide技术社区前言......
  • DataGrip 2024.3.3 安装激活详细使用教程(激活至2026,实测是永久,亲测!)
    开发工具推荐:DataGrip安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程DataGrip补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版!DataGrip是JetBrains公司推出的一款功能强大的数据库语言集成开发环境(IDE),凭......
  • Redis可视化工具 Another Redis Desktop Manager工具使用详细教程(附下载链接)
    Redis可视化工具推荐:AnotherRedisDesktopManagerRedis是一种高性能的键值数据库,广泛应用于缓存和消息队列等场景。对于开发者来说,命令行工具固然强大,但操作繁琐。而一款高效易用的可视化工具可以极大地提升使用效率。本篇将为大家推荐一款开源、跨平台且功能强大的Redis可......
  • # 【鸿蒙开发】英语单词页的开发--实现详细代码高亮和单词发音
    【鸿蒙开发】英语单词页的开发–实现详细代码高亮和单词发音文章目录【鸿蒙开发】英语单词页的开发--实现详细代码高亮和单词发音前言效果展示一、提前学习几个小知识1.怎么拿到对象的属性名称的数组2.怎么读取本地rawfile文件-资源管理模块3.将二进制解码成字符串二......
  • 嵌入式linux环境搭建2-CentOS7
    参考链接https://draapho.github.io/2017/02/19/1706-linux-centos7/原文环境及结论大环境的搭建思路可参考嵌入式linux环境搭建-主机端gatewayip10.0.0.138PCwindows:win1064bit,ip10.0.0.98PClinux(最终版本):ubuntuserver16.0432bit,ip10.0.0.100Embedd......