菜鸟入门 问大侠几个问题行吗,谢谢:
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. 文件扩展名是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中原来的内容;
评分
查看全部评分
一周热门 更多>