发新帖我要提问
12
返回列表
打印
[其他]

在MM32F5微控制器上使用外扩SRAM作为主内存(转)

[复制链接]
楼主: 裤脚口感好
手机看帖
扫描二维码
随时随地手机跟帖
21
裤脚口感好|  楼主 | 2022-9-28 23:50 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
关于跳转之前是否重新配置SP指针(微控制器内核中的MSP和PSP寄存器),这里也有一些考虑:

使用特权

评论回复
22
裤脚口感好|  楼主 | 2022-9-28 23:54 | 只看该作者
如果在application工程的启动程序中,有重置栈指针的操作,那么在bootloader工程中就没必要从application工程的文件中提取栈地址并重置栈顶指针了。但实际上大多数工程的启动程序中都没有这个步骤,而是依赖于微控制内核硬件的自动行为,从中断向量表的第一个表项中提取栈顶地址作为内核栈指针的初值。

使用特权

评论回复
23
裤脚口感好|  楼主 | 2022-9-28 23:55 | 只看该作者
从完全模拟芯片启动行为的角度上看,在进入application之前,仍然需要给application工程一个位于主内存空间中的缺省栈指针,就像bootloader工程中上电后执行的第一条指令时,硬件就已经自动从中断向量表的第一个表项中提取了栈顶地址赋给栈指针。从bootloader跳转到application的过程中,微控制器不会自动将application中断向量表的第一个存放栈顶地址值,硬件自动为栈指针赋值的操作仅仅,只好由bootloader预先准备好。

使用特权

评论回复
24
裤脚口感好|  楼主 | 2022-9-28 23:56 | 只看该作者
关于重置SP指针的影响,这里也要特别说明。当在app_jump_to_image()函数中执行__set_MSP(sp_base)语句时,当前的栈指针就已经变了,此时,当前函数中使用的局部变量,还保存在原有的栈中,使用变化后的栈顶指针已经无法访问原有栈中的内容了。因此,之后再使用的sp_base和pc_base变量都被定义成全局变量,存放在外部内存(仍位于片内SRAM中),而不是栈中。至于addr变量,是来自于函数传参,被存放在内核的Rn寄存器中,不受栈指针变化的影响。

使用特权

评论回复
25
裤脚口感好|  楼主 | 2022-9-28 23:56 | 只看该作者
通过把pc_base赋值给PC寄存器,微控制器内核就转而执行新的PC指针指向的程序,从而完成了跳转到新程序的功能。

使用特权

评论回复
26
tpgf| | 2022-10-10 13:30 | 只看该作者
使用外扩SRAM作为主内存会不会降低数据的读取速度呢

使用特权

评论回复
27
八层楼| | 2022-10-10 13:45 | 只看该作者
在编译阶段,编译器会限定整个程序能使用的存储空间不能大于片内SRAM的大小

使用特权

评论回复
28
观海| | 2022-10-10 13:57 | 只看该作者
跳转函数app_jump_to_image()里边设置地址的代码可以贴一下吗

使用特权

评论回复
29
wowu| | 2022-10-10 14:34 | 只看该作者
大部分时候bootloader的执行时间都是多长呢

使用特权

评论回复
30
木木guainv| | 2022-10-10 15:03 | 只看该作者
裤脚口感好 发表于 2022-9-27 23:55
一些技术高超的工程师可能会想到一些巧妙的做法,能不能先用缺省的片内SRAM支持编译工具链的初始化过程,然 ...

这样做的目的是什么呢 我感觉完全在走弯路啊

使用特权

评论回复
31
xiaoqizi| | 2022-10-10 15:23 | 只看该作者
在什么前提下需要使用外扩SRAM作为主内存呢

使用特权

评论回复
32
xld0932| | 2022-10-10 15:25 | 只看该作者
木木guainv 发表于 2022-10-10 15:03
这样做的目的是什么呢 我感觉完全在走弯路啊

看到你的回复,突然点醒了坑中的我

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则