凌阳科技大学计划论坛

首页 » 16位应用专题 » OS应用专区 » 让我们一起来移植uC/OS-II~~~(本版网友活动)
prostar - 2004-8-25 20:01:00

偶发现大家都很喜欢这个东西那!刚好,本着学习的态度,我们大家一起来给一个目标系统移植个uC/OS吧!这里是Sunplus的论坛,当然是61了~~如何呢~~~


想参与的就报名吧!


呵呵,在这里跟帖就可以拉!


共同学习,共同提高!

robot4359 - 2004-8-25 20:13:00
俺第一个报名!
prostar - 2004-8-25 20:26:00

移植的关键是以下几个文件:

1)OS_CPU_A。ASM

2)OS_CPU_C。C

3)  OS_CPU。H

我们一个一个来攻破了。有条件的,最好先看看它在x86上的实现。然后想想在61上该怎么写。

nanhaizicn - 2004-8-25 21:52:00

菜鸟报名~~

[em05]
prostar - 2004-8-28 8:22:00

在这里抛砖引玉,先给一个在EPSON平台下的实现,大家回去请自己写一个Sunplus的实现,贴出来,我评论一下。

/*

                                    uC/OS II  For ENSON S1C33
                                   
                                  (c)Copyright 2004 MicroVantech
                                 
                                      All Rights Reserved
Date : 2004-8-19
Author : prostar

****************************************** 更新记录 **********************************************
更新日期 : 2004-8-22
更新人 :  prostar
更正原因 : 按照uC/OS-II 2.51版本以上要求,修正函数OSTickISR,OSIntCtxSw

更新日期 : 2004-8-27
更新人 :  prostar
更正原因:修正了系统切换上下文的时候的寄存器保存bug

*/


#include "includes.h"


extern OS_TCB *OSTCBHighRdy;
extern OS_TCB *OSTCBCur;
extern BOOLEAN OSRunning;


OS_STK* temp = 0;

/*
  OSStartHighRdy 完成的任务:
 
  1) 调用用户的OSTaskSwHook
  2) 将OSRunning置有效
  3) 将优先级最高的任务的SP切换为当前堆栈
  4) 执行新的任务

*/

void    OSStartHighRdy(void)
{

#if OS_CPU_HOOKS_EN
  OSTaskSwHook();
#endif

  OSRunning = 1;

  temp = OSTCBHighRdy->OSTCBStkPtr;
  asm (" xld.w  %r0,[temp]");
 
  asm (" ld.w  %sp,%r0");
 
  // 2002-8-27新加代码开始
  asm (" popn  %r1");
  asm (" ld.w  %alr,%r1");
  asm (" ld.w  %ahr,%r0");
  // 2002-8-27新加代码结束
 
  asm (" popn  %r15 ");
  asm (" reti ");
}


/*

    任务切换(任务级)
      完成以下操作:
        1)  保存当前任务上下文
        2)  设置优先级最高的任务为当前任务
        3)  设置SP为优先级最高的任务的堆栈地址
        4)  中断返回,执行新任务
       
*/

void    OSCtxSw(void)
{
 
  asm (" pushn %r15 " );
 
  // 2002-8-27新加代码开始
  asm (" ld.w  %r0,%ahr");
  asm (" ld.w  %r1,%alr");
  asm (" pushn  %r1");
  // 2002-8-27新加代码结束
       
  asm (" xld.w  [temp],%sp ");
  OSTCBCur -> OSTCBStkPtr = temp;
 
  #if OS_CPU_HOOKS_EN > 0
    OSTaskSwHook();
  #endif
 
  OSTCBCur = OSTCBHighRdy;
  OSPrioCur = OSPrioHighRdy;

  temp = OSTCBHighRdy -> OSTCBStkPtr;
  asm (" xld.w  %r0,[temp]");
  asm (" ld.w    %sp,%r0");
 
  // 2002-8-27新加代码开始
  asm (" popn  %r1");
  asm (" ld.w  %alr,%r1");
  asm (" ld.w  %ahr,%r0");
  // 2002-8-27新加代码结束
 
  asm (" popn  %r15 ");
  asm (" reti " );

}

void OSIntCtxSw(void)
{

  #if OS_CPU_HOOKS_EN > 0
    OSTaskSwHook();
  #endif
 
  OSTCBCur = OSTCBHighRdy;
  OSPrioCur = OSPrioHighRdy;
 
  temp = OSTCBHighRdy -> OSTCBStkPtr;
  asm (" xld.w  %r0,[temp] ");
  asm (" ld.w  %sp,%r0 ");
 
  // 2002-8-27新加代码开始
  asm (" popn  %r1");
  asm (" ld.w  %alr,%r1");
  asm (" ld.w  %ahr,%r0");
  // 2002-8-27新加代码结束

  asm (" popn %r15 ");
  asm (" reti ");

}


/*

  系统时钟中断服务程序

*/

void OnTickISR(void)
{
  *(volatile unsigned char *)INT_F16T0_F16T1_ADDR = INT_F16TU1;
 
  asm (" pushn %r15 ");
 
  // 2002-8-27新加代码开始
  asm (" ld.w  %r0,%ahr");
  asm (" ld.w  %r1,%alr");
  asm (" pushn  %r1");
  // 2002-8-27新加代码结束
     
  OSIntEnter();
  if( OSIntNesting == 1 )
  {
    asm("xld,w  [temp],%sp");
    OSTCBCur -> OSTCBStkPtr = temp;
  }
  OSTimeTick();
  OSIntExit();
 
  // 2002-8-27新加代码开始
  asm (" popn  %r1");
  asm (" ld.w  %alr,%r1");
  asm (" ld.w  %ahr,%r0");
  // 2002-8-27新加代码结束

  asm (" popn %r15 ");
  asm (" reti ");

}

这个是OS_CPU_A的实现。

nanhaizicn - 2004-8-31 20:04:00

呵呵~~~~~

没人响应啊

开学太忙

等以后偶响应你哈

[em05]
lmyghy - 2004-9-3 23:53:00
我要学习,
nanhaizicn - 2004-9-4 10:27:00
以下是引用flyljp在2004-9-4 1:40:00的发言:

不错不错,其实还可以参考陵阳的miniOS,这个其实就是ucOS在陵阳上的移植实例阿!


minios 是用汇编写的 吧
好象和UCOS没关系

[em05]
prostar - 2004-9-7 18:15:00

hehe  事实上很多著名的操作系统最初都是用汇编写的

比如用于嵌入式的TRX等,

prostar - 2004-9-9 8:47:00

对,正是这样,所以才开发之前的规划绝对是正确的事情 。

只要头脑清晰,没什么不可完成

nanhaizicn - 2004-9-9 11:55:00

完全正确

好的需求分析

好的规划流程

好的编程风格

。。。

都很重要

偶只编过3W多行的程序,还不是C

太菜~~~~~

55555555

nanhaizicn - 2004-9-9 12:02:00

flylong兄:

MINIOS好象确实是用汇编写的啊

这个还是凌阳MINIOS的一个卖点呢

凌阳不公开他的源码

在台湾好象还专门有一个开发小组负责这个OS

:)

               

prostar - 2004-9-9 18:13:00

软件开发最提倡的是reuse ……

nanhaizicn - 2004-9-9 22:02:00

呵呵~~~~~

reuse就是软件IC啦

prostar - 2004-9-10 9:10:00
呵呵 有本书叫什么“Partice Of Programming",推荐大家看!(名字好象记得不太清楚了,应该差不多?)
nanhaizicn - 2004-9-10 17:10:00

《The Practice of Programming》

Brian W. kernighan 和 Rob Pike著

惭愧啊

一直没看完

只是躺在床上无聊时候翻一翻

[em04]
prostar - 2004-9-10 18:15:00
Kernighan !!!那可是强人中的强人啊!!
prostar - 2004-9-19 19:32:00
应该有吧?只是它给隐藏起来了。否则为什么我们的程序不是从地址0开始执行呢?而我们写的main的入口点总在8000多~~所以,绝对有引导代码~~~
将军 - 2004-12-17 15:04:00
是不是学习之前应该看看操作系统原理方面的书啊,这样可以容易入门一些吧?
pmp4065 - 2004-12-29 18:51:00
有答案了吗?想看一看!
wangzhongqi1998 - 2005-3-21 10:03:00
偶最近也正在移植,在努力中。
zzll19830315 - 2005-3-31 17:44:00

好想法!! 同志们 给咱写个 uC/OS-II 移植到 凌阳SPCE061A 的移植代码!!  供大家学习学习!!

向那些辛勤写作、发贴人表示感谢!!

zw-cai - 2005-4-5 21:25:00

下载去有一个 uC/OS-II 在凌阳SPCE061A 的移植代码,

但好像用不起来啊,

一运行,过一会儿进入了 OSTaskIdle 出不来了

也不再进行任务调度,

怎么回事啊?   

hzh007 - 2005-4-29 14:28:00

uC/OS-II是个优秀的RTOS

但用在SPCE061上感觉有点小马拉大车的感觉

不是很实用

还是仔细研究MINIOS吧。

他们的原理是一致的

只是MINIOS十分精练而已

对于硬件资源不是十分丰富的61来说

最好别用uC/OS-II

138ok - 2005-6-6 11:13:00

用C不好吗???但我只会用C呀,,,

说真的,,,我支持用C,,,

pirate - 2005-6-20 12:39:00

顶,再问一下有没有人在做移植UC/OSII到SPT6608A的,大家一起努力。

waitingboy - 2005-9-26 12:34:00

不错

lancy - 2005-12-27 16:40:00

我在研究OS移植到6608中,遇到不少问题,有时间讨论讨论.


gjp@bbktel.com


一不小心 - 2006-1-26 21:58:00

按照上面的 prostar斑竹的程序

如果使用的是SPCE061A那么OS_CPU_A.asm是否可以在un,SPtm中直接用c写成OS_CPU_A.c

如果可以写成c 那么其中的OSCtxSw 可不可以这样写:

extern void OSCtxSw(void)                    //建立函数OSCtxSw执行任务级切换
{
  OS_STK* temp = 0;             
  ASM("PUSH R1,R5 to [sp]\n\t");              //保存处理器寄存器 
  ASM("%0=SP":"=r"(temp));
  OSTCBCur->OSTCBStkPtr=temp;                //保存当前任务的堆栈指针
  OSTaskSwHook();
  OSTCBCur=OSTCBHighRdy;
  OSPrioCur=OSPrioHighRdy;
  temp = OSTCBHighRdy->OSTCBStkPtr;            //获取需要恢复任务的堆栈指针 
  ASM("SP=%0"::"r"(temp));
  ASM("POP R1,R5 from [sp]\n\t");              //执行新的任务
  ASM("RETI\n\t");

}

麻烦请大家找找问题

powerint - 2006-2-9 19:22:00
http://sunplusmcu.com/bbs/dispbbs.asp?boardID=3&ID=427&page=1
 1  2 
查看完整版本: 让我们一起来移植uC/OS-II~~~(本版网友活动)