gcc312628 发表于 2009-1-5 16:56:00

uc/os为什么不可以在任意地址运行?【恢复】

我现在在做BOOT 发现ucos在连接参数为



LR_IROM1 0x00000000 0x00080000  {    ; load region size_region

  ER_IROM1 0x00000000 0x00080000  {  ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

   .ANY (+RO)

  }

  RW_IRAM1 0x40000000 0x00008000  {  ; RW data

   .ANY (+RW +ZI)

  }

}



编译下载,此时下载开始地址为0x00000000

可以正常工作,



现在修改连接参数,代码程序不变

LR_IROM1 0x00030000 0x00080000  {    ; load region size_region

  ER_IROM1 0x00030000 0x00080000  {  ; load address = execution address

   *.o (RESET, +First)

   *(InRoot$$Sections)

   .ANY (+RO)

  }

  RW_IRAM1 0x40000000 0x00008000  {  ; RW data

   .ANY (+RW +ZI)

  }

}

编译下载,此时下载开始地址为0x00030000



就不工作了.请高手指点一下!!!!!!!!!!



谢谢!



我用的平台是MCB2300  开发工具是KEILV3.6  



我的主要目的是让US/OS运行在任意的FLASH地址,这其中除了修改连接参数文件还需要做哪方面的工作???





本贴被 gcc312628 编辑过,最后修改时间:2009-01-06,08:43:09.

gcc312628 发表于 2009-1-22 08:49:52

需要修改什么参数么?

luzhengmao 发表于 2009-1-15 01:24:34

ucos 可以在任意address上run

usecool 发表于 2009-1-12 09:09:57

        C库                    用户代码



__main       <-----2-------    复位处理程序<---1----映像入口点

   |                              .初始化各种模式的堆栈指针

   |                              .配置MMU或者其他的相关的外设(基本是和存储器等访问相关的)

   3                              .Cache等

   |

   |

_scatterload

    .复制代码和数据

   |

   |

   4

   |

__rt_entry                        __user_initial_stackheap

    .初始化库函数     ----5---->      .建立应用程序的堆和栈



    .调用顶级构造函数(C++)--6-->  $Sub$$main            ---+

   -------------------                .启用缓存和中断      |

                                                           7

    .退出       <--------8------  main  <------------------+

gcc312628 发表于 2009-1-11 16:25:50

首先谢谢 usecool的回复.

我在Main()

{

 直接跳到0x30000 



}

同你

LDR PC init_entry 

... 

... 



init_entry DCD  0x30000 

效果应该一样? 

这种方法我在没有操作系统的前后台系统用来操作SD卡,可以!

就是加上系统就不行了?

在有操作系统的前提下怎么做才可以呢?

usecool 发表于 2009-1-10 21:42:10

cpu启动时候必须从0x0取得启动的跳转地址,那么就是一定要在对应的地址有合适的代码的。



另外一个是,某些的cpu没有内部flash,或者是flash地址不是从0x0开始的,比如lpc2290的,外部就是从0x80000000开始的,cpu会自动设置pc到对应的地址的。



ER_IROM1 0x00030000 0x00080000 这样的设置就是把应该在0x0的代码修改到0x30000了,那么cpu从0x0得不到合适的代码,当然就不能正常运行了。



如果坚持这样,那么只要让0x0的代码是跳转到0x30000就可以了(很小的一个bootloader)。



LDR PC init_entry

...

...



init_entry DCD  0x30000

gcc312628 发表于 2009-1-9 15:08:57

看来不用BOOTLOAD是实现不了了

liandao 发表于 2009-1-5 17:09:53

问这个问题的时候,不晓得你有没有想过看贴的人能否看懂你的问题?因为:

没有具体环境,没有部工作的特征描述/分析,别人怎么回复你?

试想一下你是看贴的人,你能看懂问题么?有足够信息量来解决问题么?

mymach 发表于 2009-3-27 17:33:48

顶起来,现在遇到和楼主一样的问题
还在郁闷中!!

dr2001 发表于 2009-3-27 17:40:25

不需要修改什么参数。当然前提是程序里没有指定什么必须的参数。
如果移植程序里指定了什么地址,那就不是ucOS本身能处理的了。

话说,你给的信息太少了。导致不能正确运行的原因很多……谁知道你撞上哪个了呢。
页: [1]
查看完整版本: uc/os为什么不可以在任意地址运行?【恢复】