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. 需要修改什么参数么? ucos 可以在任意address上run C库 用户代码
__main <-----2------- 复位处理程序<---1----映像入口点
| .初始化各种模式的堆栈指针
| .配置MMU或者其他的相关的外设(基本是和存储器等访问相关的)
3 .Cache等
|
|
_scatterload
.复制代码和数据
|
|
4
|
__rt_entry __user_initial_stackheap
.初始化库函数 ----5----> .建立应用程序的堆和栈
.调用顶级构造函数(C++)--6--> $Sub$$main ---+
------------------- .启用缓存和中断 |
7
.退出 <--------8------ main <------------------+ 首先谢谢 usecool的回复.
我在Main()
{
直接跳到0x30000
}
同你
LDR PC init_entry
...
...
init_entry DCD 0x30000
效果应该一样?
这种方法我在没有操作系统的前后台系统用来操作SD卡,可以!
就是加上系统就不行了?
在有操作系统的前提下怎么做才可以呢? 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 看来不用BOOTLOAD是实现不了了 问这个问题的时候,不晓得你有没有想过看贴的人能否看懂你的问题?因为:
没有具体环境,没有部工作的特征描述/分析,别人怎么回复你?
试想一下你是看贴的人,你能看懂问题么?有足够信息量来解决问题么? 顶起来,现在遇到和楼主一样的问题
还在郁闷中!! 不需要修改什么参数。当然前提是程序里没有指定什么必须的参数。
如果移植程序里指定了什么地址,那就不是ucOS本身能处理的了。
话说,你给的信息太少了。导致不能正确运行的原因很多……谁知道你撞上哪个了呢。
页:
[1]