官方QQ群收藏本站

百问linux嵌入式论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 588|回复: 4

[已解决] 位置相关代码与位置无关代码

[复制链接]

14

主题

43

帖子

208

积分

中级会员

Rank: 3Rank: 3

积分
208
发表于 2016-12-6 11:06:23 | 显示全部楼层 |阅读模式
本帖最后由 lizuobin 于 2016-12-11 22:12 编辑
  1. void memsetup(void)
  2. {
  3.     /* SDRAM 13个寄存器的值 */
  4.     unsigned long  const    mem_cfg_val[]={ 0x22011110,     //BWSCON
  5.                                                             0x00000700,     //BANKCON0
  6.                                                             0x00000700,     //BANKCON1
  7.                                                             0x00000700,     //BANKCON2
  8.                                                             0x00000700,     //BANKCON3  
  9.                                                             0x00000700,     //BANKCON4
  10.                                                             0x00000700,     //BANKCON5
  11.                                                             0x00018005,     //BANKCON6
  12.                                                             0x00018005,     //BANKCON7
  13.                                                             0x008C07A3,     //REFRESH
  14.                                                             0x000000B1,     //BANKSIZE
  15.                                                             0x00000030,     //MRSRB6
  16.                                                             0x00000030,     //MRSRB7
  17.                                                             };
  18.     int     i = 0;
  19.     volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;
  20.     for(; i < 13; i++)
  21.         p[i] = mem_cfg_val[i];
  22. }
复制代码
上面的代码是MMU那一章视频里面设置内存控制器的代码,下面是UART一章设置内存控制器的代码:
  1. void memsetup(void)
  2. {
  3.     volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;

  4.     /* 这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值
  5.      * 写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到
  6.      * SDRAM之前就可以在steppingstone中运行
  7.      */
  8.     /* 存储控制器13个寄存器的值 */
  9.     p[0] = 0x22011110;     //BWSCON
  10.     p[1] = 0x00000700;     //BANKCON0
  11.     p[2] = 0x00000700;     //BANKCON1
  12.     p[3] = 0x00000700;     //BANKCON2
  13.     p[4] = 0x00000700;     //BANKCON3  
  14.     p[5] = 0x00000700;     //BANKCON4
  15.     p[6] = 0x00000700;     //BANKCON5
  16.     p[7] = 0x00018005;     //BANKCON6
  17.     p[8] = 0x00018005;     //BANKCON7
  18.    
  19.                                             /* REFRESH,
  20.                                              * HCLK=12MHz:  0x008C07A3,
  21.                                              * HCLK=100MHz: 0x008C04F4
  22.                                              */
  23.     p[9]  = 0x008C04F4;
  24.     p[10] = 0x000000B1;     //BANKSIZE
  25.     p[11] = 0x00000030;     //MRSRB6
  26.     p[12] = 0x00000030;     //MRSRB7
  27. }
复制代码

我没想明白,为什么后者的赋值方式就可以生成位置无关的代码?前者是创建一个数组将数据存储在数组中,再通过指针向相应地址逐个赋值;后者是直接通过指针对相应地址写入数据,就是少了一个创建数组的步骤,我认为这两者都是在函数复制到SDRAM之前在steppingstone里面运行的,有什么区别吗?求教,谢谢!
回复

使用道具 举报

0

主题

14

帖子

132

积分

注册会员

Rank: 2

积分
132
发表于 2016-12-6 14:26:50 | 显示全部楼层
首先你需要了解什么是位置无关码,通过把上面两个函数反汇编出来对比,你就可以看出来了
回复 支持 反对

使用道具 举报

56

主题

5186

帖子

7811

积分

超级版主

Rank: 8Rank: 8

积分
7811
QQ
发表于 2016-12-7 15:55:49 | 显示全部楼层
第2期 第29课第2节_裸板调试之串口打印及栈初步分析_P.rar ,会讲得比较详细
thisway.diy
回复 支持 反对

使用道具 举报

14

主题

43

帖子

208

积分

中级会员

Rank: 3Rank: 3

积分
208
 楼主| 发表于 2016-12-11 13:29:18 | 显示全部楼层
tinylaker 发表于 2016-12-6 14:26
首先你需要了解什么是位置无关码,通过把上面两个函数反汇编出来对比,你就可以看出来了

好的谢谢!
回复 支持 反对

使用道具 举报

14

主题

43

帖子

208

积分

中级会员

Rank: 3Rank: 3

积分
208
 楼主| 发表于 2016-12-11 13:29:34 | 显示全部楼层
thisway.diy 发表于 2016-12-7 15:55
第2期 第29课第2节_裸板调试之串口打印及栈初步分析_P.rar ,会讲得比较详细

好的谢谢!
回复 支持 反对

使用道具 举报

技术支持
在线咨询
咨询热线
0755-86200561
微信扫一扫
获取更多资讯!

Archiver|小黑屋|百问linux嵌入式论坛     

GMT+8, 2018-11-18 14:38 , Processed in 0.209072 second(s), 21 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

快速回复 返回顶部 返回列表