打印

uCOS-II在S3C2440上的移植(免费索取源代码)

[复制链接]
3632|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gzweiyan|  楼主 | 2008-4-26 14:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
uCOS-II在S3C2440上的移植
作者:研一 http://www.gzweiyan.com

1)    下载源代码
下载最新的uCOS-II-V286版和Michael Anburaj基于S3C2410的1.6.1移植版。根据代码用途的,建立app,s3c2440,ucosii三个目录,分别放置应用程序,平台移植文件和uCOS的源代码。如图:
https://bbs.21ic.com/upfiles/img/20076/2007611152634269.gif
2)    新建ADS工程
加入所有代码,修改ARM Assembler和C Compiler的编译器类型为ARM920T。为方便调试,编译完的二进制文件由U-BOOT下载到0x31000000的内存地址,所以修改链接参数的代码地址RO Base为0x31000000。如图:

https://bbs.21ic.com/upfiles/img/20076/2007611152653292.gif 
3)    修改时钟频率和总线速率
这一部主要是修改CLKDIVN时钟分频比和MPLL总线速率,可在init.S的初始化汇编环境中设置,
        ldr     r0,=CLKDIVN     ; Set ratios 1:3:6 for FCLK:HCLK:PCLK
        ldr     r1,=(7)
        str     r1,[r0]
        [ PLL_ON_START
            ; Configure MPLL
            ldr    r0,=MPLLCON          
            ldr    r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV)  ; Fin=12MHz,Fout=50MHz
            str    r1,][r0]
        ]
也可在C的入口函数C_vMain中设置
        __vChangeClockDivider(3,1);            // 1:3:6       /* already set at init.S */
        __vChangeMPllValue(184,2,2);            // FCLK=406M

4)    修改内核心跳
Michael Anburaj的移植是使用看门狗作内核心跳,但在S3C2440中,看门狗与AC97控制器共用一个中断,所以需要修改中断跳转和清中断等操作。考虑到看门狗在嵌入式的重要性,这里改用没有输出功能的时钟4作为内核心跳。修改心跳初始化函数FRMWRK_vStartTicker():
void FRMWRK_vStartTicker(U32 wTicksPerSec)
{
              ……
        OS_ENTER_CRITICAL();

              pISR_TIMER4 = (U32)__vTimer4Interrupt;

        tcfg1 &= ~S3C2410_TCFG1_MUX4_MASK;
        tcfg1 |= S3C2410_TCFG1_MUX4_DIV2;

        tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
        tcfg0 |= ((6 - 1) / 2) << S3C2410_TCFG_PRESCALER1_SHIFT;

        tcnt = (PCLK / 6) / wTicksPerSec;
……
        tcon &= ~(7<<20);
        tcon |= S3C2410_TCON_T4RELOAD;
        tcon |= S3C2410_TCON_T4MANUALUPD;
        rTCON = tcon;
        rTCNTB4 = tcnt;

        tcon |= S3C2410_TCON_T4START;
        tcon &= ~S3C2410_TCON_T4MANUALUPD;
        rTCON = tcon;
    
        BIT_CLR(rINTMSK, BIT_TIMER4);
        OS_EXIT_CRITICAL();
}

5)    修改U-BOOT的中断跳转
利用U-BOOT已有的丰富功能,如烧写,网络,脚本等,可在没有仿真器的情况下大大减少调试的时间。
如果直接下载ucos,一挑战到0x31000000的内存地址,会出现如下的中断信息:
interrupt request
pc : [<3100ab28>]    lr : [<e7fffff7>]
sp : 7fbfdfb7  ip : ffffdd7e  fp : 33d78a49
r10: 33d78931  r9 : 51000000  r8 : 80000013
r7 : 00000200  r6 : 00000000  r5 : 00500000  r4 : 0000dc7e
r3 : fefefeff  r2 : 00000000  r1 : ffffbfff  r0 : 80000013
Flags: Nzcv  IRQs on  FIQs on  Mode SVC_32
Resetting CPU ...
原因是U-BOOT的初始化代码接管了中断管理,看U-BOOT的反汇编:
.globl _start
_start: b       start_code
33f80000:       ea000014        b       33f80058 <start_code>
        ldr     pc, _undefined_instruction
33f80004:       e59ff014        ldr     pc, [pc, #20]   ; 33f80020 <_undefined_instruction>
        ldr     pc, _software_interrupt
33f80008:       e59ff014        ldr     pc, [pc, #20]   ; 33f80024 <_software_interrupt>
…….
        ldr     pc, _irq
33f80018:       e59ff014        ldr     pc, [pc, #20]   ; 33f80034 <_irq>
…….
33f80020 <_undefined_instruction>:
33f80020:       33f80240        mvnccs  r0, #4  ; 0x4
33f80024 <_software_interrupt>:
33f80024:       33f802a0        mvnccs  r0, #10 ; 0xa
…….
33f80034 <_irq>:
33f80034:       33f80420        mvnccs  r0, #536870912  ; 0x20000000
IRQ的中断入口为偏移0x34的33f80420。OK,在C_vMain入口处加一句:
(*(unsigned *)(0x34)) =  (U32)UCOS_IRQHandler;

6)    系统测试
添加一个应用程序ex3.c,建立两个子任务,分别不停的打印0和1。主任务每隔1秒打印系统的使用率。运行情况如下:
UCOS_FRAMEWORK Ver 1.15 for S3C2440 (ARM920T from Samsung) :05/03/05
Built using ADS on Apr 26 2008 <10:31:35>
Endian: LITTLE
Processor operating state: ARM
Task start state: ARM
CONSOL: COM0, 115200bps, 8Bit, NP
CPU Clk: 406MHz   MMU: ON   Cache: ON   Write Buf: ON
FLASH_SADDR:00000000h SRAM_SADDR:40000000h SRAM_EADDR:40000fffh
SDRAM_SADDR:30000000h SFR_BADDR :48000000h ISR_BADDR :33ffff00h
Free RAM: 3100edd8h ~ 33ffa7ffh
Developed by Michael Anburaj, http://geocities.com/michaelanburaj/

Ported by WEIYAN TECHNOLOGY, http://www.gzweiyan.com/
Ver 0.1 08/04/26

timer tcon=00500000, tcnt dc7e, tcfg 00000200,00000000
uC/OS-II, The Real-Time Kernel ARM Ported version
Jean J. Labrosse/ (Ported by) Michael Anburaj
WEIYAN TECHNOLOGY http://www.gzweiyan.com
Task1 #1
<-PRESS 'ESC' TO QUIT->
5 0 5     //正在运行的的任务数         当前的cpu使用率              每秒任务切换的次数
01010101010101010101010101010101010101010101010101010101010101010101010101010101 5 1 141
01010101010101010101010101010101010101010101010101010101010101010101010101010101 5 1 141
01010101010101010101010101010101010101010101010101010101010101010101010101010101 5 1 141
01010101010101010101010101010101010101010101010101010101010101010101010101010101 5 1 141

7)    移植小结
这次移植的难点在U-BOOT的中断接管,修改完内核心跳后,内核一运行就自动重启。后来细看输出信息interrupt request才发现这不是ucos输出的,IRQ中断仍由U-BOOT管理。找到问题的原因,解决方法就好办了。可以直接在U-BOOT里通过mw来修改,也可以由ucos来修改。

如果各位朋友在移植过程中遇到什么问题,可联系我们免费索取该移植包。

伟研科技 专注于Linux系统移植及应用开发 http://www.gzweiyan.com

相关帖子

沙发
syq_618| | 2008-4-28 11:08 | 只看该作者

atmel

atmel:at91m55800A芯片

有没有在at91上的移植代码?uCOS-II 在ADS开发环境

使用特权

评论回复
板凳
l0p0c| | 2008-4-28 16:01 | 只看该作者

嗯,先抄下来,以备后用!

使用特权

评论回复
地板
duo2182| | 2008-4-29 16:37 | 只看该作者

呵ARM9了,这……

使用特权

评论回复
5
l0p0c| | 2008-4-30 12:03 | 只看该作者

很厉害 啊

使用特权

评论回复
6
gzweiyan|  楼主 | 2008-4-30 15:42 | 只看该作者

免费索取源代码

http://www.gzweiyan.com/
QQ联系免费索取源代码

使用特权

评论回复
7
l0p0c| | 2008-4-30 16:49 | 只看该作者

免费索取……

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

146

帖子

0

粉丝