打印
[STM32F1]

stm32上电后一部分程序在flash中运行,另外一部分在RAM中运行

[复制链接]
10476|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cherished|  楼主 | 2015-1-14 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,最近做一个东西,要求显示程序放在RAM中运行,其它的程序在flash中运行,请问,stm32应该怎样操作?
急求。。。
沙发
s_f_tan| | 2015-1-14 16:14 | 只看该作者
开个大数组,把Rom中的程序拷贝过来,然后用函数指针调用就行了

使用特权

评论回复
板凳
mmuuss586| | 2015-1-14 18:51 | 只看该作者
按照楼上意见试试看;

使用特权

评论回复
地板
airwill| | 2015-1-14 18:53 | 只看该作者
楼上的办法可行, 不过有些注意的地方,  由于 ARM 指令的函数调用是相对寻址的, 所以 SRAM 中的程序不要去调用 FLASH 中的子程序. 切近哦

使用特权

评论回复
5
cherished|  楼主 | 2015-1-14 21:24 | 只看该作者
s_f_tan 发表于 2015-1-14 16:14
开个大数组,把Rom中的程序拷贝过来,然后用函数指针调用就行了

请问,用什么方法把片内flash中的程序拷贝到RAM中,拷贝到RAM中的程序,在被调用的时候,还是一样的函数调用吗?

使用特权

评论回复
6
s_f_tan| | 2015-1-17 12:55 | 只看该作者
1.做两个short 指针,一个强制指到Rom地址,一个指到Ram地址,当做普通数据拷贝就是了,另外thumb 是16位对齐的,不要排错了,
2.不能调用函数名了,得用指针调用了,可以参考那个IAP的程序
        if (((*(vu32*)appadr) & 0xFFFF0000 ) == 0x20000000)
        {
                BspClose();
                /* Jump to user application */
                JumpAddress = *(vu32*) (appadr + 4);//第二个字为复位向量
                JumpToApplication = (FunVoidType) JumpAddress;

                /* Initialize user application's Stack Pointer */
                __set_MSP(*(vu32*) appadr);//第一个字为堆栈顶值
                JumpToApplication();
        }

使用特权

评论回复
7
huangqi412| | 2015-1-17 20:49 | 只看该作者
难道不是指定函数编译到ram区  __main自动搬么  有什么特殊要求要折腾自己搬?

使用特权

评论回复
8
huangqi412| | 2015-1-17 20:50 | 只看该作者
为何二楼会下面一堆赞同

使用特权

评论回复
9
myxiaonia| | 2015-1-17 22:07 | 只看该作者
huangqi412 发表于 2015-1-17 20:50
为何二楼会下面一堆赞同

nice,mdk明明提供了内存函数的做法,很多人还在说用开辟数组的做法。。。函数中如果有位置相关代码就悬了

貌似gcc还有更爽的做法,只要给个限定词就可以了

使用特权

评论回复
10
Serge_Ding| | 2015-1-17 23:02 | 只看该作者
我想知道,这样做有什么好处

使用特权

评论回复
11
huangqi412| | 2015-1-18 00:21 | 只看该作者
myxiaonia 发表于 2015-1-17 22:07
nice,mdk明明提供了内存函数的做法,很多人还在说用开辟数组的做法。。。函数中如果有位置相关代码就悬 ...

iar也有

使用特权

评论回复
12
ZL_SX| | 2015-1-19 21:36 | 只看该作者
在IAR开发环境中,将函数声明为__ramfunc.

使用特权

评论回复
13
s_f_tan| | 2015-1-20 10:14 | 只看该作者
直接编译时指定ram没怎么试过,只是这种情况下,复位之后就会自动从rom拷贝到ram中去,在应用比较简单的情况下倒是满省力的,如果限制多的情况下,靠系统来自动处理的话反而麻烦。

使用特权

评论回复
14
s_f_tan| | 2015-1-20 10:16 | 只看该作者
基本原理都是一样,只是自己控制的时机不同。

使用特权

评论回复
15
myxiaonia| | 2015-1-20 22:43 | 只看该作者
ZL_SX 发表于 2015-1-19 21:36
在IAR开发环境中,将函数声明为__ramfunc.

貌似gcc也是这个

使用特权

评论回复
16
buxinshan| | 2015-8-7 11:13 | 只看该作者
研究中....

使用特权

评论回复
17
liyihong028| | 2015-8-7 13:52 | 只看该作者
12楼的方法应该是正确的哦

使用特权

评论回复
18
huangjianrong| | 2015-10-2 13:25 | 只看该作者
ZL_SX 发表于 2015-1-19 21:36
在IAR开发环境中,将函数声明为__ramfunc.

请问为什么要把程序从Flash搬到ram中运行呢,难道只是为了执行速度更快吗?

使用特权

评论回复
19
ljxh401| | 2016-5-30 09:58 | 只看该作者
huangjianrong 发表于 2015-10-2 13:25
请问为什么要把程序从Flash搬到ram中运行呢,难道只是为了执行速度更快吗? ...

这样加密性 更好

使用特权

评论回复
20
feiling208| | 2016-6-17 11:46 | 只看该作者
ljxh401 发表于 2016-5-30 09:58
这样加密性 更好

这个怎么理解?没发现放在RAM中运行,加密性更好的理由。防止外部**?这个怎么做到的呢?

使用特权

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

本版积分规则

个人签名:大家一起学习,互相交流。

20

主题

128

帖子

1

粉丝