解读bl616的startup.S文件

news2024/9/20 18:54:55

startup.S是bl616的启动文件,以汇编格式存在。这就导致对需要看懂此文件的人要level高一些了,再加上汇编竟然是risc-v的,而不是arm的,导致本人还要恶补一下risc-v的汇编指令和risc-v的寄存器。

这里推荐一下比较的介绍risc-v架构的文章,可以加快读者对risc-v架构的理解:

  • riscv-v指令:RISC-V 通用寄存器和指令 | Doongz's Site
  • risc-v寄存器:RISC-V 扩展寄存器和指令 | Doongz's Site

这里可以看到和arm架构的寄存器以及指令都有所不同了吧,就连我的文案输出格式都不同了。本来打算指令一个篇章然后寄存器一个篇章,但是risc-v的架构本身就有两组寄存器和两组指令集。

先说一下常用的寄存器:

通用寄存器:

就是用来实现运算功能的,一共是32个32位寄存器,比arm敞亮多了,分别叫做是x0-x31。这一组寄存器中比较特殊的是x0,它只允许读,不支持写,且读出的数据永远是0.

  • Stack Pointer Register(SP)

    在RISC-V体系结构中,x2寄存器被用作栈指针(sp),并保存栈的基址。此外,栈基址必须对齐到4个字节。如果不这样做,可能会出现加载/存储对齐错误。

  • Global Pointer Register(GP)

    RISC-V使用x3 (gp)寄存器将所有全局变量放置在指定的特定区域。x3寄存器将保存全局变量所在位置的基址。

  • Thread Pointer Register(TP)

    在多线程应用程序中,每个线程可能有自己的私有变量集,称为“线程特定变量”。这组变量将由寄存器x4 (tp)指向。
    因此,每个线程在其x4寄存器中都有一个不同的值。

  • Return Address Register(RA)

    x1 (ra)寄存器用于保存子程序的返回地址。在执行子程序调用之前,x1设置为子程序的返回地址,通常为“pc + 4”。标准的软件调用约定使用x1 (ra)寄存器来保存函数调用的返回地址。

  • Argument Register(参数寄存器)

    在RISC-V中,8个参数寄存器,即x10x17(对应a0a7)用于在子程序中传递参数。
    在子程序调用之前,子程序的参数被复制到参数寄存器。在参数数量超过8的情况下使用栈。

  • Temporary Register(临时寄存器)

    临时寄存器用于在指令执行期间保存中间值。在RISC-V中有7个临时寄存器(t0t6)。

扩展寄存器

我喜欢称这组寄存器为控制状态寄存器。主要用来控制cpu的执行流程的。这组寄存器中比较出名的寄存器:

  • mstatus寄存器,用来控制cpu的中断使能标志位的

  • mcause 寄存器,用来记录cpu的中断类型和异常code

  • mtvec 寄存器,用来存储中断向量表的起始地址

厂商寄存器 

这一组不是risc-v架构定义的寄存器,但是risc-v架构提出了对这组寄存器定义标准,各个厂商按照这个标准来实现各自的厂商寄存器就好了,这组寄存器中比较重要的:

  • mtime寄存器,用来驱动系统tick的定时器,自上电来就以固定的频率产生中断
  • mtimecpm寄存器,和mtime一起完成系统的tick时间基准

.extern freertos_risc_v_trap_handler_before_schedule

_start:
    .section      .text.entry
    .align  2
    .globl  risc_e906_start
    .type   risc_e906_start, %function
risc_e906_start:
.option push
.option norelax
    la      gp, __global_pointer$
.option pop
    la      a0, freertos_risc_v_trap_handler_before_schedule
    ori     a0, a0, 3
    csrw    mtvec, a0                                                                                                                                                                                                                                     

    la      a0, __Vectors
    csrw    mtvt, a0

    .weak _sp_main
    la      sp, _sp_main
    csrw    mscratch, sp

    /* Load text section */
    la a0, _text_load
    la a1, _text_run
    la a2, _text_run_end
    bgeu a1, a2, 2f
1:
    lw t0, (a0)
    sw t0, (a1)
    addi a0, a0, 4
    addi a1, a1, 4
    bltu a1, a2, 1b
2:
    /* Load data section */
    la a0, _data_load
    la a1, _data_run
    la a2, _data_run_end
    bgeu a1, a2, 2f
1:
    lw t0, (a0)
    sw t0, (a1)
    addi a0, a0, 4
    addi a1, a1, 4
    bltu a1, a2, 1b
2:

    /* Clear bss section */
    la a0, __bss_start
    la a1, __bss_end
    bgeu a0, a1, 3f
1:
    sw zero, (a0)
    addi a0, a0, 4
    bltu a0, a1, 1b

    /* Clear bss section */
    la a0, __wifi_bss_start
    la a1, __wifi_bss_end
    bgeu a0, a1, 3f
1:
    sw zero, (a0)
    addi a0, a0, 4
    bltu a0, a1, 1b

3:

    la t0,  SystemInit
    jalr t0
    la t0,  board_init
    jalr t0

    la t0,  bfl_main
    jalr t0

    .size   risc_e906_start, . - risc_e906_start

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/959986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度云对象存储的图片转webp不展示图片的解决方案

前言 百度云对象存储的图片,加上图片处理的参数后(像这种转webp格式的请求https://xxxxxxxx.cn/xxxxxx.jpg?x-bce-processimage/format,f_webp),由于图片过大,导致请求超时了。提交了工单咨询后解决了,特…

python评分卡模型

信用风险计量模型可以包括跟个人信用评级,企业信用评级和国家信用评级。人信用评级有一系列评级模型组成,常见是A卡(申请评分卡)、B卡(行为模型)、C卡(催收模型)和F卡(反…

百度抓取香港服务器抓取超时是什么情况?

​ 网络延迟导致抓取超时 网络延迟是指从发送请求到接收响应之间的时间延迟。如果网络延迟过高,服务器可能无法及时响应请求,导致超时。在香港服务器上抓取数据时,如果网络延迟过高,可能会出现抓取超时的情况。 服务器负载过高可能…

【Tkinter界面:练习-01】窗口-部件-布局

一、说明 python在用户界面开发中,其中有QT5,和Tkinter;对于实际项目,界面需要高大上,因此用QT5,对于开发人员的演示程序,或简单程序中,不建议QT5;用Tkinter已经足够。本…

高并发(水平扩展,垂直扩展)

高并发(水平扩展,垂直扩展) 一、什么是高并发 高并发(High Concurrency) 是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指, 通过设计保证系统能够同时并行处理很多请求。 高并发相关常用的一些指标有 响…

Cenos7安装小火车程序动画

一:替换安装源 #先安装一下 epel源,因为安装包在epel源中。 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [rootwww ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo --2023-09-01 18:5…

Leetcode 44 通配符匹配

Leetcode44通配符匹配 题解1 枚举情况(数学思维)题解2 DP 给你一个输入字符串 (s) 和一个字符模式 ,请你实现一个支持 ‘?’ 和 ‘*’ 匹配规则的通配符匹配: ‘?’ 可以匹配任何单个字符‘*’ 可以匹配任意字符序列&#xff0…

成都瀚网科技有限公司:抖店的评论会消失吗?

抖店是抖音推出的电子商务平台。很多用户在购物后都会对产品进行评价。但有时用户可能会发现抖店评论缺失,让用户产生一些疑惑和困惑。本文将围绕这个问题提供一些答案和解决方案。 1.为什么抖店评论不见了? 首先需要明确的是,抖店评论消失可…

异步电机电压型磁链观测器改进-LPF串联HPF+基于时间向量分析的稳态补偿的改进策略

导读​:针对低通滤波环节替换电压模型纯积分环节加反馈补偿的改进方法,磁链估计仍然存在幅值和相位误差​的问题,本期文章介绍采用LPF串联HPF替换纯积分环节,然后基于时间向量分析的稳态补偿策略来对电压模型进行改进​。仿真结果…

复现XSS漏洞及分析

XSS漏洞概述: 类型一:反射型 类型二:存储型 类型三:DOM型 复现20字符短域名绕过 一、安装BEEF 1、在Kali中运行apt install beef-xss 2、运行beef 3、在浏览器访问 二、安装galleryCMS *遇到一点小问题 提示"last…

手写Mybatis:第5章-数据源的解析、创建和使用

文章目录 一、目标:数据源的解析、创建和使用二、设计:数据源的解析、创建和使用三、实现:数据源的解析、创建和使用3.1 引入依赖3.2 工程结构3.3 数据源解析、创建和使用关系图3.4 事务管理接口和事务工厂3.4.1 事务的隔离级别3.4.2 定义事务…

重新理解百度智能云:写在大模型开放后的24小时

在这些回答背后共同折射出的一个现实是——大模型不再是一个单选题,而更是一个综合题。在这个新的时代帆船上,产品、服务、安全、开放等全部都需要成为必需品,甚至是从企业的落地层面来看,这些更是刚需品。 作者| 皮爷 出品|产…

大数据课程K12——Spark的MLlib概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Spark的MLlib概念; ⚪ 掌握Spark的MLlib基本数据模型; ⚪ 掌握Spark的MLlib统计量基础; 一、Spark MLlib介绍 1. 概述 MLlib是Apache Spark的可迭代机器学习库。 2. 易于使用 …

改革企业治理结构,建立国有企业全面预算管理制度

随着我国市场经济的推广,国有企业进入到改革发展的必经之路上,企业应当结合自身实际情况加强成本管控,提高管理效率,为企业的发展提供有力保障。近年来,全面预算管理的理念在国有企业实施范围内不断扩大,加…

联发科MTK6762/MT6762核心板_安卓主板小尺寸低功耗4G智能模块

MT6762安卓核心板是一款基于MTK平台的高性能智能模块,是一款工业级的产品。该芯片也被称为Helio P22。这款芯片内置了Arm Cortex-A53 CPU,最高可运行于2.0GHz。同时,它还提供灵活的LPDDR3/LPDDR4x内存控制器,此外,Medi…

5年前我们摸爬滚打进入测试行业,如今的你后悔吗?

记得在求职的时候,面试官经常问我:“为什么要选择软件测试工作?”而我也会经常说一堆自己有的没的优势去应付。 工作这么久了,也不再浮躁,静下心来回忆当初选择软件测试工作的历程,也是对自己职业生涯的一次回顾。 一…

GreenPlum的gpfdist使用与原理流程分析

一、简介 GreenPlum 的数据导入功能作为对数据源的一种扩充,数据导入的方式有: 1、insert 该方式通过 sql 语句,把数据一条一条插入至表中。这种方式,不仅读取数据慢(一条一条读取),且数据需要…

我们学到的关于减少客户流失的 4 个经验教训

客户流失 – 这两个词会让任何企业主的脊背不寒而栗。用最简单的术语来说,它是在特定时间内停止使用您的服务的客户百分比。这很糟糕,但这并不全是厄运和阴霾。我们已经通过四个简单的步骤研究了如何减少客户流失,并与您分享这些秘密。请继续…

SP1545L肖特基二极管厂家

目前,市面上供应肖特基二极管的厂家、供应商特别地多,更多选择的背后,带来的却是更多的迷茫和不知所措。采购肖特基二极管,哪家好呢?提及“东沃电子DOWOSEMI”这个国产二极管品牌,很多客户可能第一想到他家…

部署Django报错-requires SQLite 3.8.3 or higher

记一次CentOS7部署Django项目时的报错 问题出现 在部署测试环境时,有需要用到一个python的后端服务,要部署到测试环境中去 心想这不是so easy吗,把本地调试时使用的python版本及Django版本在服务器上对应下载好,然后直接执行命…