完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
刚接触嵌入式没多久,学习<嵌入式Linux应用开发>一书在第168页,那页代码提到初始化sdram函数的写法问题,小弟一直不是很能想明白,还是希望有高人指点一二,或许大家曾经遇到过类似的问题,真心望指点
如下: timer项目代码: timer.lds: SECTIONS { . = 0x30000000; .text : { *(.text) } --------------------------------------------这里把代码段等链接到外存地址,那么确实在引导代码里要注意“位置无关的代码”问题,个人查了一些资料,只是提到bl,adr等相对pc的一些指令用法 .rodata ALIGN(4) : {*(.rodata)} .data ALIGN(4) : { *(.data) } .bss ALIGN(4) : { *(.bss) *(COMMON) } } init.c: void memsetup(void) { volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE; /* 这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值----------------------------------------------------------问题就在这里,下面我也会贴出这里要比较的另外一段初始化sdram的代码,希望大神能指点一二,本人确实没觉得另一段代码有和 * 写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到---------------------------------------------------位置有关系,真心觉得两个函数无论从表达目的,写法,及与位置有关等问题都没什么差别 * SDRAM之前就可以在steppingstone中运行 */ /* 存储控制器13个寄存器的值 */ p[0] = 0x22011110; //BWSCON p[1] = 0x00000700; //BANKCON0 p[2] = 0x00000700; //BANKCON1 p[3] = 0x00000700; //BANKCON2 p[4] = 0x00000700; //BANKCON3 p[5] = 0x00000700; //BANKCON4 p[6] = 0x00000700; //BANKCON5 p[7] = 0x00018005; //BANKCON6 p[8] = 0x00018005; //BANKCON7 /* REFRESH, * HCLK=12MHz: 0x008C07A3, * HCLK=100MHz: 0x008C04F4 */ p[9] = 0x008C04F4; p[10] = 0x000000B1; //BANKSIZE p[11] = 0x00000030; //MRSRB6 p[12] = 0x00000030; //MRSRB7 } mmu的代码: mmu.lds: SECTIONS { firtst 0x00000000 : { head.o init.o }-------------------------------------------这里我也清楚,head.0及init.0被链接到0地址,表示从0地址运行,这里确实需要考虑“位置有关的代码”问题 second 0xB0004000 : AT(2048) { leds.o } } init.c: void memsetup(void) ------------------------------------------------------------------------------------这里就是上面所说的另一个初始化sdram的函数,小弟不才,虽然书中已经提到了这个,但是具体为什么上面的函数就能达到与位置无关,而这段函数却达不到 { /* SDRAM 13个寄存器的值 */ unsigned long const mem_cfg_val[]={ 0x22011110, //BWSCON 0x00000700, //BANKCON0 0x00000700, //BANKCON1 0x00000700, //BANKCON2 0x00000700, //BANKCON3 0x00000700, //BANKCON4 0x00000700, //BANKCON5 0x00018005, //BANKCON6 0x00018005, //BANKCON7 0x008C07A3, //REFRESH 0x000000B1, //BANKSIZE 0x00000030, //MRSRB6 0x00000030, //MRSRB7 }; int i = 0; volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE; for(; i < 13; i++) p = mem_cfg_val; } 各位大神看在小弟这么有心份上,还望赐教!!! |
|
相关推荐
2个回答
|
|
void memsetup(void)
{ /* SDRAM 13个寄存器的值 */ unsigned long const mem_cfg_val[]={ 0x22011110, //BWSCON 0x00000700, //BANKCON0 0x00000700, //BANKCON1 0x00000700, //BANKCON2 0x00000700, //BANKCON3 0x00000700, //BANKCON4 0x00000700, //BANKCON5 0x00018005, //BANKCON6 0x00018005, //BANKCON7 0x008C07A3, //REFRESH 0x000000B1, //BANKSIZE 0x00000030, //MRSRB6 0x00000030, //MRSRB7 }; int i = 0; volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE; for(; i < 13; i++) p = mem_cfg_val;}--------------------------------------------------反汇编发现这里的循环赋值会引起与位置有关 30000104 30000104: e3a00312 mov r0, #1207959552 ; 0x48000000 30000108: e59fc020 ldr ip, [pc, #32] ; 30000130 3000010c: e2800034 add r0, r0, #52 ; 0x34 30000110: e3a01312 mov r1, #1207959552 ; 0x48000000 30000114: e08c3001 add r3, ip, r1 30000118: e283332e add r3, r3, #-1207959552 ; 0xb8000000 3000011c: e5932000 ldr r2, [r3] 30000120: e4812004 str r2, [r1], #4 30000124: e1510000 cmp r1, r0 30000128: 1afffff9 bne 30000114 3000012c: e12fff1e bx lr 30000130: 300001fc .word 0x300001fc 300001fc 300001fc: 22011110 .word 0x22011110 30000200: 00000700 .word 0x00000700 30000204: 00000700 .word 0x00000700 30000208: 00000700 .word 0x00000700 3000020c: 00000700 .word 0x00000700 30000210: 00000700 .word 0x00000700 30000214: 00000700 .word 0x00000700 30000218: 00018005 .word 0x00018005 3000021c: 00018005 .word 0x00018005 30000220: 008c07a3 .word 0x008c07a3 30000224: 000000b1 .word 0x000000b1 30000228: 00000030 .word 0x00000030 3000022c: 00000030 .word 0x00000030 |
|
|
|
哇,原来这个帖子是2012年的,我了个。
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2207 浏览 6 评论
2008 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4566 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-14 02:32 , Processed in 1.285613 second(s), Total 76, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号