打印

大家来接蜜: os 大泻蜜...............................................

[复制链接]
楼主: highgear
手机看帖
扫描二维码
随时随地手机跟帖
41
fangmin041| | 2011-11-7 12:56 | 只看该作者 回帖奖励 |倒序浏览
盖楼,30不是梦想

使用特权

评论回复
42
nayaix| | 2011-11-7 13:55 | 只看该作者
我喜欢围观,继续。。。。。。

使用特权

评论回复
43
SeaSun| | 2011-11-7 14:46 | 只看该作者
期待......!!

期待比 ProtoThread 更精简!!!

使用特权

评论回复
44
mcu5i51| | 2011-11-7 14:58 | 只看该作者
感觉应该很简单,等待真相

使用特权

评论回复
45
pentral0311| | 2011-11-7 15:17 | 只看该作者
好东西,顶你啦

使用特权

评论回复
46
wpj5188| | 2011-11-7 16:45 | 只看该作者
那么多屏蔽?

使用特权

评论回复
47
piaoyrf| | 2011-11-7 16:57 | 只看该作者
:lol

使用特权

评论回复
48
刘前辈| | 2011-11-7 17:01 | 只看该作者
本帖最后由 刘前辈 于 2011-11-7 17:11 编辑

就拿这个程序做引导,能引出众多OS概念和C51应用。分时调度是抢夺式调度,必须与互斥保护机制同时存在。所长写了个分时调度器就算是OS大揭秘了,你的互斥机制呢?

唉……这学OS还要什么教授,博士后,中国搞了20年都没个影,找所长一个大泄蜜就搞定啦。

唉……,千里马常有,伯乐难寻。憋屈在这,屈才呦……


好贴要多顶,——顶到47楼了也没见泻出点蜜水来?……咱再顶LZ一把。要不,来点黄连素?


、、

使用特权

评论回复
49
liying07852| | 2011-11-7 17:37 | 只看该作者
感觉不错

使用特权

评论回复
50
dong_abc| | 2011-11-7 17:37 | 只看该作者
顶,看高人讨论,涨知识。。。

使用特权

评论回复
51
hdp7891000| | 2011-11-7 17:58 | 只看该作者
mark下

使用特权

评论回复
52
lzm2008| | 2011-11-7 19:41 | 只看该作者
这个必须顶,必须的:victory:

使用特权

评论回复
53
西安农民工| | 2011-11-7 19:54 | 只看该作者
本帖最后由 西安农民工 于 2011-11-7 19:57 编辑

最简单的OS模型,欢迎拍砖!

#include <reg51.h>
sbit LED = P0^0;

unsigned char TaskID = 0;
unsigned char TimerCount = 0;


void (*pTask[2])(void);

void Timer0Init()
{
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TR0=1;
        ET0=1;
        EA=1;
}
void TaskSwitch()
{
    TaskID = TaskID + 1;         
    if(2 == TaskID) TaskID = 0;
    (*pTask[TaskID])();
}
void Task1()
{
    while(1)
        {
           P2 = 0X0F;
        }
}
void Task2()
{
    while(1)
        {
            P2 = 0XF0;
        }
}

void main()
{
   Timer0Init();
   pTask[0] = Task1;
   pTask[1] = Task2;
   (*pTask[0])();
}
void t0(void) interrupt 1 using 0
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TF0 = 0;
        TimerCount ++ ;
        if(TimerCount >= 10)         /* 1s任务调度一次 */
        {
             LED = ~LED;
             TimerCount = 0;
             TaskSwitch();
        }
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
zzz1367 + 1 试试
54
huangqi412| | 2011-11-7 20:08 | 只看该作者
帮顶

使用特权

评论回复
55
DownCloud| | 2011-11-7 20:19 | 只看该作者
先顶LS。
上面的程序有问题哦,实验证明,任务1转到任务2就再也回不来了,因为中断进入后就没返回,锁住了。

使用特权

评论回复
56
DownCloud| | 2011-11-7 20:21 | 只看该作者
(*pTask[0])();
在中断中调用死循环,所以不能再进入中断啦。:victory:

使用特权

评论回复
57
w3048| | 2011-11-7 20:34 | 只看该作者
顶一个

使用特权

评论回复
58
ayl439| | 2011-11-7 21:02 | 只看该作者
顶一个 期待楼主的代码

使用特权

评论回复
59
highgear|  楼主 | 2011-11-7 21:07 | 只看该作者
上程序!

main.zip (1.77 KB)

简单地介绍一下, 这个调度器保存了 ACC, B, PSW, R0, R4, R7 6个寄存器, 如果需要保存更多任务使用到的寄存器,例如 dptr, 可以在Registers 里添加,并在 interrupt 里手工 push/pop 相应的寄存器, 使用 _push_/_pop 或直接嵌入汇编。这里没有应用优先级, 如果想添加, FindNextTask 就是为此准备的,在这个函数实施优先级算法改变 taskIndex 就可以控制任务调度, 返回 -1 则回到主任务。


既然顶到了50楼,那么我把 dos 下的 任务调度器发一遍, 做了一点小小的改进: 可以设置定时器的时间; Registers 结构中增加了任务结束返回的地址, 这样不用再使用 ExitTask 结束任务; Sleep 改为使用毫秒。
os.zip (2.29 KB)

我对于 8051 下使用 os 的态度一如既往, 不赞成, 因为太消耗宝贵的 8051 资源, 但作为学习目的, 我认为是有必要的, 毕竟很多人只了解 8051, 这可以作为一个基本的起点。

使用特权

评论回复
评分
参与人数 3威望 +3 收起 理由
zxcscm + 1
DownCloud + 1
Cortex-M0 + 1
60
xjw_xl_box| | 2011-11-7 22:03 | 只看该作者
Suspend 和 resume 函数就是切换程序指针啊。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则