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

[复制链接]
12157|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 中的子程序. 切近哦
 楼主| cherished 发表于 2015-1-14 21:24 | 显示全部楼层
s_f_tan 发表于 2015-1-14 16:14
开个大数组,把Rom中的程序拷贝过来,然后用函数指针调用就行了

请问,用什么方法把片内flash中的程序拷贝到RAM中,拷贝到RAM中的程序,在被调用的时候,还是一样的函数调用吗?
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();
        }
huangqi412 发表于 2015-1-17 20:49 来自手机 | 显示全部楼层
难道不是指定函数编译到ram区  __main自动搬么  有什么特殊要求要折腾自己搬?
huangqi412 发表于 2015-1-17 20:50 来自手机 | 显示全部楼层
为何二楼会下面一堆赞同
myxiaonia 发表于 2015-1-17 22:07 | 显示全部楼层
huangqi412 发表于 2015-1-17 20:50
为何二楼会下面一堆赞同

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

貌似gcc还有更爽的做法,只要给个限定词就可以了
Serge_Ding 发表于 2015-1-17 23:02 | 显示全部楼层
我想知道,这样做有什么好处
huangqi412 发表于 2015-1-18 00:21 来自手机 | 显示全部楼层
myxiaonia 发表于 2015-1-17 22:07
nice,mdk明明提供了内存函数的做法,很多人还在说用开辟数组的做法。。。函数中如果有位置相关代码就悬 ...

iar也有
ZL_SX 发表于 2015-1-19 21:36 | 显示全部楼层
在IAR开发环境中,将函数声明为__ramfunc.
s_f_tan 发表于 2015-1-20 10:14 | 显示全部楼层
直接编译时指定ram没怎么试过,只是这种情况下,复位之后就会自动从rom拷贝到ram中去,在应用比较简单的情况下倒是满省力的,如果限制多的情况下,靠系统来自动处理的话反而麻烦。
s_f_tan 发表于 2015-1-20 10:16 | 显示全部楼层
基本原理都是一样,只是自己控制的时机不同。
myxiaonia 发表于 2015-1-20 22:43 | 显示全部楼层
ZL_SX 发表于 2015-1-19 21:36
在IAR开发环境中,将函数声明为__ramfunc.

貌似gcc也是这个
buxinshan 发表于 2015-8-7 11:13 | 显示全部楼层
研究中....
liyihong028 发表于 2015-8-7 13:52 | 显示全部楼层
12楼的方法应该是正确的哦
huangjianrong 发表于 2015-10-2 13:25 | 显示全部楼层
ZL_SX 发表于 2015-1-19 21:36
在IAR开发环境中,将函数声明为__ramfunc.

请问为什么要把程序从Flash搬到ram中运行呢,难道只是为了执行速度更快吗?
ljxh401 发表于 2016-5-30 09:58 | 显示全部楼层
huangjianrong 发表于 2015-10-2 13:25
请问为什么要把程序从Flash搬到ram中运行呢,难道只是为了执行速度更快吗? ...

这样加密性 更好
feiling208 发表于 2016-6-17 11:46 | 显示全部楼层
ljxh401 发表于 2016-5-30 09:58
这样加密性 更好

这个怎么理解?没发现放在RAM中运行,加密性更好的理由。防止外部**?这个怎么做到的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

20

主题

129

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部