uCOS-II在S3C2440上的移植<br />作者:研一 <a href="http://www.gzweiyan.com" target=_blank>http://www.gzweiyan.com</a><br /><br />1) 下载源代码<br />下载最新的uCOS-II-V286版和Michael Anburaj基于S3C2410的1.6.1移植版。根据代码用途的,建立app,s3c2440,ucosii三个目录,分别放置应用程序,平台移植文件和uCOS的源代码。如图:<br />http://bbs.21ic.com/upfiles/img/20076/2007611152634269.gif<br />2) 新建ADS工程<br />加入所有代码,修改ARM Assembler和C Compiler的编译器类型为ARM920T。为方便调试,编译完的二进制文件由U-BOOT下载到0x31000000的内存地址,所以修改链接参数的代码地址RO Base为0x31000000。如图:<br /><br />http://bbs.21ic.com/upfiles/img/20076/2007611152653292.gif <br />3) 修改时钟频率和总线速率<br />这一部主要是修改CLKDIVN时钟分频比和MPLL总线速率,可在init.S的初始化汇编环境中设置,<br /> ldr r0,=CLKDIVN ; Set ratios 1:3:6 for FCLK:HCLK:PCLK<br /> ldr r1,=(7)<br /> str r1,[r0]<br /> [ PLL_ON_START<br /> ; Configure MPLL<br /> ldr r0,=MPLLCON <br /> ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ; Fin=12MHz,Fout=50MHz<br /> str r1,][r0]<br /> ]<br />也可在C的入口函数C_vMain中设置<br /> __vChangeClockDivider(3,1); // 1:3:6 /* already set at init.S */<br /> __vChangeMPllValue(184,2,2); // FCLK=406M<br /><br />4) 修改内核心跳<br />Michael Anburaj的移植是使用看门狗作内核心跳,但在S3C2440中,看门狗与AC97控制器共用一个中断,所以需要修改中断跳转和清中断等操作。考虑到看门狗在嵌入式的重要性,这里改用没有输出功能的时钟4作为内核心跳。修改心跳初始化函数FRMWRK_vStartTicker():<br />void FRMWRK_vStartTicker(U32 wTicksPerSec)<br />{<br /> ……<br /> OS_ENTER_CRITICAL();<br /><br /> pISR_TIMER4 = (U32)__vTimer4Interrupt;<br /><br /> tcfg1 &= ~S3C2410_TCFG1_MUX4_MASK;<br /> tcfg1 |= S3C2410_TCFG1_MUX4_DIV2;<br /><br /> tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;<br /> tcfg0 |= ((6 - 1) / 2) << S3C2410_TCFG_PRESCALER1_SHIFT;<br /><br /> tcnt = (PCLK / 6) / wTicksPerSec;<br />……<br /> tcon &= ~(7<<20);<br /> tcon |= S3C2410_TCON_T4RELOAD;<br /> tcon |= S3C2410_TCON_T4MANUALUPD;<br /> rTCON = tcon;<br /> rTCNTB4 = tcnt;<br /><br /> tcon |= S3C2410_TCON_T4START;<br /> tcon &= ~S3C2410_TCON_T4MANUALUPD;<br /> rTCON = tcon;<br /> <br /> BIT_CLR(rINTMSK, BIT_TIMER4);<br /> OS_EXIT_CRITICAL();<br />}<br /><br />5) 修改U-BOOT的中断跳转<br />利用U-BOOT已有的丰富功能,如烧写,网络,脚本等,可在没有仿真器的情况下大大减少调试的时间。<br />如果直接下载ucos,一挑战到0x31000000的内存地址,会出现如下的中断信息:<br />interrupt request<br />pc : [<3100ab28>] lr : [<e7fffff7>]<br />sp : 7fbfdfb7 ip : ffffdd7e fp : 33d78a49<br />r10: 33d78931 r9 : 51000000 r8 : 80000013<br />r7 : 00000200 r6 : 00000000 r5 : 00500000 r4 : 0000dc7e<br />r3 : fefefeff r2 : 00000000 r1 : ffffbfff r0 : 80000013<br />Flags: Nzcv IRQs on FIQs on Mode SVC_32<br />Resetting CPU ...<br />原因是U-BOOT的初始化代码接管了中断管理,看U-BOOT的反汇编:<br />.globl _start<br />_start: b start_code<br />33f80000: ea000014 b 33f80058 <start_code><br /> ldr pc, _undefined_instruction<br />33f80004: e59ff014 ldr pc, [pc, #20] ; 33f80020 <_undefined_instruction><br /> ldr pc, _software_interrupt<br />33f80008: e59ff014 ldr pc, [pc, #20] ; 33f80024 <_software_interrupt><br />…….<br /> ldr pc, _irq<br />33f80018: e59ff014 ldr pc, [pc, #20] ; 33f80034 <_irq><br />…….<br />33f80020 <_undefined_instruction>:<br />33f80020: 33f80240 mvnccs r0, #4 ; 0x4<br />33f80024 <_software_interrupt>:<br />33f80024: 33f802a0 mvnccs r0, #10 ; 0xa<br />…….<br />33f80034 <_irq>:<br />33f80034: 33f80420 mvnccs r0, #536870912 ; 0x20000000<br />IRQ的中断入口为偏移0x34的33f80420。OK,在C_vMain入口处加一句:<br />(*(unsigned *)(0x34)) = (U32)UCOS_IRQHandler;<br /><br />6) 系统测试<br />添加一个应用程序ex3.c,建立两个子任务,分别不停的打印0和1。主任务每隔1秒打印系统的使用率。运行情况如下:<br />UCOS_FRAMEWORK Ver 1.15 for S3C2440 (ARM920T from Samsung) :05/03/05<br />Built using ADS on Apr 26 2008 <10:31:35><br />Endian: LITTLE<br />Processor operating state: ARM<br />Task start state: ARM<br />CONSOL: COM0, 115200bps, 8Bit, NP<br />CPU Clk: 406MHz MMU: ON Cache: ON Write Buf: ON<br />FLASH_SADDR:00000000h SRAM_SADDR:40000000h SRAM_EADDR:40000fffh<br />SDRAM_SADDR:30000000h SFR_BADDR :48000000h ISR_BADDR :33ffff00h<br />Free RAM: 3100edd8h ~ 33ffa7ffh<br />Developed by Michael Anburaj, http://geocities.com/michaelanburaj/<br /><br />Ported by WEIYAN TECHNOLOGY, http://www.gzweiyan.com/<br />Ver 0.1 08/04/26<br /><br />timer tcon=00500000, tcnt dc7e, tcfg 00000200,00000000<br />uC/OS-II, The Real-Time Kernel ARM Ported version<br />Jean J. Labrosse/ (Ported by) Michael Anburaj<br />WEIYAN TECHNOLOGY http://www.gzweiyan.com<br />Task1 #1<br /><-PRESS 'ESC' TO QUIT-><br />5 0 5 //正在运行的的任务数 当前的cpu使用率 每秒任务切换的次数<br />01010101010101010101010101010101010101010101010101010101010101010101010101010101 5 1 141<br />01010101010101010101010101010101010101010101010101010101010101010101010101010101 5 1 141<br />01010101010101010101010101010101010101010101010101010101010101010101010101010101 5 1 141<br />01010101010101010101010101010101010101010101010101010101010101010101010101010101 5 1 141<br /><br />7) 移植小结<br />这次移植的难点在U-BOOT的中断接管,修改完内核心跳后,内核一运行就自动重启。后来细看输出信息interrupt request才发现这不是ucos输出的,IRQ中断仍由U-BOOT管理。找到问题的原因,解决方法就好办了。可以直接在U-BOOT里通过mw来修改,也可以由ucos来修改。<br /><br />如果各位朋友在移植过程中遇到什么问题,可联系我们免费索取该移植包。<br /><br />伟研科技 专注于Linux系统移植及应用开发 <a href="http://www.gzweiyan.com" target=_blank>http://www.gzweiyan.com</a> |
|