偶发现大家都很喜欢这个东西那!刚好,本着学习的态度,我们大家一起来给一个目标系统移植个uC/OS吧!这里是Sunplus的论坛,当然是61了~~如何呢~~~
想参与的就报名吧!
呵呵,在这里跟帖就可以拉!
共同学习,共同提高!
移植的关键是以下几个文件:
1)OS_CPU_A。ASM
2)OS_CPU_C。C
3) OS_CPU。H
我们一个一个来攻破了。有条件的,最好先看看它在x86上的实现。然后想想在61上该怎么写。
菜鸟报名~~
[em05]在这里抛砖引玉,先给一个在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的实现。
呵呵~~~~~
没人响应啊
开学太忙
等以后偶响应你哈
[em05]不错不错,其实还可以参考陵阳的miniOS,这个其实就是ucOS在陵阳上的移植实例阿!
minios 是用汇编写的 吧
好象和UCOS没关系
hehe 事实上很多著名的操作系统最初都是用汇编写的
比如用于嵌入式的TRX等,
对,正是这样,所以才开发之前的规划绝对是正确的事情 。
只要头脑清晰,没什么不可完成
完全正确
好的需求分析
好的规划流程
好的编程风格
。。。
都很重要
偶只编过3W多行的程序,还不是C
太菜~~~~~
55555555
flylong兄:
MINIOS好象确实是用汇编写的啊
这个还是凌阳MINIOS的一个卖点呢
凌阳不公开他的源码
在台湾好象还专门有一个开发小组负责这个OS
:)
软件开发最提倡的是reuse ……
呵呵~~~~~
reuse就是软件IC啦
《The Practice of Programming》
Brian W. kernighan 和 Rob Pike著
惭愧啊
一直没看完
只是躺在床上无聊时候翻一翻
[em04]好想法!! 同志们 给咱写个 uC/OS-II 移植到 凌阳SPCE061A 的移植代码!! 供大家学习学习!!
向那些辛勤写作、发贴人表示感谢!!
下载去有一个 uC/OS-II 在凌阳SPCE061A 的移植代码,
但好像用不起来啊,
一运行,过一会儿进入了 OSTaskIdle 出不来了
也不再进行任务调度,
怎么回事啊?
uC/OS-II是个优秀的RTOS
但用在SPCE061上感觉有点小马拉大车的感觉
不是很实用
还是仔细研究MINIOS吧。
他们的原理是一致的
只是MINIOS十分精练而已
对于硬件资源不是十分丰富的61来说
最好别用uC/OS-II
用C不好吗???但我只会用C呀,,,
说真的,,,我支持用C,,,
顶,再问一下有没有人在做移植UC/OSII到SPT6608A的,大家一起努力。
不错
我在研究OS移植到6608中,遇到不少问题,有时间讨论讨论.
gjp@bbktel.com
按照上面的 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");
}
麻烦请大家找找问题