大家来讨论下UCOSII在51单片机上的移植(已经跑起来了)
最近在看UCOSII的书,以前写程序一直是用前后台的模式,一般的程序都能应付,我比较常用的一种模式就是while(1)
{
if(flag_ms)
{
flag_ms = 0;
... //要执行的函数
..
}
}
flag_ms是用定时器中断产生的,定时器中断里只对其置1
这种模式我经常用在有数码管和有按键处理的程序里面,比较好用
但如果显示处理和按键处理程序太长,超过了定时器中断一次的时间,则会出现一些问题,比如显示的话有的显示时间长一点等
如果这样也可以用特别的方法处理,比如把一件事情分成二个中断时间来处理
现在想改改模式,特别是又在学ARM,得上个操作系统才好,手头有本51移植UCOSII的书,买了好久,一开始看看不明白,最近静下心来好好看
虽然还没有出实际的效果,但只是想讨论一下UCOSII实现的原理。以下是我对它的理解
UCOSII里也有个时间基准,这个基准是用定时器中断来产生的,任务的切换也是在这里完成,在我们看来,任务就是一个一个的函数
在这里就考虑普通函数,不考虑有其他中断发生。
每个时间片都有一个任务在执行,等到时间片时间到,即任务被定时器所中断,在定时器中断里面就会判断是否有更高优先级的任务需要执行,如果有,就切换到新的任务(后面再理讨论切换原理)然后退出定时器中断,开始新的任务的执行,每个任务都是一个死循环的形式,后面会跟一个延时几个时间片,每个任务都保存有自己的时间片,在定时器中断里会对每个任务的时间片减1,当减到0的时候任务就满足进入就绪状态的一个条件
下面讨论任务的切换原理:
每个任务都有自己的一个栈,当定时器中断到需要进行任务切换时,需要先把当前执行的任务的一些数据保存起来,比如任务入口地址,寄存器等,51因为有系统栈,所以是把系统栈复制到任务栈,这里的复制的目的就是要让当前正在执行的任务像刚被中断一样,因为等到下次轮到这个任务执行时,把它的栈复制到硬件栈,然后执行中断返回指令,就可以运行了,好象UCOSII各个任务栈的目的就是保持着该任务像被刚中断的状态,当要执行该任务的时候用一条中断返回指令就可以了,所以才会看到每个任务都是一个死循环的模式。
以上是个人对UCOSII原理的一些理解,有什么理解错误大家指出,欢迎大家讨论。 今天终于把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多程序存储器。 顶一个哈! 你好我也在学UCOS ii现在在移植到STC单片机上
可以给我发一个移植程序吗?
zhangxinyuan523@126.com 问一下 我的程序 设置了编译完了RAM
还是超过 400H mark.. 我也很希望楼主能共享下CODE。
我现在向51上移植ucos,在Proteus仿真可以,在单片机里就不行了,单片机资源比lz用的多些。 顶,希望楼主把代码发给小弟一下。lybwell@163.com 我的UCOS老是跑不起来,大家有没有移好的原码发个给小弟 希望楼主给我一份a305566@sina.com 非常感谢!! 楼主也给我发一份吧,感激不尽!hq19872006@126.com 你好,我从网上down 了一个在STC89C52的UCOS可以再单片机上跑起来,但我重新建了一个工程却不能编译通过,请问楼主是怎样配置Keil4的? {:loveliness:} 工程打包,,,才能看啊, 烟雨任此生 发表于 2012-8-1 15:44 static/image/common/back.gif
你好,我从网上down 了一个在STC89C52的UCOS可以再单片机上跑起来,但我重新建了一个工程却不能编译通过, ...
一样的头像。呵呵 xx学习!{:smile:} 能不能开源啊 我也在研究这方面的事情 mark 51不适合跑系统,没有实际意义 gaoyichuan000 发表于 2012-8-12 22:52 static/image/common/back.gif
能不能开源啊 我也在研究这方面的事情
对呀,楼主把源代码贴出来看看 mark……
顶一个… 求源码,294145923@qq.com
页:
[1]