打印
[STM32]

我想要把程序下载进Flash,但是我想让他运行在内存里

[复制链接]
982|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mazhao141|  楼主 | 2017-12-21 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mazhao141 于 2017-12-28 08:15 编辑

环境是 System workbench
我想要把程序下载进Flash,但是我想让他运行在内存里  
所以我在链接器脚本里加入如下的段声明:

_loadaddtest = LOADADDR(.addtest);

  .addtest :
  {
          . = ALIGN(4);
          _saddtest = .;
          *(.addtest)
         
          _eaddtest = .;
  } >RAM AT> ROM
  
  _size_of_addtest = SIZEOF(.addtest);

并且编辑main.c文件

#include <string.h>

extern char _loadaddtest[], _saddtest[], _eaddtest[], _size_of_addtest[];

__attribute__((section(".addtest"))) void addTest(){
        int i;
        for(i = 0; i < 1000000; i ++){

        }
}

int main(void) {
        delay_init(168);
        memcpy(_saddtest, _loadaddtest, _size_of_addtest);
        bspLedConfig();
        bspMD8Config(115200);
        bspFiberOpticalConfig(115200);
        bspIso485Config(115200);
        printfMz("addtest is loaded at:%x, run at :%x, _size_of_addtest is :%x",
                        _loadaddtest,_saddtest, _size_of_addtest); //(_eaddtest - _saddtest));

        while (1) {
                addTest();
                LED(led[1], !LED_STATUS(led[1]));
                //printfMz("HelloWorld\r\n");
        }
}


printfMz函数打印的内容是"addtest is loaded at:80058c0, run at :20000000, _size_of_addtest is :2c"

结论是
函数在SRAM里执行的时间是107ms
在FLASH里执行的时间是84.4ms
不能再CCM里执行


相关帖子

沙发
zxq6| | 2017-12-21 22:04 | 只看该作者
为什么内存里面会比flash慢呢?

使用特权

评论回复
板凳
airwill| | 2017-12-23 17:33 | 只看该作者
内存应该更快, 但是由于取指占用了大量的内存访问带宽, 反而拖累了系统
所以, 有了 CCM 的内存区

使用特权

评论回复
评论
mazhao141 2017-12-29 13:32 回复TA
嗯~发现是这样的,非常非常感谢! 
地板
xcvista| | 2017-12-24 15:30 | 只看该作者
内存应该更快,但是从内存中执行代码的话代码和数据访问争夺总线,反而拖累系统。有些单片机有 SRAM1 和 SRAM2 两块内存,如果把代码放在 SRAM2 数据和堆栈放在 SRAM1 应该可以避免这个问题。另外,STM32F407 的 CCM 只接了数据总线,不能执行代码。下次你可以试试看用 STM32F303 的 CCM,那个接了指令总线。

使用特权

评论回复
5
zqx1000| | 2018-4-10 22:31 | 只看该作者
kankan

使用特权

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

本版积分规则

5

主题

104

帖子

0

粉丝