MINI2440 QEMU 的 eCos 启动分析

2023-10-06 22:08
文章标签 分析 启动 ecos mini2440 qemu

本文主要是介绍MINI2440 QEMU 的 eCos 启动分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.总览一下eCos的启动方式

 

(原创文章,欢迎转载,请注明出处,谢谢。)


eCos目前默认的启动方式有三种,RAM,ROM,ROMRAM。

RAM启动的意思就是直接在RAM中运行,这种方式一般用于调试,不做必要的硬件初始化。

ROM启动方式的意思是在ROM中直接运行,当然一定要支持XIP的NORFLASH才可以。

ROMRAM的启动方式的意思是,ROM中开始运行然后把所有的代码复制到RAM中继续运行。

 

2.Mini2440 QEMU的启动方式的选择

 

MINI2440中目前还没有实现NOR和NAND Flash,(虽然NAND的代码加了,但是里面注名工作不是很正常,我姑且认为不能用吧)

所以,我们必须在RAM中运行eCos,并且还要完成硬件的初始化任务,这也就有了接下来的一大串的问题。

 

3.MINI2440 QEMU的启动方式分析

 

我加点注视来解释下面的ROMRAM启动代码:

 

 

// Create MMU tables

        RAW_LED_MACRO 3

        bl      hal_mmu_init

上面的语句会创建MMU页表,会把0x30000000映射到0地址,0地址映射到0x80000000

        RAW_LED_MACRO 4

 

        // Enable MMU

        ldr     r2,=10f

#ifdef CYG_HAL_STARTUP_ROMRAM

        ldr     r1,=__exception_handlers

        ldr r9,=0x80000000

        sub     r1,r2,r1

        add     r2,r9,r1        // r9 has ROM offset

这里比较重要,首先我们必须知道我们目前还运行在ROM中,经过这两条语句,我们可以确定r2里面存放的是10这个标号相对于

0x80000000的地址。

#endif        

        ldr        r1,=MMU_Control_Init|MMU_Control_M

        mcr        MMU_CP,0,r1,MMU_Control,c0

        mov        pc,r2    /* Change address spaces */

在这里我们看到,MMU被映射后我们把NOR的地址从0映射到了0x80000000,所以我们跳到R2时,就是MMU映射以后在NOR中

的运行效果。

        nop

        nop

        nop

10:

        RAW_LED_MACRO 5

 

#ifdef CYG_HAL_STARTUP_ROMRAM

        mov     r0,r9                     // Relocate FLASH/ROM to RAM

        ldr     r1,=__exception_handlers  // ram base & length

        ldr     r2,=__rom_data_end

20:     ldr     r3,[r0],#4

        str     r3,[r1],#4

        cmp     r1,r2

        bne     20b

        ldr     r0,=30f

        mov     pc,r0

这部分代码就比较简单,把ROM中的代码复制到RAM中,然后跳过去。

        nop

        nop

        nop

        nop

30:             

#endif

 

 

4. vector的问题

现在来看我们的QEMU的启动,ecos的一个特点是运行位置只是相对于启动位置,所以无论怎样我们的代码第一条是可以在RAM中跑的。

所以我们让ROMRAM代码直接跑在RAM中可以做硬件的初始化。

 

接下来的一个问题是,如何保证中断向量工作正常,我们再看两段ARM平台初始化的代码吧,(虽然比较枯燥)

 

这部分叫fix_vectors

 

.section ".fixed_vectors"

        // Interrupt/exception VSR pointers

        .globl  hal_vsr_table

hal_vsr_table:

        .rept   8               

        .long   0

        .endr

 

        .globl  hal_dram_size

hal_dram_size:  

        .long   0

// what, if anything, hal_dram_type means is up to the platform

        .globl  hal_dram_type

hal_dram_type:  

        .long   0

 

 

 

这部分是vectors复制

 

// Reset software interrupt pointer

        ldr     r0,=CYGHWR_HAL_VECTOR_TABLE_BASE           // move vectors

        ldr     r1,.__exception_handlers

#if defined(CYG_HAL_STARTUP_RAM) && /

    !defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)

        cmp     r7,#CPSR_SUPERVISOR_MODE

        beq     10f

#endif

        ldr     r2,[r1,#HAL_ARM_SWI_VECTOR_ADDR]   // software interrupt

        str     r2,[r0,#HAL_ARM_SWI_VECTOR_ADDR]

10:

        ldr     r2,[r1,#HAL_ARM_IRQ_VECTOR]   // IRQ

        str     r2,[r0,#HAL_ARM_IRQ_VECTOR]

        ldr     r2,[r1,#HAL_ARM_IRQ_VECTOR_ADDR]

        str     r2,[r0,#HAL_ARM_IRQ_VECTOR_ADDR]

        ldr     r2,[r1,#HAL_ARM_FIQ_VECTOR]   // FIQ

        str     r2,[r0,#HAL_ARM_FIQ_VECTOR]

        ldr     r2,[r1,#HAL_ARM_FIQ_VECTOR_ADDR]

        str     r2,[r0,#HAL_ARM_FIQ_VECTOR_ADDR]

        ldr     r2,[r1,#HAL_ARM_PREFETCH_VECTOR]   // abort (prefetch)

        str     r2,[r0,#HAL_ARM_PREFETCH_VECTOR]

        ldr     r2,[r1,#HAL_ARM_PREFETCH_VECTOR_ADDR]   

        str     r2,[r0,#HAL_ARM_PREFETCH_VECTOR_ADDR]

        ldr     r2,[r1,#HAL_ARM_ABORT_VECTOR]   // abort (data)

        str     r2,[r0,#HAL_ARM_ABORT_VECTOR]

        ldr     r2,[r1,#HAL_ARM_ABORT_VECTOR_ADDR]

        str     r2,[r0,#HAL_ARM_ABORT_VECTOR_ADDR]

 

这个是link文件

 

#include <cyg/infra/cyg_type.inc>

 

MEMORY

{

    ram  : ORIGIN = 0, LENGTH = 0x8000000

    sram : ORIGIN = 0x40000000, LENGTH = 0x1000

}

 

SECTIONS

{

    SECTIONS_BEGIN

    SECTION_fixed_vectors (ram, 0x20, LMA_EQ_VMA)

    SECTION_rom_vectors (ram, 0x8000, LMA_EQ_VMA)

    SECTION_RELOCS (ram, ALIGN (0x1), LMA_EQ_VMA)

    SECTION_text (ram, ALIGN (0x4), LMA_EQ_VMA)

    SECTION_fini (ram, ALIGN (0x4), LMA_EQ_VMA)

    SECTION_rodata (ram, ALIGN (0x4), LMA_EQ_VMA)

    SECTION_rodata1 (ram, ALIGN (0x4), LMA_EQ_VMA)

    SECTION_got (ram, ALIGN (0x4), LMA_EQ_VMA)

    SECTION_fixup (ram, ALIGN (0x4), LMA_EQ_VMA)

    SECTION_gcc_except_table (ram, ALIGN (0x4), LMA_EQ_VMA)

    SECTION_data (ram, ALIGN (0x4), LMA_EQ_VMA)

    SECTION_bss (ram, ALIGN (0x4), LMA_EQ_VMA)

    CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);

    SECTIONS_END

}

 

 

看到了吧,在我们的RAM中留了一块空地叫fix_vector,我们在启动的时候可以把vector复制过去,然后mmu_init以后

这部分刚好满足ARM920T的中断向量地址。庆幸吧,没修改这里就能用了

 

 

5.代码复制的问题

最后一个问题是,既然我们本来就在RAM中,我们就不用在做代码复制和NOR重新映射了,我们只要定义新的QEMU启动方式就可以旁路掉

这两部分代码了。

 

最后只要QEMU运行的时候加载elf格式的文件到0x30000000就可以正常的运行代码了。

这篇关于MINI2440 QEMU 的 eCos 启动分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/154171

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程