Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112037
  • 博文数量: 41
  • 博客积分: 2132
  • 博客等级: 大尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-16 16:08
文章分类

全部博文(41)

文章存档

2012年(5)

2011年(3)

2010年(20)

2009年(13)

我的朋友

分类:

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,所以
只好手动复位了。(自我理解)

阅读(775) | 评论(0) | 转发(0) |
0

上一篇:测试标准

下一篇:eCos调用用户程序方法

给主人留下些什么吧!~~