发现出错了……编译通过仿真没问题,但运行不了,估计还是没设置好。等待改进!调研中……
为免我把这两天的学习成果忘了,还是在这里做个备忘吧,同时也希望对正在迷茫的同道中人有所帮忙。
环境:
IDE环境:RealView MDK 4.0
芯片:STM32F103x-HD系列
涉及的文件:
myProj.sct (分散加载描述文件)
Startup.s (初始化文件)
备忘:
(1)LR_IROM1 / ER_IROM1 :此类命名自拟
(2)加载文件格式:
加载区名称 加载区起始地址 加载区大小
{
<执行区1名称> <执行区起始地址> <执行区大小>
{
<执行区描述>
}
<执行区2名称> <执行区起始地址> <执行区大小>
{
<执行区描述>
}
…….
}
(3)使用“分散加载描述文件”,需要定义__user_initial_stackheap(),并在描述文件中定义“ARM_LIB_HEAP”及“ARM_LIB_STACK”
ARM_LIB_HEAP <起始地址> EMPTY <起始大小> - <递增大小> {}
ARM_LIB_STACK <起始地址> EMPTY <起始大小> - <递增大小> {}
例子:
// 堆:起始地址 0x20008000;起始大小 1KB;每次递增 1KB
ARM_LIB_HEAP 0x20008000 EMPTY 0x400-0x0400 {}
// 栈:起始地址 0x20008800;起始大小 1KB;每次递增 1KB
// 以 “堆” 结束后 第一个地址 作为 “栈” 的起始地址
ARM_LIB_STACK 0x20008800 EMPTY 0x400-0x0400 {}
myProj.sct文件内容:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00080000 ;size:0x00080000
{ ; load region size_region
ER_IROM1 0x08000000 0x08060000
{ ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
ER_IROM2 0x08060000 0x00020000
{ ; load address = execution address 200K
mydata.o (+RO-DATA) ; mydat 内所有const变量放在此区
}
RW_IRAM1 0x20000000 0x00008000 ;size:32K
{ ; RW data
.ANY (+RW +ZI)
}
;; The following declarations select the "two region model" ;
;; A default __user_initial_stackheap() will be used ;
ARM_LIB_HEAP 0x20008000 EMPTY 0x400-0x0400 {} ; start size 1KB
; grows downwards for 1KB
ARM_LIB_STACK 0x20008800 EMPTY 0x400-0x0400 {}; start size 1KB
; grows downwards for 1KB
}
(4)修改 startup.s 文件中 __user_initial_stackheap 内容,重新定义堆栈起始地址及大小 。注意:需要指定存储器模式为双段模式__use_two_region_memory(单段模式只定义ARM_LIB_STACKHEAP))
Startup.s 内部分程序:
; Import stack limit from scatter-loading file
IMPORT __use_two_region_memory
IMPORT ||Image$$ARM_LIB_STACK$$ZI$$Limit||
EXPORT __user_initial_stackheap
__user_initial_stackheap
ldr r1, =||Image$$ARM_LIB_STACK$$ZI$$Limit||
mrs r0,cpsr ; Original PSR value
bic r0,r0,#MODE_BITS ; Clear the mode bits
orr r0,r0,#IRQ_MODE ; Set IRQ mode bits
msr cpsr_c,r0 ; Change the mode
mov sp, r1
sub r1, r1, #IRQ_STK_SIZE
参考资料:
《ARM开发工具MDK用户指南》(中文版)(armtools.chm)
参考章节:《 使用分散加载描述文件》
《关于__user_initial_stackheap( )--machunshui的笔记》
网址:http://blog.21ic.com/user1/5759/archives/2009/62869.html
《启动代码中__use_two_region_memory解析》
网址:http://www.embedinfo.com/faq/FAQanswer.asp?id=171
在MDK环境下使用分散加载描述文件
最新推荐文章于 2023-06-29 16:05:13 发布