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

2020-01-26 13:02发布

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

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

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

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

以上是个人对UCOSII原理的一些理解,有什么理解错误大家指出,欢迎大家讨论。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
22条回答
lusson
2020-01-26 17:18
今天终于把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多程序存储器。

一周热门 更多>