打印
[ZLG-ARM]

一个分散加载的问题

[复制链接]
1941|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luowei1970|  楼主 | 2007-3-3 10:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我的分散加载文件,编译提示:No section matches pattern EmcTell.*o(RW)。
EmcTell.c文件中定义的数据无法定位。芯片是LPC2214,其它的都正常,程序也能运行,请高手指教。
ROM_LOAD1 0x0003a000
{
    ROM_DATA 0x0003a000
    {
        EmcTell.o (+RW)
    }
}
ROM_LOAD 0x0
{
    ROM_EXEC 0x00000000
    {
        Startup.o (vectors, +First)
        * (+RO)
    }
    IRAM 0x40000000
    {
        Startup.o (MyStacks)
        * (+RW,+ZI)
    }
    HEAP +0 UNINIT
    {
        Startup.o (Heap)
    }
    STACKS 0x40003fc0 UNINIT
    {
        Startup.o (Stacks)
    }
}

相关帖子

沙发
luhuaren| | 2007-3-3 11:07 | 只看该作者

RE

ROM_LOAD1 0x0003a000
{
    ROM_DATA 0x0003a000
    {
        EmcTell.o (+RW)
    }
}
请问你 EmcTell.o(+RW)这段数据怎么加载    
你的意思是把EmcTell.o 的RW段加载到0x0003a000  执行域为0x0003a000.....

使用特权

评论回复
板凳
lcyong| | 2007-3-3 11:53 | 只看该作者

顶一下,我也遇到这样问题

我也想分散加载把NVRAM.C文件中的数据存放在片外RAM 0X83000000开始的地址,编译提示的问题和LZ一样。

ROM_LOAD 0x80000000
{
    ROM_EXEC 0x80000000
    {
        Startup.o (vectors, +First)
        * (+RO)
    }


    IRAM 0x40000000
    {
        Startup.o (MyStacks)
    }

    STACKS_BOTTOM +0 UNINIT
    {
        Startup.o (StackBottom)
    }

    STACKS 0x40004000 UNINIT
    {
        Startup.o (Stacks)
    }
    

    ERAM 0x80040000
    {
        * (+RW,+ZI)
    }

    HEAP +0 UNINIT
    {
        Startup.o (Heap)
    }

    HEAP_BOTTOM 0x80080000 UNINIT
    {
        Startup.o (HeapTop)
    }

    SRAM 0x83000000 
    {
       NVRAM.o (+RW)
    }

}

ZLG的工程师给帮帮忙呀!

使用特权

评论回复
地板
zlgARM| | 2007-3-5 11:33 | 只看该作者

RE

您是想把一个数组放到内部FLASH里?方法很多,提供一个供您参考。

如何烧写到内部flash?
Startup.s里的代码,是如何被告知给连接器需烧写进FLASH的?
答:是通过分散加载机制实现的。请看下面:

    ROM_EXEC 0x00000000
    {
        Startup.o (vectors, +First)
        * (+RO)
    }

观察这段代码,我们发现,除了vectors段之外,startup.s里其它属性为只读的段也被通知烧写进内部FLASH了。

那么,现在就可以得出思路:
只要把某数组放到startup.s里的一个段里,这个段的属性为只读就可以把它烧写到内部FLASH了。

注意!这里所说的“段”、“段的属性”等概念,您只要阅读一下分散加载文件里的各个段名和属性以及startup.s里的段名和属性就清楚了。

最后的实现代码,它们都位于startup.s里。

         ……
    EXPORT    DataPT   ;声明数组的指针变量给main函数。

          AREA    array,CODE,READONLY
DataArray SPACE    100     ;留出空间供放置数组
DataPT    DCD     DataBuf1;声明指针变量用以指向数组里的元素          
DataBuf1  DCD    30,23,46,34,67;用这些值初始化数组
        ……

main函数里对该数组的使用方法如下:
volatile uint32 temp;
extern    uint32 *DataPT;
int main (void)
{
   while (1)
   {
    temp = *(DataPT+4); // 读取下标为4的数组元素
        
    }
    
    return 0;
}

由于涉及到ARM汇编指令,建议用百度搜索一下完成布衣的《ARM常用指令集及汇编》。








用百度搜索一下“宛城布衣”,找他的“常用ARM指令集及汇编”文档阅读










    

使用特权

评论回复
5
jackiezeng| | 2007-3-6 18:12 | 只看该作者

请教周工,我不用您的模板怎么才能做一个程序啊?

周工,您好!

   我购买了你的LPC2131开发板 ,用您的模板到是很容易就可以做一个实验。
我也仔细看了启动代码,部分明白。

   但是,如果我不用您给的模板,不用什么分散加载文件(因为搞不懂),只用一个简单的启动文件,一个简单的程序,点亮一个LED 呢? 

您有这样的例子 吗 ? 我只想很简单的,能编译 , 能运行的 程序。
我看您的摸板实在很难理解。

使用特权

评论回复
6
youngerger| | 2007-4-11 22:15 | 只看该作者

楼注的问题,我也考虑过

没有什么问题,只是理解问题
编译提示:No section matches pattern EmcTell.*o(RW)。
表明分散加载文件的RW为0,即你的整个工程没有RW数据。 非ZI的RW数据可以。
你可以定义一个初始化为非零的数组,然后在程序中使用一下(没有使用会被优化)。就不会RW=0;也就不会出现上述警告。

也可以修改Codewarrior的设置。如下图:
https://bbs.21ic.com/upfiles/img/20074/2007411221445986.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝