分类:
2010-02-27 09:54:27
ecos port to s3c44b0x 总结
WinMe cygwin gcc 2.95.2 ARM s3c44b0x (21ic Study Board)
Board: 2Mbytes flash (startaddress 0)
8Mbytes sdram (startaddress 0x0c000000)
second uart , first uart not use
还没有最后完成,目前还有一些问题。写此文的目的一是帮助
初学者快速入门,另外也是寻求帮助,还有就是自我总结。
所有软件都假定安装在e盘
1、cygwin
默认下载不包括GCC,要选DEVEL下的一些工具。
2、ecos2.0bl
从sources.redhat.com/ecos下载,或者从它的FTP下载。
执行Tools/Bin/Platforms.reg即可,无须安装。
为EcosConfigTool创建桌面图标,运行它。提示指定Packages
目录,也就是ECOS目录:e:\ecos-2.0b1。这也可以在菜单
Build\Repository中设置。还要设置Tools\Paths\User Tools
为e:\Cygwin\bin。
3、gcc2.95.2 Insight5.0
从sources.redhat.com/ecos下载,或者从它的FTP下载。
安装严格按照网站上说明。注意:如果你在autoexec.bat
中设置了tmp或temp等,要把它去掉,再重启动。
EcosConfigTool设置Tools\Paths\Build Tools为
E:\cygwin\tools\H-i686-pc-cygwin\bin
4、cygwin设置
cygwin中运行mount,会显示一些信息。
mount有binmode和textmode,ECOS不支持binmode,
最好把它们都改成textmode。否则ECOS编译怎么都通过不了,
到时不要说ECOS有BUG啊。
注册表中,HKEY_LOCAL_MACHINE\Software\Cygnus Solutions\Cygwin\mounts v2
可以看到MOUNT的东西都在此,将其flags从0x10改成8就可以了。
5、port s3c44b0x
4510和44b0应该是最接近的,所以从E7T改最方便。
建立packages\hal\arm\study目录
拷贝packages\hal\arm\e7t目录下的东西。
建立packages\devs\serial\arm\study目录(串口驱动,redboot不用)
拷贝packages\devs\serial\arm\e7t目录下的东西。
按照E:\ecos-2.0b1\doc\html\ref\hal-porting-platform.html
提示修改。
study目录结构如下:
cdl --------- hal_arm_study.cdl CYGNUM_HAL_ARM_study_CLOCK_SPEED
改成60000000时钟频率
include --------- pkgconf ------- 6个存储空间配置文件
hal_cache.h cache配置,少许修改
hal_diag.h 不用动
hal_platform_ints.h 中断配置,中断在寄存器中
对应的位,ADC为0,EXT0为25
hal_platform_setup.h CYGHWR_LED_MACRO灯指示,可以为空的宏
PLATFORM_SETUP1很重要,硬件初始化都在这儿
plf_io.h IO口名称,麻烦事儿
plf_stub.h 不用动
misc ---------- 需要哪些包,在此说明
src ---------- flash_cksum.tcl 不用动
hal_diag.c redboot用这些函数和GDB通讯
SIO_BRDDIV计算方式变了。
UART_LCON和4510有差异。
hal_diag_led做成空的算了
redboot_module.c 不用动
study_misc.c hal_clock_initialize,ECOS的
TICK就是用它初始化的。4510定时器32为,
44b0是16位,需要点技巧。
hal_delay_us好象REDBOOT用了一下,调试
REDBOOT时可把它屏蔽掉,第一条语句为return.
hal_IRQ_handler寻找是那一个中断。
hal_interrupt_acknowledge清I_ISPC
6、redboot
菜单Build\Templates hadeware选arm-study packages选redboot
设置ecos hal --> arm arckitecture --> arm study evalution board :
startup type : RAM/ROM 启动方式
debug serial port : 0/1 串口
console/gdb serial port baud rate : 115200 波特率
cpu clock speed : 60000000 时钟频率
real-time clock constants
----- real-time clock denominator : 100 TICK为100HZ
----- real-time clock period 自动计算
最开始调试REDBOOT,选RAM方式较好,这时可以用SDT/ADS进行调试。
hal_platform_setup.h \ PLATFORM_SETUP1 此时最好去掉下句:
#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
这样就可以RAM方式也调用PLATFORM_SETUP1进行初始化硬件了。
redboot.bin是从hal\arm\arch\v2_0b1\src\vectors.S --> reset_vector处
开始执行。可以看到LED 7 --> LED 1 将初始化分割成几段,由于是反汇编调试,
我们可以从LED ?看出执行到哪儿来了。
初始化完后会调用redboot\v2_0b1\src\main.c --> cyg_start,这时候会显示
一些信息。注意它会调用study_misc.c --> hal_delay_us函数,刚开始可以将
此函数第一条语句写成return,等redboot信息显示出来后再调试此函数。
RAM方式调试OK后,再作成ROM方式,烧到FLASH中。
7、ecos library
菜单Build\Templates hadeware选arm-study packages选default
设置ecos hal --> rom monitor support --> enable use of virtual vector table
--> Initialize whole of virtual vector = true
如果不设置它,printf会死掉,不知道为什么,它还不是默认的,我花了大半天才试出
来的。
设置ecos hal --> arm arckitecture --> arm study evalution board :
--> startup type = RAM
注意:redboot已经占用了一些RAM了,mlt_arm_study_ram.ldi中SECTION_rom_vectors
应该为0x0c100000,而不是0x0c000000,否则会和redboot冲突(自我理解)。
菜单Build\Library生成ECOS库。暂时不要用Build\Tests,太慢了。
8、application
编写一个hello程序。
编写一个编译文件。
arm-elf-gcc -g -Wl,-Map,mapfile -I/ecos-e/ecosprj/ecoslib_install/include hello.c
-L/ecos-e/ecosprj/ecoslib_install/lib -Ttarget.ld -nostdlib
说明:ecos-e其实就是e盘。
ecosprj刚才的库就放在这儿了。
ecoslib_include ecoslib_install :ecoslib是建库时的名称。
-Wl,-Map,mapfile : -Wl是传参数到linker,-Map,mapfile产生mapfile文件,可以看看
你的函数、变量对应的地址。
然后会生成a.out ELF文件,大概1M多吧。
(可以用arm-elf-objcopy -O binary a.out a.bin 转换格式,几十K而已。)
执行arm-elf-gdb -nw a.out。我的Insight不知道怎么启动不了,只好用命令行了。
set remotebaud 115200
target remote /dev/ttyS0 返回一些内容,例如:0x2ffc ??()
load 下载程序,有点慢哦。
break main 设置断点
cont 开始执行
step 可跟踪进入函数
next 逐行执行
9、tests
菜单build\tests编译一个多小时(C433),会生成一堆exe文件,但是不知为什么ECOS不认,
将一些exe文件扩展名去掉,一点一点测试吧。
tools\platforms从e7t拷贝成study
tools\run tests会提示没有编译完全,选NO不理它。慢慢测试吧
10、问题
我测试时发现有很多不能通过,大多跟时间有关,后来发现s3c44b0x有INTCON控制irq/fiq,
而4510没有,改了之后发现GDB中break main , cont,怎么也不会执行到main处,死掉了。
但是break cyg_start,cont,没有问题,然后用step一条一条执行却完全可以到main,而且
main运行没有问题。但是时间计数器依然没有记数,定时器intpnd置了位,intmsk已经清零,
但是就是没有中断发生。
哪位大虾帮帮忙吧,愿意研究ecos port to s3c44b0x的,可以向我索要测试未完全通过的
程序,只想要结果的,等解决问题之后再上传。
以上很多是自我理解,可能不对,如有错误请指出。
2003/4/15
终于成功实现了移植工作,上次留下的问题也解决了。
上次是中断出了问题,所以所有和时间方面的函数都不能通过。这主要是因为
ecos默认零地址是ram,应用程序执行时,首先执行Vectors.S,此函数将处于
ram中的中断向量改成指向自身,中断就可以正常工作了。而我的板上零地址
是FLASH,没有办法更改,才造成中断就死机。
为此将Vectors.S改动如下:
.global __exception_handlers
__exception_handlers:
ldr pc,.reset_vector // 0x00
ldr pc,.undefined_instruction // 0x04
ldr pc,.software_interrupt // 0x08
ldr pc,.abort_prefetch // 0x0C
ldr pc,.abort_data // 0x10
.word 0 // unused
// 改动
#ifdef CYG_HAL_STARTUP_RAM
ldr pc,.IRQ // 0x18
ldr pc,.FIQ // 0x1C
#else
ldr pc,=0x0c100018
ldr pc,=0x0c10001c
#endif
.global vectors
vectors:
UNMAPPED_PTR(reset_vector) // 0x20
PTR(undefined_instruction) // 0x24
PTR(software_interrupt) // 0x28
PTR(abort_prefetch) // 0x2C
PTR(abort_data) // 0x30
.word 0 // 0x34
// 改动
#ifdef CYG_HAL_STARTUP_RAM
PTR(IRQ) // 0x38
PTR(FIQ) // 0x3c
#else
.word 0x0c100038
.word 0x0c10003c
#endif
(我们假设没有RAM_ROM方式)
上面的程序有两个地方判断CYG_HAL_STARTUP_RAM。
当定义了CYG_HAL_STARTUP_ROM时,中断向量指向0x0c1000??,上次已经讲过,
Ram中的程序放在0x0c100000处。这样irq/fiq发生时,先跳到0x000000??,再
转移到0x0c1000??,就转移到了你的应用程序的向量区,中断就能正常工作了。
当定义了CYG_HAL_STARTUP_RAM时,中断向量指向自身中断服务程序。中断发
生时,已经从rom处跳到了ram区应用程序的中断向量区,现在就可以跳到中断
服务程序处了。
学习ecos我们首先要使redboot工作,redboot可以配合arm-elf-gdb调试你的
应用程序。redboot一般不使用中断,所以我们可以把它的BIN文件放到RAM中
调试,调试可以用ADS/SDT等工具,其实也就是调试vectors.S。redboot提示
信息,你输入help命令如果有反映,redboot应该就没有问题了。接下来就可
以把redboot放到rom中零地址处,这时irq/fiq指到了0x0c1000??,也就是你
的应用程序。因此有两次Build过程,第一次选RAM,第二次选ROM。第一次要
注意:
文件 hal\arm\study\v2_0b1\include\hal_platform_setup.h
#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
#define PLATFORM_SETUP1
....
只有定义ROM方式才会定义PLATFORM_SETUP1,PLATFORM_SETUP1是初始化硬件
的,此时你的ROM未必有程序初始化硬件,所以最好刚开始无论ram/rom方式
都定义PLATFORM_SETUP1。等redboot for ram调试好再改回来。
现在板上FLASH有了redboot,我们快要可以编程序用它进行调试了。不过编
程序前你得先建好库(假设命名ecoslib)。
Build\Templates选ARM Study board default,redboot在ROM中,应用程序
当然要在RAM中了。然后Build\Library,现在就可以编程序,用arm-elf-gdb
可以进行源程序调试。
你编写的hello程序如果工作正常,就可以开始完整的测试了,Build\Tests,
很长时间之后,就编译出了EXE程序,Tools\Run Tests进行测试。
vectors.S只是把irq/fiq指向了RAM,其它异常没有,所以except1和kexcept1
不能通过,我现在还没相好要不要把其它异常也指向RAM,以后再说吧。
另外就是测试时每测一个程序后出现提示确认是否复位,这时候要将板复位或
断电->上电,再按确认。其实测试完一个程序后GDB会发给一个BREAK包给
redboot,如果你建redboot时选了ecos hal\source level debugging support\
include gdb ecternal break support for stubs,这时redboot会有一个中断
程序监视串口,一接收到BREAK包就自动复位。但是现在中断指向了RAM,所以
只好手动复位了。(自我理解)