This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我希望将程序映像从闪存复制到 SRAM、并希望从 SRAM 执行。 我将 Keil 用作 IDE、但我不介意使用 CCS。 我可以复制程序映像、如果它相当于将数据从一个存储器地址复制到另一个存储器地址、但是、在进行一些基本的 googling 后、我注意到我需要使我的代码位置独立、我不知道如何执行此操作。
我希望从外部闪存读取代码并执行它。
P.S. 我只是一个学生、而上面的项目是我希望做的一个业余项目。 感谢您提供同样的帮助:)
您好!
请允许我公司的年轻员工/我注意到您的写作非常出色! 请注意-一次有许多/大多数"在这里"是"学生..."
在我们多年基于 MCU 的设计/开发过程中、我们无法回忆您描述的应用/活动。 您是否可以描述您的"意图"和/或"价值主张"产生于您的"从外部闪存复制程序映像到 SRAM -然后从 SRAM 执行"?
"更直接的方法"是否会看到您的(理想的小)程序进入(通常) MCU 的闪存-然后复制到 SRAM -然后执行? (可能)、"Program Load into -而后从外部闪存读取"进入 MCU 的 SRAM -似乎引入了额外的需求-以及由此实现的任何优势-让我们无法快速识别...
我们的团队使用多席位 IAR (IDE)... 在 IDE 的"帮助"部分中、详细介绍了从"MCU 闪存到 SRAM 的传输-然后执行"。。 也许这是一条"加速/缓和的桥梁"、符合您的目标...
您好!
实际上、我看到许多器件以类似的方式执行 FOTA 类升级。 但无法真正理解它们的实现。
我们现在可以从图片中删除外部闪存。
如果您能够深入了解如何将一些代码从内部闪存复制到 SRAM,然后从 SRAM 执行代码(SRAM),那将非常有用。
此外、Joseph Yiu 博士的这本书指出、我们可以在基于 Cortex M 的 MCU 的 SRAM 外执行代码、并关闭闪存以节省功耗。 SRAM 访问速度也更快。
我的想法是编写一个引导加载程序、将代码的"重要"部分复制到 SRAM 并将控制权转移给 SRAM。
以下是目前的理论:
在我看来、我可以编写一个函数来复制代码、然后通过一些中断- ISR (如 SysTick)修改异常堆栈中的 PC 值。 该 PC 值实际上是 SRAM 中存在的代码的地址。
但我阅读了一些文章和论坛,声称这不是直接的。
如果对我缺失的内容有任何见解、我们将不胜感激。 )
请看一下我们先前答复中的最后一段(新)。 我们的技术团队使用了许多 ARM MCU -来自许多供应商-我不确定我们是否已经在您的 MCU 上实现了您的目标(具有最新存储器)。
我们早就有了姚先生的书——发现他很有技能,这本书很有力量。 也就是说-我们的扫描发现(不是或隐藏)提到了 SRAM 中的"代码执行"。 (我知道我们已经这样做了、但不同供应商的器件之间的方法有所不同。)
为了实现引导加载程序目标-该供应商已经制作了非常详细的引导加载程序指南-强烈建议您(认真)在实施您的"理论"之前查看这些指南。
最后-与以更高的系统时钟运行的(大量) ARM MCU (长)相比、"闪存上的 SRAM "产生的任何"加速"都将出现。 (一个最新的 ARM 器件达到600MHz、但业余爱好者(目前主要)已经采用了这种器件!)
我们有一个示例、可以执行我认为您想要执行的大部分操作。 代码使用不同于其运行地址的加载地址生成、而不是与位置无关的代码。 加载地址是将代码编程到闪存中时使用的地址、运行地址是它将从通常是 RAM 中执行的地址。 请查看 以下位置的示例:C:\ti\TivaWare_C_Series-2.1.4.178\examples\boards\dk-tm4c123g\boot_serial
棘手的部分位于启动汇编文件和链接器命令文件中。 由于这两个文件都是特定于代码生成工具的、因此 TI Code Composer Studio (CCS)、IAR、Keil 和 GCC 都有这些文件的版本。
CCS 启动文件为 BL_STARTUP_CCS.s 函数 ProcessorInit 将整个引导加载程序复制到 SRAM、初始化.bss 段、将硬件中断矢量单元设置为在 SRAM 开头查找矢量、然后将其返回地址更改为跳转到 RAM 而不是闪存。
thumbfunc ProcessorInit ProcessorInit:.asmfunc ; ;;将代码映像从闪存复制到 SRAM。 ; MOV r0、#0x0000 MOV R1、#0x0000 MOVt R1、#0x2000 LDR R2、BSS_START COPY_LOOP: LDR r3、[r0]、#4 结构 R3、[R1]、#4 CMP R1、R2 BLT COPY_LOOP ; ;零填充.bss 段。 ; MOV r0、#0x0000 LDR R2、BSS_END ZERO LOOP: 结构 R0、[R1]、#4 CMP R1、R2 BLT zero_loop ; ;;将矢量表指针设置为 SRAM 的开头。 ; movw r0、#(NVIC_vtable & 0xFFFF) movt r0、#(NVIC_vtable >> 16) MOV R1、#0x0000 MOVt R1、#0x2000 结构 R1、[r0] ; ;;设置刚刚复制到 SRAM 的代码的返回地址。 ; OR LR、LR、#0x20000000 ; ;返回给呼叫者。 ; BX LR endasmfunc
CCS 链接器命令文件为进入闪存的所有代码提供基于 RAM 的地址、并定义一些引用加载地址、运行地址和代码大小的全局符号。
内存 { 闪存(RX):origin = 0x00000000,length = 0x00010000 SRAM (rwx):origin = 0x20000000,length = 0x00010000 }/* 在内存中的段分配*/ SECTIONS { 组 { .intvecs .text .const .data } load = flash、run = 0x20000000、load_start (init_load)、run_start (init_run)、size (init_size) 组 { .bss .stack } run = SRAM、run_start (bss_run)、run_end (bss_end)、size (bss_size)、run_end (__stack_top) }
谢谢您- SRAM 详细信息(可能)并未纳入我们的"10年前版本"。 ("及早"证明并非总是优势-除非在谈论产品介绍时!)
引导加载程序指南-内容丰富-由 TI 提供、提供了极大的灵活性和便利。 (IDE 可能会"触摸"引导加载程序-但绝不会接近(必要)的细节)。
我们的书列出了章节。 9作为"中断行为"-从第145页开始。 没有您注意到的章节。 (但我们只是发现了一个"SRAM"提到的地方-这在书中的索引中没有任何包含。)
认真地-您对 TI 的引导加载程序指南的"查找和阅读"(有多个)将证明其具有很高的价值...
尊敬的 Bob:
感谢您的回复! 您可以在此处链接该版本的 TivaWare 吗? 这将是一个大帮助! )
我拥有的示例文件夹不包括在内。
此致
PRANJAL
http://www.ti.com/tool/SW-TM4C
选择第一个"Get Software"按钮、下载包含示例和文档的完整库。
您好 CB1_MOBILE、
感谢您的参考、如果您可以在此处添加该引导加载程序指南的某个链接、那将非常棒、谢谢!
是的、这一章不存在于本书的旧版本中、我只是检查了它。
非常感谢您的帮助! )
Voici mon AMI、
TivaWARE\docs\SW-TM4C-BOOTLDR-UG.2.1.4.178
值得一提的是、引导加载程序需要:
我的技术团队认为、如果此类"引导加载程序"的主要目的是"避免获取和使用 JTAG 探头"、那么该目的证明是"错误的"。 引导加载程序非常复杂、需要"大量"您的待处理时间和注意力。 在执行引导加载程序时、您对"关键 MCU 元素和代码探索"的开发和掌握可能会被延迟(有时会长期延迟)。
此外-适当的 JTAG 探头将始终(并显著)"快速、方便和增强"您的 MCU 编程和调试。 JTAG 探头被视为"重要"的开发工具...
引导加载程序很少是"早期任务"-通过"学习 MCU 手册和密集程序示例(API)审核"获得必要的经验、可以为即将面临的挑战做好准备... (MCU 搜索框(顶部)将显示"太早"引导加载程序实现中的数百个帖子...)