lusson 发表于 2008-5-31 16:54:24

大家来讨论下UCOSII在51单片机上的移植(已经跑起来了)

最近在看UCOSII的书,以前写程序一直是用前后台的模式,一般的程序都能应付,我比较常用的一种模式就是
while(1)
{
if(flag_ms)
{
   flag_ms = 0;
   ...         //要执行的函数
   ..
}
}
flag_ms是用定时器中断产生的,定时器中断里只对其置1
这种模式我经常用在有数码管和有按键处理的程序里面,比较好用
但如果显示处理和按键处理程序太长,超过了定时器中断一次的时间,则会出现一些问题,比如显示的话有的显示时间长一点等
如果这样也可以用特别的方法处理,比如把一件事情分成二个中断时间来处理

现在想改改模式,特别是又在学ARM,得上个操作系统才好,手头有本51移植UCOSII的书,买了好久,一开始看看不明白,最近静下心来好好看
虽然还没有出实际的效果,但只是想讨论一下UCOSII实现的原理。以下是我对它的理解

UCOSII里也有个时间基准,这个基准是用定时器中断来产生的,任务的切换也是在这里完成,在我们看来,任务就是一个一个的函数
在这里就考虑普通函数,不考虑有其他中断发生。
每个时间片都有一个任务在执行,等到时间片时间到,即任务被定时器所中断,在定时器中断里面就会判断是否有更高优先级的任务需要执行,如果有,就切换到新的任务(后面再理讨论切换原理)然后退出定时器中断,开始新的任务的执行,每个任务都是一个死循环的形式,后面会跟一个延时几个时间片,每个任务都保存有自己的时间片,在定时器中断里会对每个任务的时间片减1,当减到0的时候任务就满足进入就绪状态的一个条件

下面讨论任务的切换原理:
每个任务都有自己的一个栈,当定时器中断到需要进行任务切换时,需要先把当前执行的任务的一些数据保存起来,比如任务入口地址,寄存器等,51因为有系统栈,所以是把系统栈复制到任务栈,这里的复制的目的就是要让当前正在执行的任务像刚被中断一样,因为等到下次轮到这个任务执行时,把它的栈复制到硬件栈,然后执行中断返回指令,就可以运行了,好象UCOSII各个任务栈的目的就是保持着该任务像被刚中断的状态,当要执行该任务的时候用一条中断返回指令就可以了,所以才会看到每个任务都是一个死循环的模式。

以上是个人对UCOSII原理的一些理解,有什么理解错误大家指出,欢迎大家讨论。

lusson 发表于 2008-6-3 15:09:23

今天终于把UCOS跑起来了,用的是STC89C54RD+做实验,外部有1K的RAM。
原来在启动文件里也有几个选项要设置
如下:

XDATALEN      EQU   0400H      ; the length of XDATA memory in bytes.

XBPSTACK      EQU   1       ; set to 1 if large reentrant is used.
XBPSTACKTOP   EQU   03FFH+1; set top of stack to highest location+1.

建5个任务用了560B RAM和4K多程序存储器。

ak0406 发表于 2009-1-9 14:19:41

顶一个哈!

zxy346333764 发表于 2009-5-26 12:38:50

你好我也在学UCOS ii现在在移植到STC单片机上
可以给我发一个移植程序吗?
zhangxinyuan523@126.com

zxy346333764 发表于 2009-5-26 23:09:18

问一下

zxy346333764 发表于 2009-5-26 23:10:17

我的程序 设置了编译完了RAM
还是超过 400H

37150839 发表于 2009-5-27 15:56:56

mark..

blueliuyun 发表于 2010-8-21 21:02:05

我也很希望楼主能共享下CODE。
我现在向51上移植ucos,在Proteus仿真可以,在单片机里就不行了,单片机资源比lz用的多些。

biaoge 发表于 2010-8-21 21:37:44

顶,希望楼主把代码发给小弟一下。lybwell@163.com

Joyway 发表于 2010-11-5 11:38:23

我的UCOS老是跑不起来,大家有没有移好的原码发个给小弟

a305566 发表于 2010-11-10 15:14:59

希望楼主给我一份a305566@sina.com   非常感谢!!

HQ2010 发表于 2011-2-23 10:42:45

楼主也给我发一份吧,感激不尽!hq19872006@126.com

烟雨任此生 发表于 2012-8-1 15:44:04

你好,我从网上down 了一个在STC89C52的UCOS可以再单片机上跑起来,但我重新建了一个工程却不能编译通过,请问楼主是怎样配置Keil4的?

jetli 发表于 2012-8-1 16:43:06

{:loveliness:} 工程打包,,,才能看啊,

sn516952 发表于 2012-8-12 20:46:08

烟雨任此生 发表于 2012-8-1 15:44 static/image/common/back.gif
你好,我从网上down 了一个在STC89C52的UCOS可以再单片机上跑起来,但我重新建了一个工程却不能编译通过, ...

一样的头像。呵呵

zhangfuhg 发表于 2012-8-12 21:38:55

xx学习!{:smile:}

gaoyichuan000 发表于 2012-8-12 22:52:06

能不能开源啊 我也在研究这方面的事情

shiyue01 发表于 2013-6-9 00:17:24

mark               

二进制 发表于 2013-6-9 07:54:28

51不适合跑系统,没有实际意义

880705lpdhr 发表于 2013-7-10 08:07:14

gaoyichuan000 发表于 2012-8-12 22:52 static/image/common/back.gif
能不能开源啊 我也在研究这方面的事情

对呀,楼主把源代码贴出来看看

xiefy21 发表于 2013-8-14 20:29:46

mark……
顶一个…

andy520 发表于 2013-9-25 16:48:10

求源码,294145923@qq.com
页: [1]
查看完整版本: 大家来讨论下UCOSII在51单片机上的移植(已经跑起来了)