上位机图像处理和嵌入式模块部署(f103 mcu中main入口函数误解)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        学习stm32代码的时候,关于汇编文件,大家一般都会参考官方给出的汇编文件。通常情况下,不会自己去写汇编文件。特别是汇编文件的最后一行,大家都会把__main看成是直接进入main函数。后面通过反汇编,发现情况并不是这样的。我们编写代码,除了keil工程中的内容,还有MicroLib库,这一点常常被我们忽视。

1、之前的汇编代码

; Reset handler
Reset_Handler   PROCEXPORT  Reset_Handler             [WEAK]IMPORT  __mainIMPORT  SystemInitLDR     R0, =SystemInitBLX     R0               LDR     R0, =__mainBX      R0ENDP

        汇编代码这部分呢,大家一般都不会陌生,我们也通常都认为是__main直接跳转到了自定义的main函数。但是实际情况,我们可以通过反汇编来确认。

2、如何生成反汇编文件

        在项目的User tab配置中,添加这样的命令,就可以在project下面生成dis文件,

fromelf --text -a -c --output=Fire_F103VE.dis ../Output/Fire_F103VE.axf

        这样在最后的axf生成的同时,也能生成dis文件。如果需要生成bin文件,也是类似的做法。

fromelf --bin --output Fire_F103VE.bin ../Output/Fire_F103VE.axf

3、找到Reset_Handler位置

        首先我们找到Reset_Handler位置,

    __Vectors0x08000000:    20000410    ...     DCD    5368719520x08000004:    08000145    E...    DCD    1342180530x08000008:    08000d81    ....    DCD    134221185

        一般向量的第二个选项就是reset入口,不过mcu很奇怪,入口地址都要减去1才是正确的地址。也就是说,这里的Reset_Handler其实是08000144,

    Reset_Handler0x08000144:    4806        .H      LDR      r0,[pc,#24] ; [0x8000160] = 0x8000e170x08000146:    4780        .G      BLX      r00x08000148:    4806        .H      LDR      r0,[pc,#24] ; [0x8000164] = 0x80001310x0800014a:    4700        .G      BX       r0

        我们发现了,这边pc最后跳转的地址是8000131,因为需要减去1,那就是8000130,

    _main_stk0x08000130:    f8dfd00c    ....    LDR      sp,__lit__00000000 ; [0x8000140] = 0x20000410.ARM.Collect$$$$00000004_main_scatterload0x08000134:    f000f82a    ..*.    BL       __scatterload ; 0x800018c

        这边执行不久,就跳转到了__scatterload,

    __scatterload__scatterload_rt20x0800018c:    4c06        .L      LDR      r4,[pc,#24] ; [0x80001a8] = 0x8000ec40x0800018e:    4d07        .M      LDR      r5,[pc,#28] ; [0x80001ac] = 0x8000ee40x08000190:    e006        ..      B        0x80001a0 ; __scatterload + 200x08000192:    68e0        .h      LDR      r0,[r4,#0xc]0x08000194:    f0400301    @...    ORR      r3,r0,#10x08000198:    e8940007    ....    LDM      r4,{r0-r2}0x0800019c:    4798        .G      BLX      r30x0800019e:    3410        .4      ADDS     r4,r4,#0x100x080001a0:    42ac        .B      CMP      r4,r50x080001a2:    d3f6        ..      BCC      0x8000192 ; __scatterload + 60x080001a4:    f7ffffc8    ....    BL       __main_after_scatterload ; 0x8000138

        快结束的时候,又跳转到了__main_after_scatterload,

    __main_after_scatterload_main_clock_main_cpp_init_main_init0x08000138:    4800        .H      LDR      r0,[pc,#0] ; [0x800013c] = 0x8000e750x0800013a:    4700        .G      BX       r0

        这边貌似要回到main函数了,看这里的地址是8000e75,那就是8000e74,

    i.mainmain0x08000e74:    bf00        ..      NOP      0x08000e76:    f7ffff9e    ....    BL       SystemClock_Config ; 0x8000db60x08000e7a:    f7ffff2b    ..+.    BL       LED_GPIO_Config ; 0x8000cd40x08000e7e:    e012        ..      B        0x8000ea6 ; main + 500x08000e80:    2200        ."      MOVS     r2,#00x08000e82:    f44f5100    O..Q    MOV      r1,#0x20000x08000e86:    4808        .H      LDR      r0,[pc,#32] ; [0x8000ea8] = 0x400110000x08000e88:    f7fffb4a    ..J.    BL       HAL_GPIO_WritePin ; 0x80005200x08000e8c:    f44f707a    O.zp    MOV      r0,#0x3e80x08000e90:    f7fff992    ....    BL       HAL_Delay ; 0x80001b80x08000e94:    2201        ."      MOVS     r2,#10x08000e96:    0351        Q.      LSLS     r1,r2,#130x08000e98:    4803        .H      LDR      r0,[pc,#12] ; [0x8000ea8] = 0x400110000x08000e9a:    f7fffb41    ..A.    BL       HAL_GPIO_WritePin ; 0x80005200x08000e9e:    f44f707a    O.zp    MOV      r0,#0x3e80x08000ea2:    f7fff989    ....    BL       HAL_Delay ; 0x80001b80x08000ea6:    e7eb        ..      B        0x8000e80 ; main + 12

        看到上面的代码,大约可以验证到我们的猜测了。

4、总结

        之前在做linux soc芯片汇编文件编写的时候,中断初始化、bss初始化、sp初始化、已初始化全局变量copy、main函数跳转,这些都是基本的内容。后面自己看mcu代码的时候,却没有发现这部分内容,当时觉得很诧异,直到后来自己看了axf文件的反汇编内容之后,才晓得ide和背后的编译器帮我们做了很多事情。刚才说的这一切,都在main函数调用之前准备好了。但恰恰这一点,对于我们debug调试、分析和boot 加载研究很有帮助。

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

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

相关文章

凡事有利有弊,如果生了一个自闭症的小孩,请说出有利的部分 :独特、专注力、诚实和直接,记忆力

生育一个自闭症小孩可能带来一些独特的优势和积极的方面,尽管也会面临许多挑战。以下是一些可能的有利方面: 独特的视角:自闭症儿童通常有独特的思维方式和视角,他们可能在某些方面比普通人更敏锐。这种独特性可以带来创新的解决方…

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下: nginx配置如下: 访问地址: zhadmin.iotzzh.com image.png

20240529瑞芯微官方Toybrick TB-RK3588开发板的Debian11安装iperf并测试网速

20240529瑞芯微官方Toybrick TB-RK3588开发板的Debian11安装iperf并测试网速 2024/5/29 15:09 服务器端:瑞芯微官方Toybrick TB-RK3588开发板:Debian11 客户端:笔记本电脑:Ubuntu20.04 两者通过千兆交换机连接! toybr…

小白跟做江科大32单片机之蜂鸣器

1.复制之前编写的工程库项目,详细工程库创建过程如下链接: 小白跟做江科大32单片机之LED闪烁-CSDN博客https://blog.csdn.net/weixin_58051657/article/details/139295351?spm1001.2014.3001.55022.按照江科大老师给的图片进行连接蜂鸣器 3.修改main.c…

VRTK4教程 一:资源导入、Unity设置、连接头盔

文章目录 VRTK4的分包导入VRTK4的资源包unity设置连接头盔 VRTK4的分包 vrtk4的资源包和旧版不同,采用了分包导入的思想,我们要用什么功能,就导入什么包,可以有效减小程序体积 如下图,已经导入的vrtk包会显示在Packag…

【JS红宝书学习笔记】第4章 变量、作用域和内存

第4章 变量、作用域和内存 1. 原始值和引用值(面试题) ECMAScript 变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据(Undefined、Null、Boolean、Number、Strin…

DxO PhotoLab 6 for Mac/Win:专业RAW图片编辑的利器

DxO PhotoLab 6 for Mac/Win是一款专为摄影师和摄影爱好者打造的专业RAW图片编辑软件,它将先进的技术、丰富的功能与直观的操作完美结合,为用户提供了一款全面而强大的图片处理工具。 一、技术领先,处理RAW图片更高效 DxO PhotoLab 6采用了…

迅睿CMS邮箱设置QQ邮箱为例

邮箱设置 1、服务器地址两个,普通与企业。 普通:ssl://smtp.qq.com企业:ssl://smtp.exmail.qq.com 2、端口号为:465 3、邮箱账号:填写自己的QQ邮箱作为发布服务器。 4、邮箱密码:到QQ邮箱账号中获取“…

keil4和5版本代码编译错误问题

需求: 在工作中, 遇到了keil4工程的老代码, 需要烧录到板子中. 问题: 电脑中只有keil5软件, 使用keil5软件打开, 编译后报了一堆错, 还是官方库文件的错误, 这就是版本不兼容了. 解决方法: 下载keil4软件, 不要和keil5放到一起. 进行如下操作. 0. 根据如下链接来下载keil4.7…

Compose第一弹 可组合函数+Text

目标: 1.Compose是什么?有什么特征? 2.Compose的文本控件 一、Compose是什么? Jetpack Compose 是用于构建原生 Android 界面的新工具包。 Compose特征: 1)声明式UI:使用声明性的函数构建一…

2024-2025年跨境电商展览会计划表:共筑未来跨境行业的繁荣

-----------------------------2024年跨境电商展计划如下---------------------------- 2024年,2025年国内跨境电商行业将迎来一系列重大的展会活动,是企业展示品牌、交流趋势、拓展商机的重要平台。全国各地展会排期信息现已出炉,记得收藏哦…

Linux中断

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、中断的相关概念1.中断号2.中断的申请和释放申请API函数如下:释放API函数如下:中断处理函数如下:使能和禁止中断 二、上半…

基于python实现的深度学习web多格式纠错系统

基于python实现的深度学习web多格式纠错系统 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat、Maven 系统功能实现 用户登录 登录功能是本系统一个非常重要的功能,这极大的保护了系统的安全。登录…

大模型智力升级:AI的未来之路

大模型的发展引领了人工智能的新时代,其强大的数据处理和学习能力在医疗、金融、教育等众多领域取得了令人瞩目的成就。然而,随之而来的挑战也不容忽视。尽管大模型在特定任务上展现出了卓越的性能,但它们在理解复杂语境、处理未见情况的能力…

【NumPy】全面解析add函数:高效数组加法操作

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

【全开源】Java共享茶室棋牌室无人系统支持微信小程序+微信公众号

打造智能化休闲新体验 一、引言:智能化休闲时代的来临 随着科技的飞速发展,智能化、无人化服务逐渐渗透到我们生活的各个领域。在休闲娱乐行业,共享茶室棋牌室无人系统源码的出现,不仅革新了传统的休闲方式,更为消费…

聊聊最近很火的混合专家模型(MoE)

前段时间,在2024年NVIDIA GTC大会上,英伟达不小心透露了GPT-4采用了MoE架构,模型有1.8万亿参数,由8个220B模型组成,与此前的GPT-4泄露的信息一致。 近半年多以来,各类MoE大模型更是层出不穷。在海外&#…

2024年QMT智能量化交易全解读:一文带你深入了解什么是QMT

随着科技的飞速发展和金融市场的日益成熟,量化交易逐渐成为投资者关注的焦点。QMT(Quantitative Market Trading)智能量化交易系统,作为量化交易领域的重要工具,以其高效、精准、自动化的特点,受到越来越多…

Ableton Live 11 Suite for Mac:音乐创作的全能伙伴

在数字音乐创作的广阔天地中,Ableton Live 11 Suite for Mac无疑是一颗璀璨的明星。作为一款专业的音乐制作软件,它集合了音频录制、编辑、混音、母带制作等全方位功能,为Mac用户提供了无与伦比的音乐创作体验。 Ableton Live 11 Suite拥有直…

Ubuntu/Linux 安装Paraview

文章目录 0. 卸载已有ParaView1. 安装ParaView1.1 下载后安装 2.进入opt文件夹改名3. 更改启动项4. 创建硬链接5. 添加桌面启动方式6. 即可使用 0. 卸载已有ParaView YUT 1. 安装ParaView https://www.paraview.org/ 1.1 下载后安装 找到下载的文件夹,文件夹内…