ARM如何读写Flash
没有问题。 你说呢?
29.
CheckFlash
MOV a2,#0x90
ADD a2,a2,#0x900000
MOV a1,#0
STR a2,[a1,#0]
如果在flash中执行,那么这一句之后,程序代码就读不到了,也就是程序飞掉了.
MOV a2,#0
ADD a3,pc,#L000198-.-8
B LCDDrawStr
L000198
DCB "Unkn"
DCB "ow F"
DCB "LASH"
DCB " DEV"
DCB "ICE\0"
如果你的LCD显示是正常的.你试试在这段程序开头的地方把PC的值显示出来,看看是不是在flash中运行.
30.
MID = *addr;
if( MID == 0x00B000B0 )
{
你在这里用串口先显示一下PC的值,看他是在Flash还是
sdram里面,最好然后延时一会,看看效果
//display Manufacture ID
我怀疑调用你的显示函数时候,回到Flash里面去了,如果可以,
在你的显示函数里面,也从串口输出PC的值,看看是在flash
还是sdram里面
}
31.
我不知道你的编译器,不过象gcc的,c的函数名通常在汇编中看到的是加前缀_的c函数名. 象Move_Program的c函数,在汇编中是看不到的。在gcc中是在Move_Program前加asmlinkage。
32.
我调试过,我用LCD显示出PC. 请看:
在这个语句"*addr = 0x00900090" 之前, PC都正常。显示结果为SRAM里面的地址(0x60000278), 但是如果一执行这个语句之后,PC 无法显示出来了(就是我调用了显示函数,但没有显示)。但是好像又能跑!因为LED在闪烁。(注意在这条语句之后,我加了LED 闪烁功能,以证明程序在跑 ) 很奇怪。
33.
那就是你的显示函数有问题啦,不是程序跑飞了。
你再仔细查查看具体的错误出现在什么位置上吧。
你不是有指示灯吗,在显示函数的入口处加入PC的检查代码,看看PC是在什么范围,比如,在sram就熄灭指示灯,在flash中就点亮指示灯。
34.
谢谢各位! 我明白了。 哈哈~~~~~~~
原来是那些全局变量(字库)的地址还没有变。怪不得,在我写0x00000000之前,程序仍然访问的是Flash里面的ROM DATA. 然后在写0x00000000后, 此时Flash的读写状态发生变化,可是程序仍然要访问Flash里面的ROM DATA. 这个时候问题就出来了。因为这个时候Flash可能无法正确读出ROM DATA. 所以LCD Driver无法正确拿到字库,因此无法正确显示。因此可能作如下修改就可以拉:
LCD Driver在使用绝对地址(就是 0x60000000 + 偏移 )
但是这样的话如果全局变量很多的话,或者有静态变量的话,就非常麻烦了。 有什么办法解决吗??
有劳各位了。 真的非常感谢各位。 给了很多提示和启发。
再次谢谢。 :-)
35.
但是这样的话如果全局变量很多的话,或者有静态变量的话,就非常麻烦了。 有什么办法解决吗??
可以用PIC,也就是动态连接库使用的技术,我记得ppcboot用这种方法实现从Flash搬到RAM后,只要作简单的修补(Fixup),就可以在RAM中执行。
更简单的方法是把全局变量放到一个结构中,程序移动后调整结构指针就可以了。
36.
1.尽量用局部变量。
2.改写ld的参数(一般在makefile中,或者有一个单独的ldscript),把代码的起始地址改成你将要把它复制过去的那个sram中的地址。
37.
OK. Very good.
我测试过了。可以改 -ro-base xxxxxx。
成功。
ARM读写Flas 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)