你好,
请让我询问有关高级引导加载程序的问题和DA14583上的SRAM相关内容的使用情况。
We would like to create the Advanced Boot loader for DA14583. I’ve already read “UM-B-012” but I would like to comfirm these related things.
我们的场景:
- 我们在闪存上写两个应用图像(bin)。两个图像的大小几乎是32kb(rom)/ 8kb(RAM)。当执行每个图像时,将消耗40KB RAM。
- We assign 1 Byte flag on Flash to select which image should be loaded.
——先进的引导加载程序将检查这个标志和德cide which one to boot.
问题:
1.我假设高级引导加载程序加载到Sysram,它将被执行(从0x2000000)。高级引导加载程序的大小约为6KB。这些是对吗?
2.当高级引导加载程序向RAM加载Appiation Image时,是否有任何房间加载?(RAM上的应用程序尺寸为40kB,但先进的Boolt Loader也耗尽了6KB RAM ......)它是否运作良好?我们的情景是否可以实现???
3.当高级引导加载程序向SRAM加载Apporization映像时,我们可以分配要在SRAM上加载的地址吗?或者,它是固定的吗?
4.当高级引导加载程序重置自身时,我们可以设置程序计数器的条目地址吗?还是固定?
抱歉很多问题,但我们彻底淘汰了确认我们的方案是否有可能。
非常感谢您的支持。
Best Regards,
CD
设备:
您应该在SDK中查看引导加载程序项目。它位于Utilities \ Secondary_bootloader。它几乎完全确实是你想要的。两个图像位于Flash上,选择要运行的图像被复制到Sysram中,然后启动。
高级引导加载程序的大小约为6 kB,具体取决于您的配置方式。它加载到Sysram并从地址0x0执行。注意,当地址0x0被重新映射到sysram时,地址0x0映射到与0x20000000相同的存储单元。
创建图像时,您有两种大小,图像的实际大小和应用程序的RAM使用情况。当应用程序开始时,初始化应用程序所需的RAM量,因此不占用图像中的任何空间。初始PC由链接器选择并放置在图像中的偏移0x4处,不应改变。
If you look in the scatterfile of the advanced boot loader (startup\bootloader.sct), you will see that everything except startup code is placed in execution region 0x80000. That means the ARM linker generates code that when the advanced boot loader starts, all boot loader code is copied to 0x80000 and then runs from there. That means SysRAM is now free which the boot loader will fill in with the final application.
当您开始最终应用程序时(32 kB),应用程序生成的码将启动您已声明的RAM部分(8 KB)与零。这意味着如果您在地址0x80000处具有变量,则初始化代码将覆盖启动加载程序,该引导加载程序可以不再需要。
I'm not sure what you mean or want to achieve with loading the application to a specific location in the memory. The ARM processor assumes it is initially placed at address 0x0 when the reset handler is called. All interrupt handlers must also be placed at the beginning of SysRAM to work. You can of course use the scatter file to put your functions and variables at specific addresses if you want to.
请注意,通常旨在从0雷竞技安卓下载x20000000而不是0x0运行的应用程序。这也将工作,即使0x0被重新映射到ROM以来(几乎)所有ROM中断处理程序都是0x20000000的中断处理程序中的蹦床。
希望这能回答你的问题。
嗨Joacimwe,
非常感谢您的详细评论。现在,我一点地明白了。
您提到“先进的引导加载程序,除启动代码之外将被放置0x80000区域并执行”,这是我想知道的。实际上,我尚未理解分散文件和armlinker行为,直到你指向它们。
Let me confirm whether my understanding about system boot and Image loading is correct or not, please:
- (主要)Bootloader
引导加载程序在ROM中硬编码。电源打开时,执行引导加载程序,并检查高级引导加载程序是否存在。如果存在,Bootloader加载在工厂中刻录的辅助引导加载程序,如果它不存在,高级引导程序并将其复制到0x20000000,则执行它。(然后,高级引导加载程序只能位于OTP中。)
- Secondary Bootloader (Adcanced Bootloader)
分散文件定义为:
*two initializing files (startup_CMSDK_CM0.o and system_CMSDK.o) are addressed to 0x0000000.
* ROM的其余部分,RAM,堆栈部件被解决至0x80000。
因此,armlinker分配对象并生成将它们复制到适当位置的代码。armlinker生成的代码在初始化文件之前执行。(也许..)
当辅助引导加载程序将目标图像从外部存储器复制到0x20000000时,辅助引导程序本身在0x80000区域上执行。所以,它准备在那时复制它。
The above is what I've understood know... Is it correct?
Thank you so much for your cooperation again.
Best Regards,
CD
你对第二部分完全正确。
首先,我同意术语有点令人困惑。DA14580和DA14583具有完全相同的ROM代码,因此具有相同的主引导加载程序。
The "secondary bootloader" project is programmed by the customer on DA14580 into the OTP.
在DA14583上,此项目代替“高级引导加载程序”,因为OTP上已经有预编程(完全不同)的辅助引导程序。
On DA14583, the ROM code always boots the secondary bootloader since it is hardcoded to do so. Now, if there is an "advanced bootloader" programmed by the customer as well, the secondary bootloader will detect that (according to UM-B-012) and start it. So in the end, if you program the advanced bootloader and your application code, in total three bootloaders will be run before your application code runs ;)
嗨Joacimwe,
现在所有事情都对我来说很清楚。
非常感谢您对我的问题进行备忘!
Best Regards,
CD