STM32 eCos 启动代码分析(一)系统复位

(失败)尝试将eCOS移植到stm32h743vi上 目录背景过程感受 背景 我的学长在一家有名的AI公司上班,他们希望能将OpenCV移植到一款低成本的CPU上,但他们对于硬件完全不懂,于是学长希望我尝试一下(虽然我那时也还不懂操作系统和CPU间的关系)。选择stm32h743vi这个型号的单片机首先当然是因为他与arm contex-a内核的CPU相比很便宜啦,其次他有DMA2D控制器,说是“专用于图像处理的专业 DMA”,然后片上ROM和RAM都还比较大,就选它了。后来看手册的时候,才发现这个所谓的DMA2D仅仅只能实现对图像的像素点进行修改值操作,并没 阅读详情

概述

最近接触了STM32,开始了解CortexM3系列ARM处理器上RTOS的移植和启动。

开始总是艰难的,CortexM3是arm7tdmi的升级产品,但实际上和之前的ARM7有着很大的区别。

首先,我们必须有支持CortexM3的编译器,因为CortexM3采用的是Thumb和Thumb2指令集,而不是ARM指令集。

好在eCos 3.0以后ecoscentric提供的toolchain已经支持了CortexM3虽然可能没有采用Thumb2指令集,但是编译和运行eCos是没问题的。

因为CortexM3的中断和异常的特殊性决定了它上面运行的启动代码的不同,这也是为什么我们看到ecos把cortexm的体系结构和之前

的ARM平行放置了。

我们首先看看eCos的第一条语句是怎么运行的,这样我们就比较容易理解后面硬件初始化和中断入口表的代码了。

纵观CortexM启动代码

要了解eCos的CortexM启动代码,需要理清下面几个文件的编译和链接关系。

packages/hal/cortexm/arch/current/src/vector.S

packages/hal/cortexm/arch/current/src/hal_misc.c

packages/hal/cortexm/stm32/stm3210e_eval/current/include/pkgconf/mlt_cortexm_stm3210e_eval_rom.ldi


packages/hal/cortexm/arch/current/src/vector.S

//==========================================================================


.syntaxunified

.thumb


//==========================================================================

//Initial exception vector table

//

//This only contains the stack and entry point for reset. The table

//to be used at runtime is constructed by code in hal_reset_vsr().


.section ".vectors","ax"


.global hal_vsr_table

hal_vsr_table_init:


.long    hal_startup_stack // 0 Reset stack

.long    hal_reset_vsr // 1 Reset entry

这里我们可以看到,hal_vsr_table_init开始的预留了8个byte,我们可以猜想这个就是系统的启动部分。

但是,要想了解eCos的启动代码,我们必须知道hal_startup_stack和hal_reset_vsr来源于何处如何设定。

//==========================================================================


packages/hal/cortexm/stm32/stm3210e_eval/current/include/pkgconf/mlt_cortexm_stm3210e_eval_rom.ldi

//eCos memory layout


#include<pkgconf/hal.h>

#include<cyg/infra/cyg_type.inc>


MEMORY

{

sram : ORIGIN = 0x20000000, LENGTH =0x00010000-CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE

flash: ORIGIN = 0x08000000, LENGTH = 0x00080000

rom : ORIGIN = 0x64000000, LENGTH = 0x01000000

ram : ORIGIN = 0x68000000, LENGTH = 0x00100000

}


SECTIONS

{

SECTIONS_BEGIN

SECTION_rom_vectors(flash, 0x08000000, LMA_EQ_VMA)

SECTION_RELOCS(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_text(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_fini(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_rodata(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_rodata1(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_fixup(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_gcc_except_table(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_eh_frame(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_got(flash, ALIGN (0x8), LMA_EQ_VMA)

SECTION_sram(sram, 0x20000400, FOLLOWING (.got))

SECTION_data(ram, 0x68000000, FOLLOWING (.sram))

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

CYG_LABEL_DEFN(__heap1)= ALIGN (0x8);

SECTIONS_END

}


hal_vsr_table= 0x20000000;

hal_virtual_vector_table= hal_vsr_table + 128*4;

hal_startup_stack= 0x20000000 + 1024*64;

这里我们可以看到,这个链接管理脚本设置了hal_startup_stack的大小。

观察map文件

我们通过arm-eabi-nm这样的工具把elf文件生成几个map文件看一看这些symbol的具体位置。

hal_reset_vsr

hal_startup_stack

hal_reset_vsr是系统初始化的一个重要函数

hal_reset_vsr还调用了stm32变体层的初始化函数hal_system_init。

分析一下生成的binary文件

以ROM类型的二进制文件为例,如果我们把STM32的芯片设定为从内部的ROM启动。

他会默认的执行0x0000000也就是0x0800000,我们通过Linux的ghex来看这个二进制文件的前8个字节。

我们会看到

0x20010000

0x08003085

而之前我们通过map文件查到的

0x20010000  hal_startup_stack

0x08003084  hal_reset_vsr





那么为什么这两个地址会差1呢,如果我们能合理的解释。那么我们基本上就清晰的了解了CortexM的启动部分了。

查阅CorteM3权威指南

查阅以后我们看到有这样的解释,

在离开复位状态后,CM3 做的第一件事就是读取下列两个 32 位整数的值:

-从地址 0x0000,0000 处取出 MSP 的初始值。
-从地址 0x0000,0004 处取出 PC 的初始值——这个值是复位向量,LSB 必须是 1。然后从这个值所对应的地址处取指。




因为 CM3 使用的是向下生长的满栈,所以 MSP 的初始值必须是堆栈内存的末地址加 1。
 
举例来说,如果你的堆栈区域在 0x20007C00‐0x20007FFF 之间,那么 MSP 的初始值就必须是0x20008000。

向量表跟随在 MSP 的初始值之后——也就是第 2 个表目。要注意因为 CM3 是在 Thumb态下执行,
所以向量表中的每个数值都必须把 LSB 置 1(也就是奇数) 正是因为这个原因,图 3.18 中使用 0x101 来表达地址 0x100。

当 0x100 处的指令得到执行后,就正式开始了程序的执行。在此之前初始化 MSP 是必需的,因为可能第 1 条指令还没执行就会被 NMI 或是其
它 fault 打断。MSP 初始化好后就已经为它们的服务例程准备好了堆栈。
 
对于不同的开发工具,需要使用不同的格式来设置 MSP 初值和复位向量——有些则开发工具自行计算。
如果想要获知细节,最快的办法就是参考开发工具提供的一个示例工程。

结论

通过以上的一些论证,我们了解了CortexM的启动特性,以及如何根据ecos的memory配置文件,

保证系统启动的时候设定好stack并且执行到eCos的初始化函数。




手把手教你用ISP模式通过串口给STM32下载程序(附常见问题排查) 本文详细解析了STM32的ISP(在系统编程)模式,手把手教你如何通过串口给芯片下载程序,并深入探讨了SRAM启动模式用于快速调试。文章涵盖了硬件连接、软件配置、自动化脚本编写以及常见问题排查,旨在帮助开发者高效、灵活地完成程序烧录与调试工作。 阅读详情

相关推荐

汽车MCU开发利器:S32 Design Studio环境搭建与调试实战

集成开发环境(IDE)是现代嵌入式系统开发的核心工具,它将代码编辑、编译、调试和项目管理等功能集成于一体,通过图形化界面和自动化流程,极大地提升了开发效率和代码质量。其工作原理在于将复杂的底层工具链(如编译器、链接器、调试器)进行封装和协调,为开发者提供一个统一、直观的操作平台。在汽车电子领域,随着微控制器(MCU)性能的不断提升和功能安全(如ASIL-D)要求的日益严格,开发环境的稳定性和专业性变得至关重要。一个强大的IDE能够有效管理多核通信、复杂存储映射,并集成针对特定架构的优化库,从而帮助工程师应对

dfuw13072的博客 374

ecos代码分析(1)

ecos代码分析(1) 前面分析了u-boot,再分析一下ecos,听说ecos比较复杂,所以还是采取挨船下竿的原则,分析u-boot相似的smdk2410这块开发板。 1. 首先找到链接文件       7 MEMORY       8 {       9     ram  : ORIGIN = 0, LENGTH = 0x4000000

mrwangwang的专栏 2198

嵌入式系统/ARM技术中的如何构建eCos嵌入式系统

eCos是一个优秀的嵌入式实时操作系统。eCos的体系结构是一种分层结构,硬件抽象层将操作系统与硬件隔离开,这为把eCos移植到不同的硬件平台提供了便捷的方法,抽象层就像软件与硬件之间的桥梁。主要的移植思想是,按照eCos的模块化设计,完成硬件抽象层。 引言 目前,嵌入式操作系统的种类较多,其中比较流行的有VxWorks、Windows CE、Psos、Palm OS、嵌入式Linux等。这些嵌入式操作系统在开放性、实用性以及性能等方面各有千秋,但大多数为商用产品。除了商用产品外,还有一些免费的嵌入式操作系统,uClinux是其中比较流行的,而eCos则是另一个选择。嵌入式可配置操作系统eCo

F28335第三篇——寄存器文件结构(CODE_SECTION,DATA_SECTION)

相对于传统的宏定义方式,F28335的寄存器定义方式更加复杂。为了说清楚这个问题,以系统控制寄存器为例。 系统控制寄存器 名称 地址 大小(*16) 描述 PLLSTS 0x7011 1 PLL状态寄存器 保留 0x7012~0x7019 8 HISPCP 0x701A 1 高速外设时钟分频寄存器 LOSPCP 0x701B 1 低速外设失踪分频寄存器 PCLKC...

我想想的博客 5563

用App Inventor做个蓝牙温湿度计,手机自动连Arduino,5分钟搞定硬件数据上屏

本文详细介绍了如何使用App Inventor和Arduino快速搭建一个蓝牙温湿度监测系统,实现手机自动连接并显示实时数据。通过图形化编程和硬件组装指南,零代码基础的用户也能在5分钟内完成硬件数据上屏,适用于智能家居、教学演示等多种场景。

weixin_30813225的博客 171

可信数据空间:可信空间、区域功能节点、业务功能节点、连接器的关联关系

可信数据空间通过分层架构实现安全数据共享:可信空间作为顶层制定全局规则;区域功能节点协调辖区内功能节点协作;功能节点提供具体数据服务;连接器作为唯一通信通道确保安全交互。系统采用"规则自上而下约束,数据自下而上流动"机制,通过分层治理和标准化连接,在保证数据主权的同时实现跨域协作,具有策略分级执行、去中心化治理等特性,支持灵活扩展业务场景。

友莘居士的博客 1683

五大嵌入式操作系统

[掌握这五大嵌入式操作系统,你就是STM32牛人 技术往往更新得非常快,并且总是让我们觉得学起来有难度而且有些迷茫。不过没有关系我们发烧友专注于在快乐中学习,要学习STM32,我们首先了解下五大嵌入式操作系统:μClinux、μC/OS-II、eCos、FreeRTOS和RT-thread。 TOP1:μClinux μClinux是一种优秀的嵌入式Linux版本,从字面意思看...

hbl_hz的博客 4766

电商数据分析19——数据分析在电商平台价格弹性研究中的应用

价格弹性是一个衡量产品价格变化对销量影响的经济学指标,对于电商平台而言,深入理解和有效运用价格弹性,对于制定竞争策略、优化产品定价具有重要意义。随着大数据时代的到来,通过数据分析研究产品的价格弹性,成为了电商企业制定价格策略、调整市场定位、优化促销活动的重要依据。

theskylife的博客 2833

STM32 进阶教程 11 - RAM中运行程序

转自:https://blog.youkuaiyun.com/zhanglifu3601881/article/details/95040782 前言 上一讲我们讲到stm32可以将代码直接下载到RAM中时行程序调试,同时可以有效避开STM32 Flash 擦写次数有限问题,其实除了仿真调试时将程序设置在RAM中可以解决FLASH擦写次数问题外,如果程序实际运行时能直接在RAM中运行,其代码的运行效率也会有一定的提高,那么怎么实现实际运行时让程序在RAM中运行呢,本节将带领大家来实现这一操作。 示例详解 基于硬

我的blog屋 5671

Dify DSL文件分享 Dify讨论群 大模型token资源等(持续收集更新)

基于LLMOps平台-Dify的一站式学习平台。包含不限于:Dify案例、DSL文件分享、模型接入、Dify交流讨论等各类资源分享。

同名公众号:dify实验室 3713

Android——Handler详解

1. 简介 Handler是一套 Android 消息传递机制 可以说只要有异步线程与主线程通信的地方就一定会有 Handler。 在多线程的应用场景中,将工作线程中需更新UI的操作信息 传递到 UI主线程,从而实现 工作线程对UI的更新处理,最终实现异步消息的处理 使用Handler消息传递机制主要是为了多个线程并发更新UI的同时,保证线程安全 2. 相关概念解释 Handler、Message、Message Queue、Looper Android消息机制: 以Handler的sendMes

Yawn 7万+

关于STM32 FLASH上运行ecos的内存配置的一点解释

最近很多网友问了关于STM32上运行ecos失败的一些问题,这里简要回答。 1、选择运行方式 cortexm3的ecos,有三种运行方式ram, rom和jtag ram和jtag是用于调试的,ram方式会把你的执行代码也放到ram中,jtag的代码放在rom中,这个内存模板主要是为了解决jtag连接不上的问题。 rom运行就是我们最后完成项目时候烧入到norflash中运行的方式,代码需

嵌入式虚拟系统实验室 5454

实战:如何通过修改VTS和HTS调整GC4653 sensor帧率(附完整计算步骤)

本文以GC4653图像传感器为例,详细解析了通过修改VTS和HTS寄存器来精确调整输出帧率的完整流程。文章深入剖析了帧率计算公式FPS = PCLK / (VTS × HTS)的核心原理,并提供了从获取寄存器参数、计算目标VTS值到系统验证的实战步骤,帮助工程师掌握独立优化Sensor性能、提升低照度画质的关键技能。

gin88的博客 338

STM32移植ECOS(转载)

转载至:http://bbs.21ic.com/icview-520412-1-1.html 经过一段时间折腾,让redboot和eCos在stm32上跑起来了,这也算是第一段的目标。仅管还有这样那样的问题,也有一些自己尚未弄懂的问题,但初步达到了自己想要的结果。 在每个移植步骤中,我都把它详细记录成文章发表在我的个人独立域名博客中。由于内容过多,所以在这里我以链接的形式呈现给

davidlinux的专栏 1585

第一部分:VTK基础入门(第1章:VTK简介与概述)

VTK简介与核心特性概述 VTK(Visualization Toolkit)是一个开源的跨平台C++类库,专用于3D计算机图形学、图像处理和科学可视化。由Kitware公司开发,VTK自1993年起源以来,经历了开源化、成熟化和现代化多个发展阶段,现已成为科学可视化的核心工具之一。 VTK的核心特性包括: 管道架构:模块化设计实现数据流管理 丰富的数据支持:处理多边形数据、图像数据等 强大的渲染能力:集成OpenGL,支持多种渲染技术 最新版本VTK 9.4.2增强了现代C++支持,优化了内存管理,并提升

仰望星空的博客 2356

Central Finance 全景解析:用 SAP S/4HANA 构建跨系统的财务中台与渐进式转型路径

Central Finance 是基于 SAP S/4HANA 的一种部署与应用场景:在不打断现有异构源系统运营的前提下,把多套 SAP 与非 SAP 系统中的财务与管理会计数据实时/准实时复制到一套中心化的 SAP S/4HANA 中,作为统一的记账与分析底座,逐步把选定的财务流程(如预算控制、付款、固定资产结账等)迁入中心系统。这让企业既能快速获得统一报表与统一核算结构,又为未来的整体迁移留出了弹性路径。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 387

STM32 eCos 启动代码分析(三)系统时钟滴答

时钟滴答好比人的心脏一样,是操作系统必不可少的一个部件,在线程的切换和软件延时等系统时间相关功能中起着无法替代的角色。 操作系统中的时钟滴答,需要一个周期性的可配置的信号源来实现,并且一般都是以中断的方式在后台通知系统下一个滴答的到来。 (本文原创,转载请注明出处http://blog.youkuaiyun.com/rickleaf) eCos中为了提供移植性,一般会用CYGNUM_HAL_INTERR

嵌入式虚拟系统实验室 5340

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

stm32程序跑飞的原因_stm32移植ecos #15,SRAM的FSMC时序配置—解决程序时不时跑飞或死掉的问题...

从开始移植ecos到stm32开发板以来,“程序运行过程中时不时跑飞或死掉,或者一加载就死掉”的问题一直令我头痛和百思不得其“姐”。如下图:程序一加载就死掉了。程序运行过程中跑飞的现象类似,也是出现这种类似信息:$T050f:00800068;0d:e80f0d68;#98$T050f……今天在编写按键程序时,频繁出现,是时把它解决了。功夫不负有心人,终于定位问题为外扩的SRAM时序不正确导致的...

weixin_39637723的博客 664

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ARM裸机开发篇1:Cortex-A7开发环境搭建

写在前面: 本文章为《ARM Cortex-A7裸机开发篇》系列中的一篇,全系列总计11篇。笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。 针对FS-MP1A开发板,除了Cortex-A7裸机开发篇外,还包括其他多系列教程,包括Cortex-M4开发篇、FreeRTOS篇、Linux基础及应用开发篇、Linux系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。欢迎关注,更多stm32mp157开发教程及视频,可加技术

华清远见IT实验室专栏 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

eCos移植到Cortex-M7执行swi 0导致异常

mingdu.zheng at gmail dot com http://blog.youkuaiyun.com/zoomdy/article/details/78623283 问题描述 eCos移植到Cortex-M7后,每次运行到hal_reset_vsr函数的swi指令就会产生异常(IACCVIOL),连接仿真器进行单步调试则没有问题。 解决办法 在hal_reset_vsr函数的sw...

zoomdy's blog 837

eCos学习笔记 2

1、编译一个 C、C++ 应用程序因为各个目标的编译选项各不相同,参考examples/Makefile 文件或“Global compiler flags” option (CYGBLD_GLOBAL_CFLAGS) 编写 Makefile文件; 2、Debugging Techniques(调试技巧)A、Tracing;B、Kernel Instrumentation;

aaaaatiger--寻路 1190

STM32MP157系列教程连载-Linux系统移植篇4:STM32MP1微处理器之Bootloader移植

STM32MP157系列教程连载-Linux系统移植篇4:STM32MP1微处理器之Bootloader移植 第 1 章 BootLoader(Uboot)移植 1.1 实验原理 1.1.1 概念 简单地说,Bootloader就是在操作系统内核运行之前运行的一段程序,它类似于PC机中的BIOS程序。通过这段程序,可以完成硬件设备的初始化,并建立内存空间的映射图的功能,从而将系统的软硬件环境带到一个合适的状态,为最终调用系统内核做好准备。 通常,Bootloader是严重地依赖于硬件实现的,特别是在嵌入式中

stm_fpga的博客 3206

STM32 eCos 启动代码分析(二)上下文切换

最近一直忙于工作,现在空一点继续写这个议题。(本文原创转载请注明出处 http://blog.youkuaiyun.com/rickleaf) stm32既然属于cortexm3体系结构,那么它的线程上下文切换必然要采用cortexm3的方式 打开 packages\hal\cortexm\arch\current\src\context.S //===========================

嵌入式虚拟系统实验室 4899

eCos学习笔记

作者tag:ecos s3c44b0x 优快云 推荐tag:c# arm redboot hal function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);vo

aaaaatiger--寻路 4332

五大适合STM32的嵌入式操作系统

基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。1、μClinuxμClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内...

mjf110107110的博客 3万+

嵌入式可配置实时操作系统eCos

eCos是为嵌入式应用设计的无版税开放源代码的实时操作系统。eCos的高度可配置性,允许对操作系统进行定制,以精确地匹配应用需求,提供最佳运行时性能和最少硬件资源占用。一个欣欣向荣的网络社区已经围绕eCos成长起来,可以确保持续的技术创新和广泛的平台支持。——eCos官网对eCos的介绍 mingdu.zheng <at> gmail <dot> comhttp://...

zoomdy's blog 1万+
上一篇: eCos configtool 在ubuntu 10.10以后菜单消失的解决
下一篇: eCos FrameBuffer driver
知秋一叶
博客等级 码龄19年 196粉丝 68原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值