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

[复制链接]
fangmin041 发表于 2011-11-7 12:56 | 显示全部楼层
盖楼,30不是梦想
nayaix 发表于 2011-11-7 13:55 | 显示全部楼层
我喜欢围观,继续。。。。。。
SeaSun 发表于 2011-11-7 14:46 | 显示全部楼层
期待......!!

期待比 ProtoThread 更精简!!!
mcu5i51 发表于 2011-11-7 14:58 | 显示全部楼层
感觉应该很简单,等待真相
pentral0311 发表于 2011-11-7 15:17 | 显示全部楼层
好东西,顶你啦
wpj5188 发表于 2011-11-7 16:45 | 显示全部楼层
那么多屏蔽?
piaoyrf 发表于 2011-11-7 16:57 | 显示全部楼层
刘前辈 发表于 2011-11-7 17:01 | 显示全部楼层
本帖最后由 刘前辈 于 2011-11-7 17:11 编辑

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

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

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


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


、、
liying07852 发表于 2011-11-7 17:37 | 显示全部楼层
感觉不错
dong_abc 发表于 2011-11-7 17:37 | 显示全部楼层
顶,看高人讨论,涨知识。。。
hdp7891000 发表于 2011-11-7 17:58 | 显示全部楼层
lzm2008 发表于 2011-11-7 19:41 | 显示全部楼层
这个必须顶,必须的:victory:
西安农民工 发表于 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 试试

查看全部评分

huangqi412 发表于 2011-11-7 20:08 | 显示全部楼层
DownCloud 发表于 2011-11-7 20:19 | 显示全部楼层
先顶LS。
上面的程序有问题哦,实验证明,任务1转到任务2就再也回不来了,因为中断进入后就没返回,锁住了。
DownCloud 发表于 2011-11-7 20:21 | 显示全部楼层
(*pTask[0])();
在中断中调用死循环,所以不能再进入中断啦。:victory:
w3048 发表于 2011-11-7 20:34 | 显示全部楼层
顶一个
ayl439 发表于 2011-11-7 21:02 | 显示全部楼层
顶一个 期待楼主的代码
 楼主| highgear 发表于 2011-11-7 21:07 | 显示全部楼层
上程序!



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


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


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

参与人数 3威望 +3 收起 理由
zxcscm + 1
DownCloud + 1
Cortex-M0 + 1

查看全部评分

xjw_xl_box 发表于 2011-11-7 22:03 | 显示全部楼层
Suspend 和 resume 函数就是切换程序指针啊。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部