ARM sp栈 设置

2019-07-16 09:18发布

菜鸟入门 问大侠几个问题行吗,谢谢:
TQ2440 norflash 2M nand 256M
实现的是程序下载到nor 再copy4K到SDRAM 并在SDRAM中运行 串口打印出字符串
main函数很简单 一个点灯测试的,几个打印输出的,其中串口设置都没什么问题,可以正常跑
head.s如下:
.extern     main
.text
.global _start
_start:
Reset:                  
    ldr sp, =4096           @ 设置栈指针,
    bl  disable_watch_dog   @ 关闭WATCHDOG
    bl  clock_init          @ 设置MPLL,200M
    bl  memsetup            @ 设置存储控制器
    bl  copy_steppingstone_to_sdram @ 复制代码
    bl        on_sdram                   @ 跳到SDRAM中
on_sdram:
    ldr sp, =0x34000000     @ 设置栈指针
    ldr lr, =halt_loop      @ 设置返回地址
    bl  main           @ 调用main函数
halt_loop:
    b   halt_loop

问题:   
(1)bin文件是9k,可copy的只有4K啊 为什么能正常运行?(难道后面的部分编译连接的是没有调用的函数)
(2)sp栈指针地址怎么设置的 按说是设置地址最高值,在norflash中跑,设的4096,但程序大于4K啊,不会冲突吗?
          结果显示 4096,0x100000(1M),0x200000(nor总共才2M) ,0x200055都没错,为什么?
(3)当把bl memsetup 到ldr sp,=0x34000000 5行都去掉 让其直接在nor运行,为什么点灯正常 打印乱码?
          (难道nor中运行的速度对串口时序有影响)

网上搜了很长时间,实在是不知道,希望大侠们教教,我不甚感激!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
woodmice
1楼-- · 2019-07-16 14:55
本帖最后由 woodmice 于 2014-3-22 21:13 编辑

1. 文件扩展名是bin,内容不一定是bin的,万一他是INTEL HEX格式呢?用记事本打开看下!?或者是其他的编码格式呢?
2. SP不应设置指向norflash, norflash只适用于按编程步骤写和随机读,不能满足堆栈随机读写的特性;
    on_sdram前,主程序调用的都是系统设置程序,并且实际上没有使用堆栈来保存数据,所以不管SP设置成什么,程序都会正确运行;
3. ‘把bl memsetup 到ldr sp,=0x34000000 5行都去掉 让其直接在nor运行’,和第二条中后面的说法一样,在on_sdram后面,调用main,开始使用C函数,而C函数传递参数、定义局部变量等操作都需要耗费大量堆栈空间;
   此时程序在NORFLASH中运行,只要不是使用涉及堆栈空间的变量,就不会出问题,比如‘点灯’;
   而使用堆栈空间的地方就会出问题,比如printf;因为写堆栈时相当于写flash,而写flash是需要特殊时序的,所以写堆栈是无效的,还是flash中原来的内容;

评分

参与人数 1 +5 积分 +5 收起 理由 1563661808 + 5 + 5 讲解很详细,多谢分享。

查看全部评分

一周热门 更多>