4074|7

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

怪了,是我理解有误吗?请大侠们帮我确认一下 [复制链接]

还是老话题,bootload,嘿嘿

RO(包括只读的code和数据啦)在init.S中我知道过程了

但是为什么我怎么没有找到RW的copy过程,这个肯定是需要的吧。

因为这个RW连同RO生成个bin文件都被放到nand中,没有对于RW的复制,怎么运行程序。
(虽然我在分散加载文件里已经写了RW的定位地址,比如0x30000000,但是实际上它没有copy过来?)

我的说法对吗?

最新回复

系统在启动过程中复制的4K代码其中包括RW的数据,所以你的定位在30000000地址是不行的,因为系统启动的时候30000000地址还不可用,要当RAM初始化之后才能正确访问这个地址。 所以对于启动代码,RW跟在RO后就可以了。  详情 回复 发表于 2010-1-22 15:38
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size)
  2. {
  3.         unsigned int *pdwDest;
  4.         unsigned int *pdwSrc;
  5.         int i;

  6.         if (bBootFrmNORFlash())
  7.         {
  8.                 pdwDest = (unsigned int *)buf;
  9.                 pdwSrc  = (unsigned int *)start_addr;
  10.                 /* 浠?NOR Flash鍚?姩 */
  11.                 for (i = 0; i < size / 4; i++)
  12.                 {
  13.                         pdwDest[i] = pdwSrc[i];
  14.                 }
  15.                 return 0;
  16.         }
  17.         else
  18.         {
  19.                 /* 鍒濆?鍖朜AND Flash */
  20.                 nand_init_ll();

  21.                 /* 浠?NAND Flash鍚?姩 */
  22.                 if (NF_ReadID() == 0x76 )
  23.                         nand_read_ll(buf, start_addr, (size + NAND_BLOCK_MASK)&~(NAND_BLOCK_MASK));
  24.                 else
  25.                         nand_read_ll_lp(buf, start_addr, (size + NAND_BLOCK_MASK_LP)&~(NAND_BLOCK_MASK_LP));
  26.                 return 0;
  27.         }
  28. }

复制代码


这是copy 过程,供参考
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 wxdcxp 的回复:
C/C++ codeint CopyCode2Ram(unsignedlong start_addr, unsignedchar*buf,int size)
{
    unsignedint*pdwDest;
    unsignedint*pdwSrc;int i;if (bBootFrmNORFlash())
    {
        pdwDest= (unsignedint*)buf;
        pdwSrc= (unsignedint*)start_addr;/* 浠?NOR Flash鍚?姩*/for (i=0; i< size/4; i++)
        {
            pdwDest= pdwSrc;
        }return0;
    }else
    {/* 鍒濆?鍖朜AND Flash*/
        nand_init_ll();/* 浠?NAND Flash鍚?姩*/if (NF_ReadID()==0x76 )
            nand_read_ll(buf, start_addr, (size+ NAND_BLOCK_MASK)&~(NAND_BLOCK_MASK));else
            nand_read_ll_lp(buf, start_addr, (size+ NAND_BLOCK_MASK_LP)&~(NAND_BLOCK_MASK_LP));return0;
    }
}

这是copy 过程,供参考

谢谢ls,不过我想问的不是代码,而是我的思路是否对。。。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
不对,RW段肯定要拷贝到内存。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

6
 
当然需要拷贝了。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
嵌入式系统中,现在的做法一般都是把代码放在Nand Flash中,现在的CPU都支持从NAND Flash启动。一般来说,系统上点时,CPU会自动读取Nand Flash前面一点内容,大概2KB或者4KB,要看具体的芯片。比如I.MX31是自动读取2KB,三星的大多是读取4KB。
CPU读取这2KB或者4KB代码到CPU内置的RAM中,或者内部寄存器Buffer中,然后开始执行。
我们要做的就是在这2KB(或4KB)代码中初始化外部RAM,然后操作Nand Flash,将更多的代码从Nand Flash读出来到外部RAM中。这就是BootLoad的作用。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

8
 
系统在启动过程中复制的4K代码其中包括RW的数据,所以你的定位在30000000地址是不行的,因为系统启动的时候30000000地址还不可用,要当RAM初始化之后才能正确访问这个地址。
所以对于启动代码,RW跟在RO后就可以了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表