作者godspeedlee (你,我可以)
看板ASM
标题Re: [问题] 程式载入记忆体问题
时间Mon May 21 13:35:32 2018
※ 引述《wei115 (ㄎㄎ)》之铭言:
: 在没有作业系统的装置上(我用的是STM32F104)
: 假使我的程式指令放在只读的ROM上
: 那我在执行时,要怎麽
: 把可读可写的变数和堆叠丢到RAM上?
: 看了一些资料,好像写连结脚本可以解决?
: 但想想不是阿,连结脚本只是指定哪些资料要放在ROM上,哪些资料要放在RAM上
: 他没有实际把资料作搬移的工作
: 开机时会要把函式丢到记忆体上并设定堆叠暂存器(以便函式呼叫)
: 并且要把可读可写的区段搬移到记忆体上
: 所以编译器有加入实际搬移的code?让我在我的程式执行前做好这些工作?
: 有没有相关资料或关键字可供参考,谢谢
如果你是用 Keil C,他会把 scatter loader 连结到你的程式中,
boot 後 .sct 怎麽排他就怎麽搬。
10年前我写 ARM7 时,还得自己写一小段组语处理以下区段:
Image$$RW, Image$$ZI
这两个区段就是 global variables, static variables
现在其实还是有人手动处理,尤其是那些自己开IC的
如果你想 DIY,可以参考下面这篇文章
http://wiki.csie.ncku.edu.tw/embedded/Lab19/stm32-prog.pdf
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 42.77.42.66
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/ASM/M.1526880937.A.944.html
1F:推 wei115: 感谢,我其实看的就是这篇文章,不过我对搬移的地方不太明 05/21 14:10
2F:→ wei115: 白,所以才上来问 05/21 14:10
3F:→ godspeedlee: 总之那些已经有初始变数的一定会从ROM搬移过去 05/21 14:27
4F:→ godspeedlee: 如果是const,就留在ROM里,但如果是SPI Flash 05/21 14:27
5F:→ godspeedlee: 通常还是得通通搬移到RAM里 05/21 14:28
6F:推 wei115: 这我知道,但实际上是怎麽做的,程式怎麽写的,感觉还是 05/21 19:07
7F:→ wei115: 很模糊 05/21 19:07
8F:→ wei115: 像如果我把一个函式复制到了RAM上,然後我再呼叫这个函数 05/21 19:10
9F:→ wei115: ,那程式要怎麽知道要执行ROM上的函式还是RAM上的函式? 05/21 19:10
10F:推 supertitler: linking就决定了 region的初始化是compiler帮你处理 05/21 19:39
11F:→ supertitler: 的 用keil的话regionTable里面也有link各种初始函 05/21 19:39
12F:→ supertitler: 式 可以去找找看 05/21 19:39
13F:→ godspeedlee: 看来你缺少relocation的概念 05/22 12:14
14F:→ godspeedlee: 你的问题可以把PC值dump出来就清楚了 05/22 12:15
15F:→ godspeedlee: keil编译完有个.map,不知道你看过没? 05/22 12:22
16F:→ wei115: 感谢回覆,我是用jserv课程的gnu工具,没用过keil.....然 05/23 01:08
17F:→ wei115: 後我想我还是缺少了某些概念,让我的思考一直鬼打墙,我 05/23 01:08
18F:→ wei115: 还是再去研究看看目标文件的结构好了....如果有什麽推荐 05/23 01:08
19F:→ wei115: 的资料或关键字的话,还请大大不吝提供,谢谢^_^ 05/23 01:08
21F:→ godspeedlee: 这本可以找来看看 05/23 16:12
22F:→ godspeedlee: 相较於keil,gnu很多要自己来,理论上观念应该要比用 05/23 16:13
23F:→ godspeedlee: keil的人清楚... 05/23 16:13
24F:→ godspeedlee: 你可以去找一下系统程式的教科书,或者尝试自己写一个 05/23 16:15
25F:→ godspeedlee: elf loader,对了解这个问题应该有帮助 05/23 16:15