打印

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

[复制链接]
楼主: highgear
手机看帖
扫描二维码
随时随地手机跟帖
101
Cortex-M0| | 2011-11-10 18:40 | 只看该作者 回帖奖励 |倒序浏览
highgear的程序写的很规范  

comtex-mo写的程序很不规范    属于初学者水平也不到 :victory:
xlsbz 发表于 2011-11-10 16:17



LS正解,加分~~~

highgear老师属于职业高手,程序当然写的漂亮,多一个字符显啰嗦,少一个字符则杯具,思路超级清晰。

俺不搞技术,纯粹将highgear老师的垫底的小儿科作品拿来学习练手,领会消化一下highgear老师高超的编程技术。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
渤海三叠浪 + 1
102
Cortex-M0| | 2011-11-10 18:59 | 只看该作者
123JJ写得好,学习了。
还是有一个问题,不嵌入汇编,中断里要保存所有寄存器,是不是要故意在中断里使用所有寄存器。
DownCloud 发表于 2011-11-10 16:13



非也~~~

俺也没有特别行之有效之法,常用方法有三。

方法1:
在程序中适当加入一点简短变量赋值,让Keil C51将所有压栈变量扫到位,中断就全部压栈了。

方法2:
将中断程序建库,由于和其他程序的关联让Keil C51暂时摸不清头脑,结果就将全部压栈了。

方法3:
手工添加。

使用特权

评论回复
103
刘前辈| | 2011-11-10 19:35 | 只看该作者

西安农民工的程序修改好了。

本帖最后由 刘前辈 于 2011-11-10 19:41 编辑
#71楼highgear
    农民工的意思大概是想利用中断来切换任务,但有几个问题:51的中断如果没有 reti 则不会再次响应;
即便调用一次 reti 开放中断, 因为任务的死循环,堆栈最终会溢出。

.
.
   堆栈溢出是菜鸟编程结果。看咱从来不溢出。
.

#include <reg51.h>
#include <ABSACC.H>

bit LED = 0;
unsigned char TaskID = 0;
unsigned char TimerCount = 0;

void Task1();
void Task2();
code void (code *pTask[2])()={Task1,Task2};

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)
        {
           P1 = 0X0F;
                  }
}
void Task2()
{
    while(1)
        {
            P1 = 0XF0;
         }
}

void main()
{
   Timer0Init();
   //pTask[0] = Task1;
   //pTask[1] = Task2;
   (*pTask[0])();
}

void  t0_BH(void)
{
        TR0=0;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        //TF0 = 0;
                TR0=1;
        
        TimerCount ++ ;
        if(TimerCount >= 10)     /* 1s任务调度一次 */
        {
             LED = 1;
             TimerCount = 0;
                TaskSwitch();
         }
}

void t0(void) interrupt 1 using 1
{
t0_BH();

if(LED)
{
LED=0;
//TaskID = (TaskID + 1)%2;   
T0_ISR.temp=pTask[TaskID];

SP-=5;     // 指向栈底

DBYTE[SP]=T0_ISR.tmp[1];
SP++;
DBYTE[SP]=T0_ISR.tmp[0];    //高地址在栈顶
  SP+=4;
}
}
最简单调度器.rar (16.17 KB)


、、

使用特权

评论回复
104
guangmangdz| | 2011-11-10 19:49 | 只看该作者
顶一下,顺便提及一下我的Raysrtos

使用特权

评论回复
105
fu10| | 2011-11-10 19:54 | 只看该作者
学习OS的人真多,俺来凑凑热闹.....:lol

使用特权

评论回复
106
highgear|  楼主 | 2011-11-10 22:11 | 只看该作者
我做完这 os 后, 只是经过了简单的测试,bug估计是难免的。好在程序异常简单,很容易调试。

至于DownCloud的不用汇编保存其他寄存器的问题,办法就是 123jj 在 102 楼的办法,没有什么更好的办法。Turbo C把全部寄存器,不管用到还是没用到,都压入栈中,而keil没有这样做,也不能这么做,_push_ /_pop_ 不支持 0x80 以下的寄存器保存, 所以手工嵌入汇编应该是最直接的方法了.


顶104楼的光芒实时系统RaySRTOS

使用特权

评论回复
107
highgear|  楼主 | 2011-11-10 22:25 | 只看该作者
好吧,我也来给这个 os 其一个名字,叫 OS extreme, 简称 OSex :P

开个玩笑,别当真。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
渤海三叠浪 + 1
108
DownCloud| | 2011-11-11 00:12 | 只看该作者
123JJ的程序相比highgear读起来比较不轻松一点点,但也还行,我等菜鸟还是能很轻松的读完。绝非属于初学者水平,这话说的。。。由于是在别人程序基础上改,自然有些生硬,可以理解。
就是我感觉中断执行时间太长,占有资源特多,特别是任务多时,由此可见,51实在难承受操作系统,验证了highgear老师的话。

使用特权

评论回复
109
Cortex-M0| | 2011-11-11 05:37 | 只看该作者
51的设计师根本没想到过,现在被你们装入那么多的任务在玩~~~  ;P

使用特权

评论回复
110
3115599| | 2011-11-11 08:40 | 只看该作者
ZPW-2000闭环电码化系统运用中存在问题的分析及改进

使用特权

评论回复
111
xinmeitai| | 2011-11-11 11:23 | 只看该作者
顶一下

使用特权

评论回复
112
highgear|  楼主 | 2011-11-11 22:46 | 只看该作者
看了103楼刘工改过的代码,就知道刘工为何不展示代码。就那么一点点改过的代码,把水平暴露无遗。

使用特权

评论回复
113
luoru12| | 2011-11-13 12:53 | 只看该作者
看看

使用特权

评论回复
114
luoru12| | 2011-11-13 12:53 | 只看该作者
看看

使用特权

评论回复
115
luoru12| | 2011-11-13 12:54 | 只看该作者
神马东西啊   不懂啊

使用特权

评论回复
116
luoru12| | 2011-11-13 12:54 | 只看该作者
神马东西啊   不懂啊:L

使用特权

评论回复
117
linty8433| | 2011-11-13 14:02 | 只看该作者
我也来顶一个,希望楼主发完

使用特权

评论回复
118
DownCloud| | 2011-11-13 14:54 | 只看该作者
O Sex ???

使用特权

评论回复
119
刘前辈| | 2011-11-14 19:30 | 只看该作者
120
alamo2009| | 2011-11-14 23:00 | 只看该作者
本帖最后由 alamo2009 于 2011-11-15 12:14 编辑
“程序当然写的漂亮,多一个字符显啰嗦,少一个字符则杯具,思路超级清晰”
Cortex-M0 发表于 2011-11-10 18:40


我大笑一声,哈哈哈哈哈哈!!!
赤果果的!
果然是“屁精辈出”!

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
刘前辈 + 1
bhsdlmj + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则