打印
[STM32F1]

可以从flash运行的程序跳到片内ram里独立的程序文件运行吗

[复制链接]
1412|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
becilies|  楼主 | 2017-6-23 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在我想flash里的程序收到某个指令时,跳转到事先拷贝到ram里的程序进行运行。我放在ram里的程序编译时在keil里设置了相应的地址,查看了编译后的地址也是在内存里了。跳转前我也有设置中断向量到相应的地方,可跳过去就是会跑飞。  (不知道那个拷贝到ram的程序编译时是否有什么特殊的配置)
沙发
becilies|  楼主 | 2017-6-23 14:03 | 只看该作者
求救香主

使用特权

评论回复
板凳
feelhyq| | 2017-6-23 15:50 | 只看该作者
看看你的跳转程序的代码

使用特权

评论回复
地板
yiyigirl2014| | 2017-6-23 19:14 | 只看该作者
是不是程序超界了。

使用特权

评论回复
5
feelhyq| | 2017-6-23 23:19 | 只看该作者
你需要scatter文件,或者一个链接脚本,去设置需要在RAM里面运行函数的运行地址

使用特权

评论回复
6
becilies|  楼主 | 2017-6-24 19:30 | 只看该作者
feelhyq 发表于 2017-6-23 23:19
你需要scatter文件,或者一个链接脚本,去设置需要在RAM里面运行函数的运行地址 ...

单独的函数可以在ram里运行,但是我的是一个独立的程序就不行了,我就在keil编译的时候把代码地址定义在0x2000000那边然后栈用的ram也有独立开来不会有冲突。没有额外用sct文件进行分散加载

使用特权

评论回复
7
becilies|  楼主 | 2017-6-24 20:05 | 只看该作者
本帖最后由 becilies 于 2017-6-24 20:07 编辑
feelhyq 发表于 2017-6-23 15:50
看看你的跳转程序的代码
              #define ApplicationAddress 0x20000000

              __disable_irq();
              JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
              Jump_To_Application = (pFunction) JumpAddress;
              /* Initialize user application's Stack Pointer */
              __set_MSP(*(__IO uint32_t*) ApplicationAddress);
              Jump_To_Application();

使用特权

评论回复
8
becilies|  楼主 | 2017-6-24 20:06 | 只看该作者
yiyigirl2014 发表于 2017-6-23 19:14
是不是程序超界了。

编译出来看map文件都在合理范围内,

使用特权

评论回复
9
becilies|  楼主 | 2017-6-24 20:07 | 只看该作者
becilies 发表于 2017-6-24 20:05
__disable_irq();
              JumpAddress = *(__IO uint32_t*) (ApplicationAddress + ...

              #define ApplicationAddress 0x20000000

使用特权

评论回复
10
yjmwxwx| | 2017-6-25 11:32 | 只看该作者
不是有JLINK么,设断点缩小范围看看哪里跑飞的

使用特权

评论回复
11
feelhyq| | 2017-6-25 22:30 | 只看该作者
becilies 发表于 2017-6-24 20:05
#define ApplicationAddress 0x20000000

              __disable_irq();

默认情况下 0x20000000这个地址存放的依次是全局变量,堆,栈。你放在0x20000000这个地址运行函数岂不是要破坏很多数据。最起码全局变量都没了。

使用特权

评论回复
12
feelhyq| | 2017-6-25 22:32 | 只看该作者
becilies 发表于 2017-6-24 20:05
#define ApplicationAddress 0x20000000

              __disable_irq();

换个内存地址,换一个空闲没有被占用的内存地址

使用特权

评论回复
13
```| | 2017-6-26 12:43 | 只看该作者
becilies 发表于 2017-6-24 19:30
单独的函数可以在ram里运行,但是我的是一个独立的程序就不行了,我就在keil编译的时候把代码地址定义在0 ...

不可以将整个代码放在RAM里,整个代码放在RAM里的话,就只能走J-Link/ST-Link将Code加载到RAM里了。没法脱离这些调试器单独跑了。RAM工程ST是有这样的示例。

楼主的需求,似乎是需要把Boot Code(包括Scatter Load,Vector Table Remap等)保留在Flash上。其余的Code可以放在RAM里。起码startup_xxxx.s和system_xxxx.c是要放在Flash上的。Keil是由选项可以设定Code要摆在什么位置。
如果是直接使用scatter file,可能要用到如下配置:
* (InRoot$$Sections)

使用特权

评论回复
14
becilies|  楼主 | 2017-6-27 17:24 | 只看该作者
``` 发表于 2017-6-26 12:43
不可以将整个代码放在RAM里,整个代码放在RAM里的话,就只能走J-Link/ST-Link将Code加载到RAM里了。没法 ...

我的目的其实是想通过ram里运行的代码把flash里的第一道boot程序更新下,并且芯片已经写读保护了,但现在看样子是无法实现了。因为读保护后flash的0~3页同时也被写保护了,而当我在ram里执行的代码进行解除读保护后,芯片自动擦除整个flash坑的是解除保护后就算时钟那些重新初始化也无法再对flash进行操作除非复位,但是复位以后代码就没法从ram执行了,,,所以应该是无法做到该功能了

使用特权

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

本版积分规则

2

主题

10

帖子

0

粉丝