OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: shr5791

★★★ 自己写的操作系统SCH51(有优先级,可抢占,可用于实际项目)_欢迎各位大神们批评指正 ★★★

  [复制链接]

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2013-12-17 22:24:29 | 显示全部楼层
回复【47楼】林显泽:
---------------------------------你的这个问题实现起来很容易,如果你说的按键按下是以中断的方式触发的话那就不用多说了。如果是扫描的话,那你就得定义一个按键扫描任务了void KeyScanTask(void),周期性的调用它,如果还要要求按键延时消抖,也简单,用一个静态局部变量实现就行了,每次扫到有按键按下都判断一下该静态局部变量(也就是上次扫描情况的记录)。
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

30

主题

705

帖子

1

精华

新手上路

积分
21
金钱
21
注册时间
2013-3-14
在线时间
52 小时
发表于 2013-12-18 17:36:36 | 显示全部楼层
回复【50楼】shr5791:
---------------------------------
受益匪浅啊,感谢楼主。
原子哥是不是又要出黑科技了呀。^_^...
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2013-11-25
在线时间
0 小时
发表于 2013-12-27 16:07:20 | 显示全部楼层
回复【51楼】shr5791:
---------------------------------
你QQ多少加个 好友指教下几点不懂的 我QQ327045033
回复 支持 反对

使用道具 举报

8

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2013-12-27
在线时间
15 小时
发表于 2013-12-27 19:04:19 | 显示全部楼层
回复【47楼】林显泽:
---------------------------------
这个ucosii上面都有例子,不知lz的最多支持多少任务,内核有解释没有。写驱动的牛逼,但是写得了操作系统的更是高手。
回复 支持 反对

使用道具 举报

13

主题

91

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2012-11-17
在线时间
18 小时
发表于 2014-1-17 16:01:29 | 显示全部楼层
还没看代码,不过第一眼看上去看到了SCH_Add_Task(),我就觉得LZ应该是有看过MS3那个代码
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-1-20
在线时间
0 小时
发表于 2014-1-20 11:03:48 | 显示全部楼层
回复【24楼】shr5791:

回复【23楼】sl_arm:
---------------------------------谢谢你们的夸奖,我会继续升级下去!最近打算以这个系统开发一个实际的案例给大家。

---------------------------------
不知楼主的实际案例开发出来木有,拭目以待中~~~
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-2-15
在线时间
0 小时
发表于 2014-2-15 23:50:43 | 显示全部楼层
谢谢楼主,我现在就是自己写一个51的操作系统,但是遇到问题了,主要是压栈和出栈那里,程序会不知所踪,现在可以参考一下。
很感谢楼主,可以说是雪中送炭啊!!!!!!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

3

主题

24

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-2-22 21:39:33 | 显示全部楼层
真是好东西,膜拜!希望楼主的实际案例开发快快出来,
享受单片机
回复 支持 反对

使用道具 举报

3

主题

24

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-2-23 19:37:22 | 显示全部楼层
敢问阁下,7楼中的仿真时序图在keil中如何操作出来。
享受单片机
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-2-20
在线时间
0 小时
发表于 2014-2-24 09:10:33 | 显示全部楼层
好贴必回,正想搞这个。呵呵、
兴趣为师,自学为主。一个脚印一个坑,努力奋斗中...........
回复 支持 反对

使用道具 举报

10

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
174
金钱
174
注册时间
2013-4-24
在线时间
4 小时
发表于 2014-2-25 13:17:47 | 显示全部楼层
一直在用这种 时间触发的嵌入式系统设计模式+状态机,感觉8位 甚至简单的32位应用通杀了,往上再学习RTT  、 linux也就行了。
牛逼死了,牛还活着吗?
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2013-10-2
在线时间
0 小时
发表于 2014-2-25 14:10:44 | 显示全部楼层

牛人,
抢沙发 、占座、  听课  !!!

回复 支持 反对

使用道具 举报

0

主题

23

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-3
在线时间
0 小时
发表于 2014-3-6 01:26:14 | 显示全部楼层
牛人啊,顶礼膜拜中!!!看来我还有很长的路要走啊!!
选择了就不要后悔!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2014-3-6
在线时间
1 小时
发表于 2014-3-6 10:31:55 | 显示全部楼层
提个小建议,我发现你用的是XDATA空间,把它改为DATA空间作为运行变量空间,当然这样data空间就溢出了,我通常的做法是:把数组变量都强行定义在idata中,毕竟数组是间接寻址的,idata和data空间间接寻址都是同样的操作,何必把数组变量放到直接寻址的data空间去抢直接寻址的变量空间呢?
回复 支持 反对

使用道具 举报

3

主题

24

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
356
金钱
356
注册时间
2013-11-21
在线时间
0 小时
发表于 2014-3-6 12:43:44 | 显示全部楼层
因为这个牛贴发现了《时间触发嵌入式系统设计模式》这本好书,86块钱啊,买的有点心疼,不过值了。
享受单片机
回复 支持 反对

使用道具 举报

8

主题

93

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2013-9-22
在线时间
0 小时
 楼主| 发表于 2014-3-8 21:37:12 | 显示全部楼层
回复【63楼】涛声依旧:
---------------------------------
我个人觉得遇到比较占内存的变量,比如数组,还是放在xdata区比较好,因为到目前为止还没有遇到因为xdata区寻址太慢了而影响到我程序的运行,呵呵,关键还是xdata比较大,想怎么开辟就怎么开辟吧
回复 支持 反对

使用道具 举报

6

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2013-8-27
在线时间
1 小时
发表于 2014-3-18 11:19:46 | 显示全部楼层
回复【65楼】zhengyuzhang:
---------------------------------
有电子档的啊,
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-3-25
在线时间
0 小时
发表于 2014-3-25 09:26:37 | 显示全部楼层
mark一下~
回复 支持 反对

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2013-6-5
在线时间
142 小时
发表于 2014-4-6 02:52:37 | 显示全部楼层
回复【楼主位】shr5791:
----------------------------
看了一下,你这里有个问题我不太明白,你这个系统每个任务都是很短的时间完成的,如果一个任务很重,而任务内又有延时,这个时候,就很浪费了,这个应该把控制权交回调度器,加载下一个任务,到时后再把控制权交回等待的任务.其实你这个和大家都有一个时间标志,每个程序检查时间标志,没到马上Return,到了就继续执行没什么区别!
while(1)
 {
  if (Task1==0) {Task1= 1000;Task1();}
  if (Task2==0) {Task2= 2000;Task2();}
 }
就是这样的.
而且,你在时钟中断中调用函数也非常危险!!!
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-4-7
在线时间
1 小时
发表于 2014-4-7 22:42:06 | 显示全部楼层
感谢楼主分享。。。
回复 支持 反对

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-3-16
在线时间
4 小时
发表于 2014-4-8 20:04:10 | 显示全部楼层
天啊,我本来以为我51大概学完了,正想学"深入"AVR呢,最近看到了51的操作系统,包括us/os,在看看您这篇文章,我的神啊,我什么时候才能去搞ARM啊.....................反思中................
回复 支持 反对

使用道具 举报

34

主题

388

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
4081
金钱
4081
注册时间
2012-10-21
在线时间
642 小时
发表于 2014-4-9 16:50:24 | 显示全部楼层
发现一本好书,向高手致敬,学习中
回复 支持 反对

使用道具 举报

42

主题

568

帖子

0

精华

高级会员

Rank: 4

积分
784
金钱
784
注册时间
2010-12-19
在线时间
5 小时
发表于 2014-4-10 14:54:26 | 显示全部楼层
感觉LZ的系统跟这个很类似treeOS
转送门: 
http://www.treeos.com.cn/bbs/forum.php?mod=viewthread&tid=25&extra=page%3D1
一个上蹿下跳的猴子~~~
回复 支持 反对

使用道具 举报

42

主题

568

帖子

0

精华

高级会员

Rank: 4

积分
784
金钱
784
注册时间
2010-12-19
在线时间
5 小时
发表于 2014-4-13 17:55:00 | 显示全部楼层
感觉这个系统很致命。
居然在中断里面处理函数
 if(SCH_tasks[Index].Preemptive_En == 1) //为抢占式任务,则立即运行
 {
 (*SCH_tasks[Index].pTask)();
 SCH_tasks[Index].RunMe -= 1;  //RunMe标志复位/减1

万一我的函数时间很长,怎么办?
或者我的函数需要printf怎么办?
一个上蹿下跳的猴子~~~
回复 支持 反对

使用道具 举报

42

主题

568

帖子

0

精华

高级会员

Rank: 4

积分
784
金钱
784
注册时间
2010-12-19
在线时间
5 小时
发表于 2014-4-13 18:52:49 | 显示全部楼层
花了2天时间看了LZ的代码,还有《时间触发嵌入式系统设计模式》

LZ,你觉得这个标题: 自己写的这个。。。
是否合适?
一个上蹿下跳的猴子~~~
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
23
金钱
23
注册时间
2014-4-10
在线时间
0 小时
发表于 2014-4-13 20:18:05 | 显示全部楼层
牛x,标杆。等被超越。
。。。。。。
回复 支持 反对

使用道具 举报

42

主题

568

帖子

0

精华

高级会员

Rank: 4

积分
784
金钱
784
注册时间
2010-12-19
在线时间
5 小时
发表于 2014-4-14 10:19:12 | 显示全部楼层
回复【4楼】lsj9383:
---------------------------------
这个其实也用了状态机机制。
根据这个  
// The task is due to run
            SCH_tasks_G[Index].RunMe += 1;  // Inc. the 'Run Me' flag


SCH_tasks_G[Index].RunMe -= 1;   // Reset / reduce RunMe flag
一个上蹿下跳的猴子~~~
回复 支持 反对

使用道具 举报

42

主题

568

帖子

0

精华

高级会员

Rank: 4

积分
784
金钱
784
注册时间
2010-12-19
在线时间
5 小时
发表于 2014-4-14 10:24:22 | 显示全部楼层
回复【69楼】zhxzhx:
---------------------------------
非常赞同!
如果一个函数时间过长的话。
SCH_tasks_G[Index].RunMe += 1;  // Inc. the 'Run Me' flag 
计数标志就会一直累加。
然后再回主函数就会未到时间就多次执行。
比如:初始化模块,有时候模块MS就完成了,有时候需要S才能完成,需要等待。
一个上蹿下跳的猴子~~~
回复 支持 反对

使用道具 举报

42

主题

568

帖子

0

精华

高级会员

Rank: 4

积分
784
金钱
784
注册时间
2010-12-19
在线时间
5 小时
发表于 2014-4-14 10:53:39 | 显示全部楼层
回复【38楼】shr5791:
---------------------------------
开启看门狗跟OS有关,需要把这个功能关掉。
void SCH_Go_To_Sleep()
   {
   CON |= 0x01;    // Enter idle mode (generic 8051 version)

   // Entering idle mode requires TWO consecutive instructions 
   // on 80c515 / 80c505 - to avoid accidental triggering
   //PCON |= 0x01;    // Enter idle mode (#1)
   //PCON |= 0x20;    // Enter idle mode (#2)
   }

 CON |= 0x01;   IDL=1 单片机进入空闲(Idle)模式,除CPU不工作外,其余仍继续工作,在空闲模式下可由任一个中断或硬件复位唤醒。
所以加上看门狗要不要关闭此功能,看你喂狗的时间。
一个上蹿下跳的猴子~~~
回复 支持 反对

使用道具 举报

20

主题

468

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1681
金钱
1681
注册时间
2014-2-25
在线时间
229 小时
发表于 2014-4-18 13:10:57 | 显示全部楼层
很厉害,得学习学习了
回复 支持 反对

使用道具 举报

1

主题

20

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2013-7-2
在线时间
0 小时
发表于 2014-6-12 10:18:58 | 显示全部楼层
本来我也想写一个的,后来发现有一个成熟的 SmallRTOS51 (现在是周立功公司的了)。然后就直接用了,再加上自己的一个小小的程序库
回复 支持 反对

使用道具 举报

36

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2014-6-4
在线时间
89 小时
发表于 2014-7-29 14:29:22 | 显示全部楼层
这个不是操作系统,只是时间触发。相当于Linux中的软时钟!
一路狂奔!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2014-11-17
在线时间
0 小时
发表于 2014-12-8 10:02:03 | 显示全部楼层
多謝樓主分享   下載學習了。。。
Shaodong
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2014-8-18
在线时间
5 小时
发表于 2014-12-9 17:35:41 | 显示全部楼层
强人啊,厉害厉害。膜拜!
回复 支持 反对

使用道具 举报

6

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2014-12-11
在线时间
3 小时
发表于 2014-12-15 11:24:28 | 显示全部楼层
mark....
回复 支持 反对

使用道具 举报

86

主题

982

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1846
金钱
1846
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-3-2 11:01:27 | 显示全部楼层
强人   顶一个
合肥-文盲
回复 支持 反对

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2015-3-4 09:16:00 | 显示全部楼层
这里的任务管理是用数组来做的,如果是链表的方式来管理任务,两种方式各有什么优缺点呢?
个人感觉用链表的方式可以不用关心最大任务数,不执行的任务的内存也会被释放,节约空间,不知道这种方法的缺点是什么
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复 支持 反对

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
发表于 2015-3-26 11:11:10 | 显示全部楼层
回复【87楼】ianhom:
---------------------------------
当然链式的,主流
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复 支持 反对

使用道具 举报

9

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2014-11-5
在线时间
23 小时
发表于 2015-4-2 14:25:08 | 显示全部楼层
楼主南航的?现在还在学校吗,哪个校区
回复 支持 反对

使用道具 举报

9

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2014-11-5
在线时间
23 小时
发表于 2015-4-2 15:49:55 | 显示全部楼层
已经把代码全部看了一遍,虽然简单却比较实用,把51的资源也充分运用了。楼主整理的文档比较规范,方便了移植。
回复 支持 反对

使用道具 举报

23

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2014-3-22
在线时间
26 小时
发表于 2015-4-30 19:09:40 | 显示全部楼层
回复【8楼】shr5791:
---------------------------------===========================================================================================================================
void SCH_Update  这个函数里面当属于抢占式任务时执行SCH_tasks[Index].RunMe -= 1语句后,SCH_tasks[Index].RunMe 不就变成小于零得了吗?  谢谢解答
回复 支持 反对

使用道具 举报

头像被屏蔽

38

主题

382

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2012-12-5
在线时间
19 小时
发表于 2015-5-3 12:22:01 | 显示全部楼层
我已经把楼主的程序分别给STC89C52,STC12C5A60S2, STC15F2K60S2都修改了.89C52的调度用了T2,后两者用了T0,STC15F的T0还是不可屏蔽中断,号称可以作为SYSTICK.  三个片子都跑的挺欢快的. 接下来我要好好看看"时间触发嵌入式系统设计模式", 然后结合UCOSII抢占式的系统设计模式, 应该会学到不少吧.
回复 支持 反对

使用道具 举报

头像被屏蔽

38

主题

382

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2012-12-5
在线时间
19 小时
发表于 2015-5-3 12:25:49 | 显示全部楼层
低端的STC片子跑跑合作式调度器应该是合适的, 即使是混合式调度, 也不过是N个任务加1个VIP的抢占任务, STC是廉价老黄牛,哈哈!
回复 支持 反对

使用道具 举报

头像被屏蔽

38

主题

382

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2012-12-5
在线时间
19 小时
发表于 2015-5-3 12:28:59 | 显示全部楼层
一般要三个定时器, 一个做系统调度, 一个做串口波特率(STC12C5A60S2没有T2,直接用了独立波特率发生器), 还要一个做精确延时用.
所以DELAY函数我觉得没有必要.  因为合作或混合式调度, 关键的地方是要把每个任务的执行时间控制好, 否则就出问题了, 所以定时器必须用.
回复 支持 反对

使用道具 举报

头像被屏蔽

38

主题

382

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2012-12-5
在线时间
19 小时
发表于 2015-5-3 21:27:10 | 显示全部楼层
把STC15F2K60S2的程序改动一下,把串口1指定到P3.6,P3.7, 就可以用IAP15W4K61S4硬件仿真了.
回复 支持 反对

使用道具 举报

23

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
216
金钱
216
注册时间
2014-3-22
在线时间
26 小时
发表于 2015-5-4 19:31:09 | 显示全部楼层
void SCH_Update  这个函数里面当属于抢占式任务时执行SCH_tasks[Index].RunMe -= 1语句后,SCH_tasks[Index].RunMe 不就变成小于零得了吗?  谢谢解答
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2015-3-31
在线时间
40 小时
发表于 2015-5-4 21:59:03 | 显示全部楼层
默默下载,不敢说话
这么牛逼的人
余生请你指教!
回复 支持 反对

使用道具 举报

13

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-9-11
在线时间
15 小时
发表于 2015-6-11 23:02:54 | 显示全部楼层
mark一下
回复 支持 反对

使用道具 举报

1

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
84
金钱
84
注册时间
2015-5-23
在线时间
3 小时
发表于 2015-6-12 14:57:41 | 显示全部楼层
STC的实例有没有?几个按键输入再输出。
回复 支持 反对

使用道具 举报

83

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1991
金钱
1991
注册时间
2014-7-1
在线时间
188 小时
发表于 2015-6-27 09:25:07 | 显示全部楼层
默默路过,厉害的人怎么这么多,工作2年了,汗
做一个相信自己的人
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-22 16:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表