之前写个一篇文章 (STM32 启动代码分析 及stm32 启动代码 实现|C语言 )写道,cortext-m4 的启动过程:
1,在系统reset时会去找异常向量表中前4个字节指向的地址作为栈顶
2,第4-8个字节是reset handler函数的地址,然后PC会load这个地址,并运行。这个reset 向量指向的函数是我们能写代码控制的最开始的位置。 cortext-m4 从向量表中把reset异常的函数地址加载到PC寄存器并运行是纯硬件行为,而且是无法更改的,那么如何做到从RAM运行了,就需要解决:
1,默认的向量表是在Nor Flash最开始的位置,现在就需要修改向量表到RAM中。
2,如何让PC寄存器从RAM中向量表开始加载reset_handler 函数地址。---显然我们是没法用软件控制的,我们的软件的第一行代码都跑不到。
一个个的搞。
如图片把向量表,和指令text 段都放在了 RAM地址空间中,所以解决第一个问题主要是修改连接脚本。把原先从FLASH加载改到RAM加载,这时在coretx-m4 眼里已经没有了nor_flash。
连接脚本改了后:
arm-none-eabi-nm 工具看一下
RAM中地址是0x20000000开始的,对比flash地址0x08000000。 cortext-m4 眼中的VMA已经全部是在RAM中,还有一个问题就是 cortext-m4 怎么知道 向量表在RAM中了。
直接看图片抓重点,有个VTOR寄存器可以更改向量表的位置。
直接指定VTOR为RAM开始的地方
,其实我的程序现在还比较小,也没其他的中断,可以不指定这个,但是你一当把程序下载到ram中,在按复位按钮,或者产生其他的异常及中断,因为没指定VTOR,程序肯定跑飞。还是加上了
2,第二个问题,更改PC到新的reset_handler函数出怎么解决了。首先这个你是没法通过改自己的编写的代码去做到的, 因为跑不到你的第一行代码那儿去。我的调试环境一直都是openocd +gdb。
先是下载到ram中。
看一下RAM 和 编译的程序,没问题。
dump来看reset 是调用函数地址是0x2000006b
这个CPU 目前最初始的状态
其实到这里就可以让CPU直接跳到0x2000006b处就行。
程序也是正常的跑起来了,但是我们写代码是肯定不知道reset异常对应handler 函数在哪位置了。
现在是0x2000006b,如果这个文件前面加个一些函数就可能0x2000008b了反正不能确定编译器把它放在哪里?
都到这地方了,就是函数地址不固定了,那就固定他就好了,最好的是把它固定在向量表紧接着的位置。
向量表最后一个位置是0x000001A8.紧接着它的位置就是0x200001AC改一下代码及脚本。
把这个reset_handler 放到.reset_fun 段中。
然后连接脚本加上这段,并且把VMA放到0x200001AC位置。
好了地址固定了,最后VScode也好,还是命令行调试,最后就一句话写到脚本里
openocd.exe -f F:\OpenOCD-20200729-0.10.0\share\openocd\scripts\interface\stlink-v2-1.cfg -f F:\OpenOCD-20200729-0.10.0\share\openocd\scripts\target\stm32l4x.cfg -c init -c "reset halt" -c "load_image hello.bin 0x20000000" -c "resume 0x200001AC"
下载及运行都成功。
代码路径 https://gitee.com/android_life/stm32_freertos_opensource/tree/master/assembly/run_code_on_ram
前面说了这个
用户评论
STM32太酷了!把程序加载到RAM就能直接运行,无需闪存,节省空间。
有18位网友表示赞同!
玩这个设备让编程体验更流畅,程序运行速度快得惊人。
有6位网友表示赞同!
对于初学者来说 STM32 简直是一块跳板,让你深入理解内存管理和效率。
有6位网友表示赞同!
我的代码量增加,而STM32处理起来依然游刃有余!无需担心闪存空间问题了。
有18位网友表示赞同!
能够直接在RAM中测试程序,大大提高了开发过程中的效率和便利性。
有10位网友表示赞同!
STM32解决了我之前面对的很多存储限制问题,运行速度也更快了。
有16位网友表示赞同!
这个技术使得硬件调试更加方便迅速,不用担心闪存写入次数受限的风险。
有18位网友表示赞同!
对于喜欢挑战和追求高效能的程序员来说,STM32是绝佳的选择,不依赖闪存让操作更直接。
有10位网友表示赞同!
我的项目因STM32的能力而受益良多,程序加载和运行变得更加轻松自如。
有18位网友表示赞同!
在STM32上运行代码时无需考虑闪存大小限制,开发过程变得不再受束缚。
有18位网友表示赞同!
这种技术使得设备响应时间明显缩短,极大地提升了用户体验感。
有16位网友表示赞同!
对于寻求更高效、快捷开发流程的工程师们,STM32提供了前所未有的便利。
有8位网友表示赞同!
自从改用了STM32,我的代码执行效率提高了数倍,不再有闪存耗尽的困扰。
有17位网友表示赞同!
使用STM32感觉就像是进入了编程的新世界,无需考虑任何闪存货不足的问题。
有5位网友表示赞同!
在RAM中运行程序让我的项目瞬间得到了飞跃,性能优化效果显著。
有8位网友表示赞同!
STM32为那些追求极致性能和速度的游戏开发者提供了一款强大的工具。
有5位网友表示赞同!
不再受限于闪存存储容量的限制,开发变得更加灵活、自由。
有12位网友表示赞同!
得益于STM32的特点,我可以更专注地对程序进行优化和迭代而不受空间束缚。
有20位网友表示赞同!
在RAM中执行游戏意味着更快的游戏启动时间与更流畅的操作体验。
有13位网友表示赞同!
这款设备帮助我克服了以往项目中的存储瓶颈问题,运行效率显著提升。
有18位网友表示赞同!