打印

smartrtos单片机多任务操作系统发布,资源已可以下载

[复制链接]
楼主: singleywy
手机看帖
扫描二维码
随时随地手机跟帖
21
帮顶

使用特权

评论回复
22
singleywy|  楼主 | 2011-3-13 22:30 | 只看该作者
19# 红金龙吸味
谢谢支持,不过仍有不足之处,需要进一步改进

使用特权

评论回复
23
ayb_ice| | 2011-3-14 08:33 | 只看该作者
51的话还是上RTX51 TINY比较合适,占用资源少,最重要的是和KEIL无缝连接,对于有一定经验的人来说,裸奔比RTX51 TINY合适。。。
51程序中只要是能做到不调用较长延时(大于几百US级别)的话,CPU一般是绝对够用的。。。

使用特权

评论回复
24
刘前辈| | 2011-3-14 09:23 | 只看该作者
LZ提供了不少服务函数。能不能演示一下OS几个经典问题的解?假定第一个简单问题: 哲学家就餐问题。俺一直想不出来如何应用LZ的服务函数如何求解,LZ能否示意一下用自己的RTOS应该怎样编程。 见下图:



5个指示灯代表5个哲学家。显然,任何时候只能有一个或者2个灯亮,而且不可能是邻近的2个灯亮。

假定每个哲学家吃饭时间2秒钟,不需要其他条件了吧。

切盼指教。


使用特权

评论回复
25
wswh2o| | 2011-3-14 09:24 | 只看该作者
rtos如雨后春笋

使用特权

评论回复
26
singleywy|  楼主 | 2011-3-14 10:45 | 只看该作者
24# 刘前辈
恩,可以解答,原题是,5个哲学家围在一起吃饭,哲学家之间放着,叉子或汤勺,每个哲学家,仅当叉子与汤勺都未被使用时才能吃饭,是这样的么,LED灯就好比哲学家!
写好之后就上传,其实使用信号量,就可解决问题

使用特权

评论回复
27
singleywy|  楼主 | 2011-3-14 10:48 | 只看该作者
23# ayb_ice
恩,针对这个问题,我在帖子:https://bbs.21ic.com/frame.php?frameon=yes&referer=http%3A//bbs.21ic.com/iclist-11-1.html 做了相应的回复了

使用特权

评论回复
28
刘前辈| | 2011-3-14 11:30 | 只看该作者
切盼#26楼:题意基本如你所述。有人把它化为中国文化:每个哲学家之间放着一只筷子,只有左右拿起一双筷子才可以开吃。很好理解的题目。

俺不好解决,主要是信号量概念不太会用。LZ有这么多服务函数,正好借此契机向你学习了。

还有几个问题不好意思请教,一个一个慢慢来。
有本OS教材的前言说:你的一个小问题或者一个解决范例,就能使千万人获益。多谢LZ,做着一件能使千万人获益的事。

使用特权

评论回复
29
singleywy|  楼主 | 2011-3-14 12:31 | 只看该作者
本帖最后由 singleywy 于 2011-3-14 14:27 编辑

28# 刘前辈
奇怪,复制之后,格式都没有了
在开发板上,完美运行,源程序如下:
#include<reg52.h>
#include "Os_api.h"
#include"IOfor52.h"
void OsTimerISR()interrupt 1
{
OsIntEnter();
#if T0_TIMER_EN
ACC=((65536+8-SYS_CLK)%256);
TR0=0;
TL0+=ACC;
ACC=0;
CY=ACC&0x80;
ACC =((65536+8-SYS_CLK)/256)+ACC;
TH0+=ACC;
TR0=1; //时间管理
#endif
#if T2_TIMER_EN
#endif
#if TIME_EXPAND_EN
    OsRunTime--;
if(OsRunTime == 0){
  OsRunTime=TIME_COEFFICIENT-1;
  OsTimeTick();
}
#else
    OsTimeTick();
#endif
OsIntExit();   
}
void TaskA()
{
static uint8 i;
while(1)
{
  OsSemP(4,255);
  OsSemP(0,255);
  LED1_ON;
  OsTaskWait(DO_TMO,200);
  LED1_OFF;
  OsSemV(0);
  OsSemV(4);
}
}

void TaskB()
{
   while(1)
   {
  OsSemP(0,255);
  OsSemP(1,255);
  LED2_ON;
  OsTaskWait(DO_TMO,200);
  LED2_OFF;
  OsSemV(1);
  OsSemV(0);
   }
}
void TaskC()
{
while(1)
{
  OsSemP(1,255);
  OsSemP(2,255);
  LED3_ON;
  OsTaskWait(DO_TMO,200);
  LED3_OFF;
  OsSemV(2);
  OsSemV(1);
}
}
void TaskD()
{
while(1)
{
  OsSemP(2,255);
  OsSemP(3,255);
  LED4_ON;
  OsTaskWait(DO_TMO,200);
  LED4_OFF;
  OsSemV(3);
  OsSemV(2);
}
}
void TaskE()
{
while(1)
{
  OsSemP(4,255);
  OsSemP(3,255);
  LED5_ON;
  OsTaskWait(DO_TMO,200);
  LED5_OFF;
  OsSemV(3);
  OsSemV(4);
}
}
void TaskIdle()
{
  static uint8 i;
  LED0_ON;
  OsSemCreate(0,1);
  OsSemCreate(1,1);
  OsSemCreate(2,1);
  OsSemCreate(3,1);
  OsSemCreate(4,1);
  while(1)
  {
   i++;
  LED0=LED0^1;
  }
}
void main()
{
OsTaskCreate(0,(uint16)TaskA);
OsTaskCreate(1,(uint16)TaskB);
OsTaskCreate(2,(uint16)TaskC);
OsTaskCreate(3,(uint16)TaskD);
OsTaskCreate(4,(uint16)TaskE);

OsTaskStart(5,(uint16)TaskIdle);
}

使用特权

评论回复
30
singleywy|  楼主 | 2011-3-14 12:43 | 只看该作者
本帖最后由 singleywy 于 2011-3-14 14:20 编辑

上面的程序是正确的

使用特权

评论回复
31
hxy6951| | 2011-3-14 13:00 | 只看该作者
我很落伍了。

使用特权

评论回复
32
singleywy|  楼主 | 2011-3-14 14:27 | 只看该作者
刚才源文件设置错误,原以为不可以,的确是可以的,源程序如下,请刘前辈过目;不过,需要修改几个值,TASK_ACTIVE_MAX 为6,SEM_MAX为6,还有就是TASK_STACK_MAX 为90,以及,os_sche.a51中TASK_ACTIVE_MAX的值;

开始的时候没有修改os_sche.a51的TASK_ACTIVE_MAX导致,程序不能运行而出现错误,现在修改之后,可以在开发板上完美运行

使用特权

评论回复
33
刘前辈| | 2011-3-14 16:43 | 只看该作者
本帖最后由 刘前辈 于 2011-3-14 16:56 编辑

我试试。LZ是说需要创建5个信号量?
还有,我现在没细看,恕我瞎说:
void TaskB()
{
   while(1)
   {
  OsSemP(0,255);    // 死锁条件——自己占有一部分资源,
  OsSemP(1,255);    //   又等待别人已经占有的部分资源。互相永远等待。
   LED2_ON;
   ……
    ……

  
注意红笔所注,LZ是表示:当OsSemP(0,255);  表示这个哲学家拿到了一只筷子0,正在等待另一只筷子1;——OsSemP(1,255);  ?   这里错了吧。
     很简单,如果每个哲学家都处在这个状态,5个人每人拿起一只筷子,等待另一只,结果谁也吃不上饭。——死锁。
     或许你用 OsSemP(0,255);  表示其他状态,例如表示我并不拿起一只筷子,我只进入等待第二只筷子状态……,那又应该怎么写?

     世界性经典问题,好像没这么简单。


       继续请教,……

使用特权

评论回复
34
电源之家| | 2011-3-14 16:48 | 只看该作者
支持

使用特权

评论回复
35
电源之家| | 2011-3-14 16:48 | 只看该作者
加油

使用特权

评论回复
36
电源之家| | 2011-3-14 16:49 | 只看该作者
感谢分享

使用特权

评论回复
37
电源之家| | 2011-3-14 16:49 | 只看该作者
感谢分享

使用特权

评论回复
38
电源之家| | 2011-3-14 16:50 | 只看该作者
感兴趣中

使用特权

评论回复
39
刘前辈| | 2011-3-14 17:00 | 只看该作者
本帖最后由 刘前辈 于 2011-3-14 17:16 编辑

互相讨论,即使俺说的不对,经过文跃兄长的指教,互相都能有收获。


开始的时候没有修改os_sche.a51的TASK_ACTIVE_MAX导致,程序不能运行而出现错误,现在修改之后,可以在开发板上完美运行


LZ的完美运行:5个哲学家任务是并发执行的。LZ是顺序调度了?——5个人永远按一个顺序轮流吃饭?不是,5个人饥饿程度是随机的。


使用特权

评论回复
40
singleywy|  楼主 | 2011-3-14 17:06 | 只看该作者
本帖最后由 singleywy 于 2011-3-14 17:45 编辑

33# 刘前辈
您说的,死锁问题,我已经考虑到了,刘前辈,请注意我信号量申请的顺序,以及释放的顺序,如果单纯的从结构看,似乎会形成蛇头蛇尾相连的死锁状态,不过,这里有特殊的地方就是,任务启动的时,时序问题,开始时,任务启动顺序为TaskIdle,TaskA,TaskB,.....,实际上赋予了初始值,逐步分析会发现,不会造成互相等待的局面;

再次说明一下,如果改变申请的顺序,灯亮的方式也不同

PS:OsSemP(0,255)表示,获取信号量0,如果不能获取,则插入等待列表,直至信号到来,第二个参数的含义是,0:表示无等待,255:表示无限等待,其他值:表示等待相应的系统时钟周期

使用特权

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

本版积分规则