发新帖我要提问
12
返回列表
打印

本人写的一个基于ucosII的简单跑马灯例子

[复制链接]
楼主: machunshui
手机看帖
扫描二维码
随时随地手机跟帖
21
machunshui|  楼主 | 2008-7-5 16:30 | 只看该作者 回帖奖励 |倒序浏览

不要被名词迷惑

首先要搞清楚任务.

任务就是功能模块,完成一定的功能,其载体是函数.

例如,一个任务A,

定义(伪码):
void taskA()
{
while(1)
{
....代码,

等待信号量;//执行到此处,停止执行,保存任务状态,跳转道ucos的任务调度模块,ucos检查本任务以及其他任务的运行条件,不满足运行条件,睡眠态,满足运行条件的任务进行排队,捡优先级最高的任务执行

继续执行代码,

延时,//同上,启动usos调度,运行其他任务,等待延时条件满足,并且没有更高优先极任务处于就绪态,就能再次执行
}
}

除了任务自己放弃执行,从而启动ucos调度外,还有各种中断异步事件会随时启动ucos调度,从而导致当前任务暂停执行.


usos对任务的切换采取的是模拟中断的方式.(可以不必深究)

理解任务的执行过程是搞嵌入式os的基础.

使用特权

评论回复
22
jack.king| | 2008-7-5 16:52 | 只看该作者

听LZ上课,谢谢LZ

使用特权

评论回复
23
xil| | 2008-7-5 18:40 | 只看该作者

谢谢楼主

我也发表一下感想, 以前用顺序结构写程序,完全能知道硬件是如何运行的,现在用感觉OS完全不能知道硬件是如何运行的,程序与硬件完全被OS给隔断,所以我才说概念转不过来,因为习惯了硬件与程序相结合,但现在用OS写出来的东西却是完全看不到的,不踏实的感觉,呵呵

使用特权

评论回复
24
machunshui|  楼主 | 2008-7-5 19:05 | 只看该作者

比较

如果裸奔跑马灯,伪码如下:

void DispLed()
{
if(bDispFlag)
{
bDispFlag  = 0;
IO输出驱动LED显示;
}
}

void Interrupt()//timer中断函数
{
if(时间到)
bDispFlag = 1;
}

int main()
{
初始化;

while(1)
{
DispLed();
A();
B();
C();
}
}

DispLed()在循环里面不断检测时间是否到标志,到就驱动显示LED.


如果是OS:

void DispLed()
{
while(1)
{
等待信号量S1;//执行到此处,本任务就暂停,等信号量S1,即等定时时间到,此时系统并不闲者,而是执行A或者B或者C.
IO输出驱动LED显示;
}
}

void Interrupt()//timer中断函数
{
if(时间到)
 发送信号量S1;//推出中断时候,执行调度,也许进入中断之前正在执行A,B,或者C,如果,但是如果这个任务的优先级没有DispLed任务高,DispLed就有可能立即被执行,原来的任务暂停
}


int main()
{
初始化;


创建DispLed任务;
创建A任务;
创建B任务;
创建C任务;

}




驱动方面没什么不一样,
唯一不一样的是裸奔是每个功能函数依次检查执行条件,根据条件决定执行,如果执行必须执行完毕,不能暂停.

OS是每个任务停停走走而已,慢车给快车让路,快车给特快让路而已!

使用特权

评论回复
25
jack.king| | 2008-7-5 23:44 | 只看该作者

顶!!!!

LZ !
  看了你说的模型我发现**奔跑里面的标志到了OS成为信号亮传递
   若一个控制系统上面有20个反馈信号(也是标志)到OS里面怎么去处理
  是不是建立一个任务专门去扫描这个20个反馈信号,
   这个20个反馈信号是用全局变量来定义还是用别的方**

使用特权

评论回复
26
xil| | 2008-7-6 01:24 | 只看该作者

跑马灯任务间应该是并行处理的吧

但书上说任务是优先级最高的才能运行,那么优先级跟并行处理是不是矛盾了?

使用特权

评论回复
27
machunshui|  楼主 | 2008-7-6 09:20 | 只看该作者

建议楼上两位,找本书好好看看任务运行调度方式

建议楼上两位,找本书好好看看任务过程,任务调度方式.

把任务运行过程看到滚瓜烂熟,(攻坚一下,可能花不了一两天时间),你们的以上的问题自然就会没有了.


25楼,任务的建立一定要根据项目具体要求而定,建议好好看看

<<基于嵌入式实时操作系统的程序设计技术>>
周航慈 吴光文 著.

这确实也是具体项目里面要提前规划,比较重要的.


26楼,优先级跟并行处理是不矛盾的.

高优先级任务执行到因为等待资源,等待同步或者是调用延时暂停时候,低优先级又重新获得执行机会.

嵌入式OS,一般是抢占式的,不是单纯时间片的调度轮流执行,实际上ucos是没有时间片的调度功能的,也不需要.



使用特权

评论回复
28
jack.king| | 2008-7-6 11:47 | 只看该作者

谢谢了!我已经订了明天去拿

使用特权

评论回复
29
工控秀才| | 2008-7-8 13:54 | 只看该作者

跑马灯也需要OS吗

看来你的跑马灯做得够复杂了,不过OS至少也要在MCU资源大一点的MCU才可以跑吧,真的有兴趣的话,可以玩我的硬件操作系统,即使1K OTP,还可以跑8个任务呢,比别人介绍的2核更牛.当然2核也不错,比如做个和主程序不相干的红外发射部分等,2核我也有呀,欢迎联系!

使用特权

评论回复
30
myfaith| | 2008-7-8 20:50 | 只看该作者

请LZ再多普及一点OS的知识

谢谢

使用特权

评论回复
31
bob.xue| | 2008-7-9 11:34 | 只看该作者

工控秀才大叔

俺也往这个方向努力,能发个硬件操作系统给俺学习下吗?
bob.xue@163.com 谢谢啦(俺就知道论坛里面好人多 ^_^ )

使用特权

评论回复
32
3.3v| | 2008-7-21 18:17 | 只看该作者

周航慈的那5本书,那绝对是太经典了,太经典了!!

使用特权

评论回复
33
bxb_lhj| | 2008-7-24 09:09 | 只看该作者

一点认识

实际上没有什么,os和前后台都是为了要解决问题的。其实问题只有两个,一个是输入还有一个是输出。不管是什么系统只要解决这两者的关系就可以了。前后台。本质上,输入可以最终转化为两种,即时间与事件。事件就是你按了一次键盘或者鼠标或者是串口接收到数据等,时间就比较麻烦,我们在前后台情况下最难处理的就是它,而处理它是一般嵌入式产品所必须的。很大程度上OS就是为了解决这个问题而出现的。

使用特权

评论回复
34
gyt| | 2008-7-24 12:17 | 只看该作者

谢谢分享经验

使用特权

评论回复
35
machunshui|  楼主 | 2008-7-24 12:33 | 只看该作者

区别


打个比方,例如每天开10列火车,运送旅客从上海到北京.

前后台的做法是:

依次检查停在站台上的10列火车,哪一列满(假设的运行具备条件),发哪一列,车到北京后,在检查下一列,在发.

车出发后从上海到北京不能停,后二列车必须等前一列到达北京以后才能发车.


实时os的方法是,统计哪一列满,**价最好的那列车(优先级高),车发走后,如果另外一列满,票价更高,对不起,在路上的车先就地停下,让票价更高的车走,等到票价更高的车到达北京或者加油加水的时候,前面的车才能跑.

每列车都是停停走走.



运行方式区别是很大的.
os的高优先级任务具备运行条件总能及时得到响应.

使用特权

评论回复
36
whx8880| | 2008-7-24 12:55 | 只看该作者

那本书我也看了

看得时候觉得不错,但是看完还是没有操作系统的概念,可能是做过一两个程序再看就会明白很多

使用特权

评论回复
37
Swd21ic| | 2008-7-24 21:43 | 只看该作者

Re

machunshui还记得过年时咱讨论uCOS移植的问题么???

过了大半年了.uCOS-II内核算是很熟悉了..可就是没机会做应用..一直没在做新的项目..
郁闷呐.~

使用特权

评论回复
38
machunshui|  楼主 | 2008-7-25 15:16 | 只看该作者

38楼,我也是

38楼,我也是.

所以只能弄个几个不费力气的跑马灯了.

我弄了基于型号量,邮箱,消息队列的等几种调度方式的跑马灯,也算是演练一下ucos的基础知识.

使用特权

评论回复
39
zyok| | 2008-11-11 21:54 | 只看该作者

顶起来

使用特权

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

本版积分规则