stdlf
分类:
2010-03-17 22:08:55
9、如何编写代码在flash中,变量在ram中的链接脚本。
问:在一个项目中,我们的系统(1M Flash, 128K Ram, uc/osII)需要在Flash中执行。但是连接脚本总不正确,请问因该如何编写才能实现代码和常数在flash中,变量在ram中的目的?
答:参照如下编写链接脚本文件,其中0地址为flash,0x0C000000为SDRAM。
SECTIONS
{
. = 0x000000;
.text : { *(.text) }
Image_RO_Base = .;
.rodata : { *(.rodata) }
Image_RO_Limit = .;
. = 0x0c000000;
Image_RW_Base = .;
.data : { *(.data) }
Image_RW_Limit = .;
Image_ZI_Base = .;
.bss : { *(.bss) }
Image_ZI_Limit = .;
__bss_start__ = .;
__bss_end__ = .;
__EH_FRAME_BEGIN__ = .;
__EH_FRAME_END__ = .;
PROVIDE (__stack = .);
end = .;
_end = .;
.debug_info 0 : { *(.debug_info) }
.debug_line 0 : { *(.debug_line) }
.debug_abbrev 0 : { *(.debug_abbrev)}
.debug_frame 0 : { *(.debug_frame) }
}
问:曾经试过,但这样编译后进行elf2bin会产生一个192M大的bin文件。bin文件包含 0x00000000到0x0c000000+sizeof(.text)+sizeof(.data)+sizeof(.bss) 范围的全部内存映射。
答:在DOS命令行下使用如下批处理制作binary文件
arm-elf-objcopy -O binary --remove-section=.data bootloader.elf bootloader.code
arm-elf-objcopy -O binary --only-section=.data bootloader.elf bootloader.date
copy bootloader.code /b + bootloader.date /b bootloader.bin
rem del bootloader.code
rem del bootloader.date
10、EB44B0 LCD显示函数PutPixelColor
问:
正在用eb44b0的板来实现把视频流数据转换为能在屏上显示的格式。在看你们的程序的过程中,遇到一些不太明白的地方,希望您能帮助解答:
void _PutPixelColor(U32 x,U32 y,U8 c)
{
if(x
| ( (c)<<((4-1-((x)%4))*8) );
}
答:
显示采取填写显示缓冲区的方式,显示器上一个点在显示缓冲区中用一个字节表示,显示缓冲区由frameBuffer256定义,frameBuffer256为一个int型的数组,一个int型是四个字节,其两维分别表示屏上一行、一列,因此填写缓冲区对于(x,y)坐标点就是填写frameBuffer256[(y)][(x)/4]的数据,因为是int型所以要除以4,而且在填写缓冲区时只能填写其相应的字节,不能影响其它位,对应在其中的位就是从高位到低位数第x%4(第几个像素点)位,%位取余。具体操作时先将该位清零,|以前就是做这个动作,|以后才是赋值,注意加了4-1是从低位到高位的原因。
11、EB44B0超级终端设置问题
问:44B0板在2000的超级终端下可以看到bootloader的界面,但是选择时按键没有响应,是怎么回事。谢谢!用MTTTY时可以响应按键,另外在Linux下用minicom也存在这个问题。
答:这是由于设置了硬件流控造成的,请在相关设置中将硬件流控设置为无。
12、有关romstart.s 中的几个问题想问一下版主
问:
1、romstart.s 中有个main符号,用在 BL main 和ldr pc,=main
但是main在romstart.s 中未定义,也没有象Image_ZI_Base一样
.extern Image_ZI_Base
不知是如何引用的?
2、main符号地址是0x0c701348,指向bootloader.c的Main函数,可为何ldr pc,=main它却跳转到UserProg_Start函数
3、请问在将code从flash copy 到RAM以后,是如何设置使下次复位时从ram里开始程序呢?
4、我看到ramstart.s中有各个异常的跳转,如HandlerFIQ等,可romstart.s中却没有,
那么ramstart.s和romstart.s到底有何不同,我要将bootload重新写进flash的话,用哪一个呢?
答:
1、 main定义在c语言中,在bootloader中就是bootloader.c
2、
2、 不是设置下一次复位从ram运行,而是紧接着下一条,ldr pc, =startram指令跳转到ram执行
3、 要烧写进flash,请使用romstart.s文件,ramstart.s为调试时使用的,用它编译的程序必须使用调试器下载或者由bootloader加载
问:
1、romstart.s中的main没有用.extern main定义,难道可以直接引用?
2、"main符号地址是0x0c701348,指向bootloader.c的Main函数,可为何ldr pc,=main它却跳转到UserProg_Start函数",这句的意思是说我现在调试bootloader工程,用的是romstart.s文件,可执行到最后一句ldr pc,=main时,却跳到bootloader.c的UserProg_Start()函数里,而不是跳转到main()里,是何原因呢?
答:
1、可以,可能会有一些warnning吧
2、因为你在romstart.s文件中有一段拷贝代码,将代码从flash拷贝到sdram中,因此,拷贝完成后实际上运行的还是从flash中拷贝上来的代码,而不是你下载调试的代码,此时自然和你程序走得路线会有差别,不知这样说清楚没有。在调试的时候请将romstart.s换成ramstart.s,然后编译、调试
问:
按版主的说法,我理解是:一开始是从flash中远行程序,romstart.s文件将代码从flash拷贝到sdram后,用ldr pc, =startram指令跳转到ram执行
这样就有个问题是:我由ADT1000 TOOLs里的get symbols得到的Bootloader_sym.txt文件中得到ResetHandler =0c700020,startram=0c700228
如果说因为startram=0c700228使得指令跳转到RAM的话,那么选用romstart.s文件将bootloader代码烧写入flash0x0000地址之后,复位时从0x000000开始,此时第一句代码是 B ResetHandler
而ResetHandler =0c700020,是在RAM区域内,难道说从这里就开始跳转了?不知这是怎么回事,
答:
这就是相对跳转和绝对跳转,建议看一下b以及ldr的语法。
b 指令是相对跳转指令,它以偏移作跳转,也就是他会跳转到其后0x0c7000228-0x0c700020位置处,而不会直接跳转到sdram。但是如果使用ldr pc, =xxx的话就是绝对跳转。
13、有关串口超级终端设置产生的问题
问:
我用IDE上的flash program 写bootload.bin,用的bin文件是光盘自带的,flash program的设置如FAQ一般设置。可写完,加电之后,在MTTY串口程序中不断的有bootload的启动信息提示,但是其中有些字符是错的,如有一行:
*[Block 5] ramdisk -----0x 只写到0x就结束了,如此等待,就是说有启动信息,但是不全或有错字,而且这个启动信息不断出现。
该如何解决?
答:
串口设置有没有问题呀,正常情况下如果串口没有输入是不会动作的。请注意将硬件流控关闭