[嵌入式系统-38]:龙芯1B 开发学习套件 -8-启动过程详解

目录

一、启动程序的入口

二、初始化硬件浮点单元fpu

三、全局指针

四、设置系统栈

五、设置内存

六、设置Cache

七、配置协处理器

八、初始化TLB


一、启动程序的入口

  1. FRAME(_start, sp, 0, ra):这一行是一个汇编宏,用于创建一个函数框架_start 函数的入口地址sp 是栈指针,0 表示没有保存寄存器的空间,ra 是返回地址寄存器。

  2. .set noreorder:这个指令告诉汇编器不要重新排序指令。

  3. #if (__mips_hard_float):这是一个条件编译指令,检查是否启用了硬件浮点运算

  4. li v0, SR_CU1:将 SR_CU1 的值加载到寄存器 v0 中。

  5. mtc0 v0, C0_SR:将寄存器 v0 的值写入 CP0 寄存器 C0_SR 中。

  6. #else

  7. mtc0    zero, C0_SR                     /* clr IntMsks/ kernel/disabled mode */    

  8. #endif

  9. nop:空操作指令。

  10. li v0, CAUSE_DC:将 CAUSE_DC 的值加载到寄存器 v0 中。

  11. mtc0 v0, C0_CAUSE:将寄存器 v0 的值写入 CP0 寄存器 C0_CAUSE 中。

  12. nop:空操作指令。

  13. lui v0, 0xFFFF:将 0xFFFF 的高 16 位加载到寄存器 v0 中。

  14. mtc0 v0, C0_COMPARE:将寄存器 v0 的值写入 CP0 寄存器 C0_COMPARE 中。

  15. nop:空操作指令。

这段代码主要是针对 MIPS 架构的初始化设置。根据是否启用了硬件浮点运算,设置相应的寄存器值,清除软件中断和定时器中断

二、初始化硬件浮点单元fpu

  1. #if (__mips_hard_float):这是一个条件编译指令,检查是否启用了硬件浮点运算。

  2. li t3, 0xAAAA5555:将常数 0xAAAA5555 加载到寄存器 t3 中。

  3. mtc1 t3, fp0:将寄存器 t3 的值写入浮点寄存器 fp0 中。

  4. mtc1 zero, fp1:将寄存器 zero 的值(0)写入浮点寄存器 fp1 中。

  5. mfc1 t0, fp0:将浮点寄存器 fp0 的值读取到通用寄存器 t0 中。

  6. mfc1 t1, fp1:将浮点寄存器 fp1 的值读取到通用寄存器 t1 中。

  7. nop:空操作指令。

  8. bne t0, t3, 1f:如果寄存器 t0 的值不等于 t3,则跳转到标签 1f 处执行。

  9. nop:空操作指令。

  10. bne t1, zero, 1f:如果寄存器 t1 的值不等于 0,则跳转到标签 1f 处执行。

  11. nop:空操作指令。

  12. ctc1 zero, fcr31:将寄存器 zero 的值写入浮点控制寄存器 fcr31 中,即清除浮点控制状态寄存器。

  13. j 2f:无条件跳转到标签 2f 处执行。

  14. nop:空操作指令。

  15. li v0, 0x0:将常数 0x0 加载到寄存器 v0 中。

  16. mtc0 v0, C0_SR:将寄存器 v0 的值写入 CP0 寄存器 C0_SR 中,即重置状态寄存器。

  17. nop:空操作指令。

  18. 2::标签 2,用于跳转。

  19. #endif:结束条件编译指令块。

这段代码主要用于检查是否存在浮点处理器(FPU),如果存在,则清除浮点控制状态寄存器,并重置状态寄存器。

三、全局指针

  1. la gp, _gp:将全局指针 _gp 的地址加载到全局指针寄存器 gp 中,用于初始化全局指针寄存器。

  2. la v0, _fbss:将未初始化数据段(bss段)的起始地址 _fbss 加载到通用寄存器 v0 中。

  3. la v1, _end:将未初始化数据段的结束地址 _end 加载到通用寄存器 v1 中。

  4. 3::标签 3,用于循环中的跳转。

  5. sw zero, 0(v0):将寄存器 zero 的值(0)存储到地址为 v0 的内存位置,即清零未初始化数据段中的一个字。

  6. bltu v0, v1, 3b:如果 v0 的值小于 v1 的值,则跳转到标签 3 处执行。这是一个无符号数比较分支指令,用于在清零未初始化数据段的过程中循环处理直到结束。

  7. add v0, 4:将寄存器 v0 的值加上4,即增加一个字的大小,用于指向下一个未初始化数据段的地址。

这段代码的主要作用是初始化全局指针寄存器,并清零未初始化数据段(bss段)的内容,确保其在使用之前被正确初始化。

四、设置系统栈

  1. la t0, _stack_end: 将系统栈的结束地址 _stack_end 加载到临时寄存器 t0 中。

  2. sub t0, t0, (4 * 4): 从系统栈的结束地址减去4个字(即16个字节)。这可能是为了留出一些空间用于栈帧或其他用途。“XXX overhead” 注释可能表示这个操作有一定的额外开销。

  3. move sp, t0: 将临时寄存器 t0 中的值移动到栈指针寄存器 sp 中,从而设置系统栈。

  4. la a0, _RamSize: 将 RAM 的大小 _RamSize 加载到寄存器 a0 中。

五、设置内存

  1. jal set_memory_size: 调用函数 set_memory_size,这可能是设置内存大小的函数。

  2. nop: 空操作指令,用于填充延时槽或优化。

六、设置Cache

  1. jal config_cache: 调用函数 config_cache,用于确定 D & I caches 的大小。

  2. nop: 空操作指令。

  3. la a0, memory_cfg_struct: 将内存配置结构体 memory_cfg_struct 的地址加载到寄存器 a0 中。

  4. jal get_memory_conf: 调用函数 get_memory_conf,可能用于填充内存配置结构体。

  5. nop: 空操作指令。

  6. jal flush_cache: 调用函数 flush_cache,用于初始化缓存。

  7. nop: 空操作指令。

七、配置协处理器

  1. mfc0 v0, C0_CONFIG, 0: 从协处理器0的配置寄存器中(特权级0)读取数据,将其存储到通用寄存器 v0 中。

  2. and v0, v0, ~CFG0_K0: 将 v0 的值与 CFG0_K0 的按位取反值进行按位与操作,可能是为了清除特定位的设置。

  3. or v0, v0, CFG_C_CACHABLE: 将 CFG_C_CACHABLE 的值与 v0 进行按位或操作,可能是为了设置缓存为可缓存的模式。

  4. mtc0 v0, C0_CONFIG, 0: 将寄存器 v0 的值写入到协处理器0的配置寄存器中(特权级0)。

  5. nop: 空操作指令。

这段代码的主要作用是设置系统栈、内存大小、缓存配置等,并进行一些与内存和缓存相关的初始化操作。

八、初始化TLB

/* Clear Translation Lookaside Buffer (TLB)
 */
    jal     init_tlb                        /* clear the tlb */
    nop

/* End of CPU initialization, ready to start kernel
 */
    move    a0, zero                        /* Set argc passed to main */
    jal     bsp_start                        //C语言启动代码,不返回,
    nop

/* Kernel has been shutdown, jump to the "exit" routine
 */
    jal     _sys_exit
    move    a0, v0                          # pass through the exit code

1:
    beq     zero, zero, 1b
    nop

    .set    reorder
ENDFRAME(_start)

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

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

相关文章

递归搜索回溯相关的题目解析和练习2

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;下面的题目用的方法和前面几篇的方法是一样的&#xff0c;写起来是比较困难的&#xff0c;加油 字母大小写全排列 https://leetcode.cn/problems/letter-case-permutation/ 解析 代码 class Solution {vector<string&g…

【Docker】容器的概念

容器技术&#xff1a;容器技术是基于虚拟化技术的&#xff0c;它使应用程序从一个计算机环境快速可靠地转移到另一个计算机环境中&#xff0c;可以说是一个新型地虚拟化技术。 一、docker容器 Docker:是一个开源地容器引擎Docker 是一种轻量级的容器化技术&#xff0c;其主要原…

测试Tomcat是否安装成功

bin目录下有一个文件&#xff1a;startup.batxxx.bat文件是windows操作系统专用的&#xff0c;bat文件是批处理文件&#xff0c;这种文件可以编写大量的Windows的dos命令&#xff0c;然后执行bat文件就相当于批量的执行dos命令start.sh这个文件在Windows当中无法执行&#xff0…

分割模型TransNetR的pytorch代码学习笔记

这个模型在U-net的基础上融合了Transformer模块和残差网络的原理。 论文地址&#xff1a;https://arxiv.org/pdf/2303.07428.pdf 具体的网络结构如下&#xff1a; 网络的原理还是比较简单的&#xff0c; 编码分支用的是预训练的resnet模块&#xff0c;解码分支则重新设计了。…

PyTorch搭建LeNet训练集详细实现

一、下载训练集 导包 import torch import torchvision import torch.nn as nn from model import LeNet import torch.optim as optim import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npToTensor()函数&#xff1a; 把图像…

git学习(创建项目提交代码)

操作步骤如下 git init //初始化git remote add origin https://gitee.com/aydvvs.git //建立连接git remote -v //查看git add . //添加到暂存区git push 返送到暂存区git status // 查看提交代码git commit -m初次提交git push -u origin "master"//提交远程分支 …

微信小程序(五十二)开屏页面效果

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.使用控件模拟开屏界面 2.倒计时逻辑 3.布局方法 4.TabBar隐藏复现 源码&#xff1a; components/openPage/openPage.wxml <view class"openPage-box"><image src"{{imagePath}}"…

20个Python中列表(list)最常用的方法和函数。

本篇文章中,我们分别介绍10个Python中列表(list)最常用的方法和函数。 列表方法示例 1. 创建空列表和使用 append() 方法 # 创建一个空列表 my_list = []# 使用 append() 方法在列表末尾添加元素 my_list.append(5) my_list.append(10) print("After append:",…

离线数仓建设

一.数据仓库分层 ODS(Operation Data Store)层&#xff1a;原始数据层&#xff0c;存放加载原始日志、数据&#xff0c;数据保持原貌不做处理。 DWD(Data warehouse detail)层&#xff1a;对ODS层数据进行清洗&#xff08;去除空值&#xff0c;超过极限范围的数据&#xff09;、…

三维不同坐标系下点位姿态旋转平移变换

文章目录 前言正文计算方法思路Python实现总结前言 本文主要说明以下几种场景3D变换的应用: 3D相机坐标系下长方体物体,有本身坐标系,沿该物体长边方向移动一段距离,并绕长边轴正旋转方向转90度,求解当前物体中心点在相机坐标系下的位置和姿态多关节机器人末端沿工具坐标…

介绍Android UI绘制过程以及注意事项

Android UI绘制是一个复杂的过程&#xff0c;它涉及到多个步骤&#xff0c;从测量&#xff08;measure&#xff09;到布局&#xff08;layout&#xff09;再到绘制&#xff08;draw&#xff09;。以下是这个过程的简要介绍以及一些注意事项&#xff1a; 1. **测量&#xff08;…

计算机网络-网络应用服务器(四)

1.Samba服务器&#xff1a; Samba是Linux上实现和Windows系统局域网上共享文件和打印机的一种通信协议&#xff0c;由服务器及客户端程序构成。支持SMB/CIFS协议&#xff0c;实现共享资源。最主要的一个配置文件smb.conf&#xff0c;可以使用vi编辑器修改。守护进程&#xff1a…

STM32 利用FlashDB库实现在线扇区数据管理不丢失

STM32 利用FlashDB库实现在线扇区数据管理不丢失 &#x1f4cd;FalshDB地址:https://gitee.com/Armink/FlashDB ✨STM32没有片内EEPROM这样的存储区&#xff0c;虽然有备份寄存器&#xff0c;仅可以实现对少量数据的频繁存储&#xff0c;但是依赖备份电源&#xff08;BAT引脚&a…

美国签证|附面签相关事项√

小伙伴最近都忙着办签证吧&#xff01;但是需要注意的是&#xff0c;美国的签证跟其他任何国家的签证不同&#xff0c;并不是办理了就一定拿得到&#xff0c;据说概率是50%左右。所以办理美国签证&#xff0c;不要太着急啦&#xff01;先来了解一下美国签证的相片该怎么拍叭 ✅…

题目 2073: [STL训练]亲和串

题目描述: 人随着岁数的增长是越大越聪明还是越大越笨&#xff0c;这是一个值得全世界科学家思考的问题,同样的问题Eddy也一直在思考&#xff0c;因为他在很小的时候就知道亲和串如何判断了&#xff0c;但是发现&#xff0c;现在长大了却不知道怎么去判断亲和串了&#xff0c;…

RocketMQ的事务消息流程

什么是事务消息&#xff1f; 事务消息是一种在发送方和接收方之间保证消息传递的一致性和可靠性的消息传递机制。在消息发送过程中&#xff0c;生产者可以将消息发送到消息队列&#xff0c;但不会立即被消费者接收和处理。相反&#xff0c;消息会先进入一种“准备”状态&#x…

用chatgpt写insar地质灾害的论文,重复率只有1.8%,chatgpt4.0写论文不是梦

突发奇想&#xff0c;想用chatgpt写一篇论文&#xff0c;并看看查重率&#xff0c;结果很惊艳&#xff0c;说明是确实可行的&#xff0c;请看下图。 下面是完整的文字内容。 InSAR (Interferometric Synthetic Aperture Radar) 地质灾害监测技术是一种基于合成孔径雷达…

【JavaScript】JavaScript 变量 ① ( JavaScript 变量概念 | 变量声明 | 变量类型 | 变量初始化 | ES6 简介 )

文章目录 一、JavaScript 变量1、变量概念2、变量声明3、ES6 简介4、变量类型5、变量初始化 二、JavaScript 变量示例1、代码示例2、展示效果 一、JavaScript 变量 1、变量概念 JavaScript 变量 是用于 存储数据 的 容器 , 通过 变量名称 , 可以 获取 / 修改 变量 中的数据 ; …

第十五届蓝桥杯模拟赛(第三期)

大家好&#xff0c;我是晴天学长&#xff0c;本次分享&#xff0c;制作不易&#xff0c;本次题解只用于学习用途&#xff0c;如果有考试需要的小伙伴请考完试再来看题解进行学习&#xff0c;需要的小伙伴可以点赞关注评论一波哦&#xff01;蓝桥杯省赛就要开始了&#xff0c;祝…

【DimPlot】【FeaturePlot】使用小tips

目录 DimPlot函数参数解析 栅格化点图 放大 ggplot2 图例的点&#xff0c;修改图例的标题 FeaturePlot函数参数解析 调整FeaturePlot颜色 分组绘制featureplot 随手笔记&#xff0c;持续更新中。。。 Reference DimPlot函数参数解析 object: 一个Seurat对象&#xff0c;…