ARM中C语言实现位置无关的问题!

roamer888 2011-10-07 09:26:47
在U-boot的start.S文件中,调用了一个初始化函数(关于时钟的),它是用C语言写的,而且比较复杂。Start.S的代码需要是位置无关的,但是这是时钟初始化函数怎么保证也是位置无关的???

目前,这个函数内部还有三层函数调用。当上电后,感觉运行到这个函数就回不来了(串口没有打印)。当我把这个时钟初始化函数内部的函数调用注释掉而没有内部的函数调用,则可以继续往下走。

各位有没有遇到类似的问题,请帮忙给点意见,非常感谢
...全文
321 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
roamer888 2011-10-14
  • 打赏
  • 举报
回复
回复楼上的大侠,上面的代码就是复位后开始执行的代码(通过位置0的跳转指令跳到这里),一切初始化也从这里开始。
函数cpu_init_crit是disable MMU和cache功能,函数 init_clocks就是用C语言实现的时钟初始化。

后来我在Keil中调试了一下,这个函数可以正常返回(堆栈虽然小了点,但是没有出错),应该设置有点问题。

谢谢大家的关注
JuanA1 2011-10-13
  • 打赏
  • 举报
回复
你贴上面这段代码有什么用?要看你那段函数的代码,应该是有与位置有关的代码,或者是申请了一个大的堆栈,注意,现在还是在flash中运行的,才会与位置无关
yosyg 2011-10-09
  • 打赏
  • 举报
回复
可能是配置出现了错误
bluesea87 2011-10-09
  • 打赏
  • 举报
回复
这里确实要位置无关的,因为这里还是运行在flash中(若从flash中引导的)。
确实要写代码的人去保证位置无关了
roamer888 2011-10-08
  • 打赏
  • 举报
回复
我用的器件是NXP的LPC3130,ARM926EJS,这段代码是NXP提供的,据说能在他们的评估板跑

1)这是时钟初始化包括对各个接口的复位,频率设置,蛮复杂的。

2)因为是C语言的函数调用,肯定需要堆栈,而且也有SP设置
ldr r0, ISRAM_SRC_ADDR
sub sp, r0, #12 /* leave 3 words for abort-stack */
bic sp, r0, #7 /* 8-byte align stack for ABI compliance */

3)init_clocks 在这个位置调用,需要位置无关吧??
roamer888 2011-10-08
  • 打赏
  • 举报
回复
非常感谢各位的关注,下面是这段代码:
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
_reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0

/*
* we do sys-critical inits only at reboot,
* not when booting from ram!
*/
bl cpu_init_crit

/* Set up the stack which is in Internal RAM - Temporary */
ldr r0, ISRAM_SRC_ADDR
sub sp, r0, #12 /* leave 3 words for abort-stack */
bic sp, r0, #7 /* 8-byte align stack for ABI compliance */

/*
* Go setup Memory and board specific bits prior to relocation.
*/
adr r0, CGU_FDIV_REG_VALS
adr r1, CGU_FDIV_CLKS
bl init_clocks /* go setup pll,mux,memory */ //就是这个时钟初始化函数
#ifdef CONFIG_EA3152
/*
* For LPC3152 board, set IO valtage for
* SDRAM to work properly
*/
bl setup_sdram_voltage
#endif
/*
* Setup Memory Controller & SDRAM Timing.
*/
bl mpmc_sdram_init /* go setup pll,mux,memory */

/*
* Write a code to copy initial boot code from
* ISRAM (0x11029000) to SDRAM
*/
ldr r0, ISRAM_SRC_ADDR /* r0 <- ISRAM source address */
add r1, r0, #0x00000020 /* r1 <- point to Image Size in Image Headr, 0x11029020 */
ldr r2, [r1] /* r2 <- length to copy */
add r2, r0, r2 /* r2 <- source end address */
ldr r1, _TEXT_BASE

copy_data:
ldmia r0!, {r7-r10} /* copy from source address [r0] */
stmia r1!, {r7-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_data

/* Set up the stack which is in SDRAM - Parmenant */
stack_setup:
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
ezword 2011-10-08
  • 打赏
  • 举报
回复
这个问题的关键在于你这个函数调用时,是否需要使用到堆栈,如果不需要,那么没什么关系。
如果需要应该考虑在堆栈建立后再调用这个函数。
bluesea87 2011-10-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 roamer888 的回复:]
在U-boot的start.S文件中,调用了一个初始化函数(关于时钟的),它是用C语言写的,而且比较复杂。Start.S的代码需要是位置无关的,但是这是时钟初始化函数怎么保证也是位置无关的???

目前,这个函数内部还有三层函数调用。当上电后,感觉运行到这个函数就回不来了(串口没有打印)。当我把这个时钟初始化函数内部的函数调用注释掉而没有内部的函数调用,则可以继续往下走。

各位有没有遇到……
[/Quote]时钟初始化函数不需要位置无关
Vincent_Song 2011-10-08
  • 打赏
  • 举报
回复
你是在执行完uboot基本的初始化之后调用的还是先调用的?如果是先调用的肯定回不来了,你没有关看门狗,会不断重启。
ezword 2011-10-08
  • 打赏
  • 举报
回复
个人认为,不需要位置无关,但若接口操作中包括DDR的操作可能会有影响。
另外传递参数时使用的可能是通用寄存器,这样即使没有栈也是可以的。


运行不了的原因可能是配置出现了错误。

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧