如果你阅读arm文档,你会看到向量表在哪里以及它的内容是什么。最少需要位于地址0x00000004处重置处理程序(thumb)地址。
如果你阅读stm32文档,你会发现基于启动引脚会发生各种事情,典型应用是0x08000000,它是包含程序的flash,映射到0x00000000。您可以选择链接到0x00000000,也可以选择链接到0x08000000,大多数人都是这样做的,偏移为0x00000004(和0x00000008等)的(thumb)地址将指向0x08000000中的某个位置。
内存只为可读可写的东西、指令、.text提供,它是只读的,您不需要编写,并且对于微控制器,您需要应用程序存储在非易失性存储器中,并且它们被设计为从flash中运行代码(这些天除了这些特定的flash之外,这不是一个好主意)。
因此,您的程序.text和任何其他只读数据都存储在flash中。任何.data都存储在flash中,但引导程序将其复制到RAM中,并清零.bss,然后一旦引导完成并进入C中的入口点(通常是main(),但那只是一个任意函数名),典��的用例是您的程序位于只读flash中,您的数据位于可读写ram中。这是应该的。
当然,作为程序员,您有责任处理向量表、引导程序、链接以及编写程序执行操作。
cortex-m引导方案非常典型,最常见的两个是在某个地址运行或具有地址向量表,其中处理程序处于其中。全尺寸的arms都是从这个地址运行的,而cortex-m是一组地址,一个向量表。
当你阅读nxp或atmel samd等其他cortex-ms实现时,你会发现它们都将你的flash放在启动空间中,但可能以不同的方式进行。有些工厂有引导装载程序可以通过各种方式调用,核心并没有神奇地改变,它只是将工厂引导加载程序映射到cortex-m的零地址空间中。
所有这些都记录在arm和st和nxp和atmel及其他文档中。
编辑
系统内存用于存储数据、读写项目、变量、数据结构等可变内容。如果您选择不使用已经内置的引导加载程序,那么您可以选择编写自己的引导加载程序作为应用程序的一部分。作为引导加载程序,您需要将新程序下载到RAM中,但这并不意味着您必须从那里运行它(尽管“哈佛”这个词被提及),更有可能的是,您只是将其用作烧录到闪存的缓冲区。微控制器的典型目的是运行闪存上的固件,并使用SRAM来存储任何可能发生变化的读/写数据,如时钟收音机、烤面包机、遥控器等。