Cortex-M0 代码解析——01基本操作

1. 从复位到main初始化配置代码理解

看过Keil工程中的startup文件都知道,代码段起始是栈地址,随后是ResetHandle中断地址。
通过工具查看编译后的bin文件,获取ResetHandle地址,从而能够代码继续更进。比如:
(我代码起始地址配置了0x1000)
在这里插入图片描述
在ResetHandle中,对于Cortex-M3比如stm32标准库而言,会提供时钟初始化等操作。Cortex-M0看各家芯片厂商如何配置的。随后都会调用如下代码进行跳转(其中__main中的代码,)
在这里插入图片描述

1.1 __main中做了什么?

随后继续跟进,在__main中其实本质上是执行了如下几个操作:

  • 若有代码需要放于RAM中运行,则会进行代码重定向。(也即将相关的代码从code中搬移到ram区域)
  • 将data区数据,搬移到ram中,则该部分变量可读可写。
  • bss段清0。

汇编执行流程如下图所示:
在这里插入图片描述
其中,一些简单的汇编理解,这里不再赘述。因为我觉得有耐心看我写的这篇文章的人,必定对汇编是有一定的了解的。其中特别关键的就是最下面那两个参数。(稍后有详细的计算说明)

我们查看keil编译后的map文件的时候,有两个重要的地址。见下:
(这个是我在另一个工程中摘出来的,地址和上述汇编不同,理解概念就好。不用纠结细节)

    Region$$Table$$Base                      0x000043ec   Number         0  anon$$obj.o(Region$$Table)
    Region$$Table$$Limit                     0x0000440c   Number         0  anon$$obj.o(Region$$Table)

汇编中的那两个参数便于此有关,从上面的汇编代码执行流程可以看出,
Region_Table_Base = 0x10B8 + 0x25D8 = 0x3690
Region_Table_Limit = 0x10B8 + 0x2608 = 0x36C0
共48字节。也即12个字。


其中,Region_Table_Base是一个基地址。从该地址处开始,以如下结构的方式进行顺序排列,到Region_Table_Limit为止。
在这里插入图片描述

  • addr_src: 待搬移数据的源地址
  • addr_des: 待搬移数据的目的地址
  • len: 搬移的长度
  • copy_function: 数据搬移函数地址

从上面的数据中,可以看出相关的参数和对应的搬移函数的地址。也即调用了3个函数,进行了三种数据的搬移。


0x10C0——将放于ram中运行的代码段进行搬移,也即下图中的__scatterload_copy,第一次执行完毕,之后会返回的__scatterload_null标签的地址处继续执行。
在这里插入图片描述
0x132E——是压缩数据的搬移,该部分通过压缩算法(应该是keil实现的吧?),将代码中data段被压缩的数据,解压缩后,搬移到相应的ram对应的空间中去。该部分的压缩和解压缩算法,下一个章节再详细描述(>@_@< 现在都晚上11点了,想睡觉了)

0x10DC——bss段清零函数
在这里插入图片描述

1.2 执行完上述搬移之后,进入__rt_entry

在这里插入图片描述
这部分代码中,主要执行配置栈和堆空间大小以及相关标准库的初始化等操作,这部分我没有太过于详细的理解。就不再说明了。最终进入main函数,开始执行开发者的代码。(简单介绍完毕 &_&)

2. 补充点题外话

    Total RO  Size (Code + RO Data)                 9228 (   9.01kB)
    Total RW  Size (RW Data + ZI Data)              5128 (   5.01kB)
    Total ROM Size (Code + RO Data + RW Data)       9344 (   9.13kB)

代码占用空间大小(常见都是下载到flash中的代码)就是ROM_Size
占用RAM空间大小为 RW_Size + Stack_Size + Heap_Size,其中堆和栈的大小都是在startup文件中配置的。
(当然了,还是那句话,这个是另一个工程中的map文件,大小的细节就不要在意啦。)

好的,简单介绍到这里,下一章节再做补充。

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《The Definitive Guide to ARM Cortex-M0 and Cortex-M0+ Processors (2nd Edition)》是一本权威的指南,旨在深入介绍ARM Cortex-M0和Cortex-M0+处理器的原理和应用。 这本书的第二版对第一版进行了全面修订和更新,以反映最新的技术发展。它面向的读者包括学生、工程师和嵌入式系统开发人员,完全涵盖了ARM Cortex-M0和Cortex-M0+处理器的所有方面。 第二版首先从处理器的基础知识开始,介绍了ARM架构和处理器核心的基本概念。它详细解释了指令集、寄存器、内存管理单元和中断处理等关键组件的功能和作用。 接下来,该书深入探讨了由ARM Cortex-M0和Cortex-M0+处理器支持的编程模型和开发工具。它提供了大量的示例代码和实际应用案例,帮助读者更好地理解如何编写高效的嵌入式软件。 此外,该书还介绍了处理器的性能特征、能源管理、调试技术和硬件外设等方面的内容。读者可以了解到如何最大限度地利用ARM Cortex-M0和Cortex-M0+处理器的特性,提升系统的性能和效率。 总的来说,这本书是学习和使用ARM Cortex-M0和Cortex-M0+处理器的最佳指南。它通过清晰的解释、丰富的示例和实用的技巧,帮助读者掌握这些处理器的核心知识和开发技能。无论是初学者还是有经验的开发人员,都会从中受益,并能够更好地应用ARM Cortex-M0和Cortex-M0+处理器来开发高质量的嵌入式系统。 ### 回答2: 《The Definitive Guide to ARM Cortex-M0 and Cortex-M0 Processors》(第二版)是一本关于ARM Cortex-M0和Cortex-M0处理器的权威指南。它提供了深入的理解和学习这些处理器的各个方面和功能。 本书首先介绍了ARM Cortex-M0和Cortex-M0处理器的基础知识,包括其体系结构、指令集和寄存器等。读者可以通过这些基本概念来建立对这些处理器的整体理解。 接着,书中详细讲解了ARM Cortex-M0和Cortex-M0处理器的内部工作原理和特性。它解释了处理器的各个组成部分,例如ALU、寄存器文件、内存管理单元等,以及它们如何协同工作来执行指令和管理资源。读者可以通过深入理解处理器的内部机制,从而更好地编写和优化相关的代码。 此外,本书还介绍了软件开发工具和环境,为读者提供了使用ARM Cortex-M0和Cortex-M0处理器进行软件开发的基本知识。它涵盖了编程语言、编译器、仿真器和调试器等方面的内容,使读者能够充分利用这些工具来开发高效且可靠的嵌入式系统。 《The Definitive Guide to ARM Cortex-M0 and Cortex-M0 Processors》(第二版)还提供了大量的实例和案例研究,帮助读者更好地应用所学知识。此外,还提供了一些实用的技巧和技术,帮助读者避免常见的错误和问题,并提供了优化代码和系统性能的建议。 总之,本书是一本非常有价值的学习资料,适用于对ARM Cortex-M0和Cortex-M0处理器感兴趣的学生、工程师和研究人员。通过阅读本书,读者可以获得深入的理解和应用这些处理器的能力,从而更好地进行嵌入式系统开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值