This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

keil编译stm32程序,将函数放到RAM中不能跳转执行。请大神指点一下。

请教大家两个问题,将一个函数复制到一个数组然后跳转到数组地址去执行那个函数,gcc编译器编译x86可执行程序没有问题,IAR编译430可执行程序也没有问题,但是Keil编译stm32 程序执行的时候不能跳转,进一步发现是LSB置1了并且发现跳转的地址是个偶数(猜测可能与这个有关系,因为好像是CM3规定跳转分支需要是奇数地址)?进而又准备将那个函数绑定在某个地址编译,绑定在ROM可以通过(因为时间关系没有来得及执行),发现绑定在RAM编译不通过,这是为什么?求大神指点一下。最终目的也就是需要将这个函数放到RAM中执行,不知道有没有一些更好的方案设计?

  • 经过ARM社区的傻孩子(社区称呼啊,666)、David与SimonLuk的帮助,在keil平台有一个更简便的方案(将函数放到RAM中执行):首先备份工程,再为要指定的函数定义一个section名字(如 void FunctionName(void) __attribute__((section("SectionName")));,前一个Name与函数有关,后一个Name为section名字(自定义))。然后在工程设置里面,点击Linker选项卡,第一步去掉Use Memory Layout from Target Dialog选项,第二步,点击Scatter File后面的Edit选项(此时工程会打开一个.sct的文件),再点击OK(关闭工程设置窗口,一定不要忘记点击OK)。最后在.sct文件中RAM区域加上一行“* (SectionName)”(section名字)。保存重新编译即可。参考设置如下:

    LR_IROM1 0x08000000 0x00004000 { ; load region size_region
      ER_IROM1 0x08000000 0x00004000 { ; load address = execution address
        *.o (RESET, +First)
        *(InRoot$$Sections)
        .ANY (+RO)
      }
      RW_IRAM1 0x20000000 0x00001000 { ; RW data
        .ANY (+RW +ZI)
        * (SectionName)
      }
    }

  • 好的,非常感谢和David的大力协助。 也赞一下 能把答案贴上来利人利己。