搜索
bottom↓
回复: 5

大家来看看,这篇文章里的ucos用法正点不? 我觉得跟前后台的设计思路一样呢,rtos到底应

[复制链接]

出0入0汤圆

发表于 2008-12-25 20:30:08 | 显示全部楼层 |阅读模式
2.3 软件方案

  本系统选用uCOS-II操作系统,将其移植到所选的MCU上。在main中建立一个起始任务StartTask。



int main (void){

OSInit();

OSTaskCreate((void*)StartTask,(void*)0X00,(OS_STK ) &StartTaskStk[START_TASK_STK_SIZE-1],0);

OSStart();

return 0;

}



起始任务中,首先建立一系列的信号量和邮箱:



Sem_Int_Ring = OSSemCreate(0) ;唤醒振铃任务

Sem_Any_SMTask = OSSemCreate(0) ;唤醒短消息任务

Sem_Int_Keyboard = OSSemCreate(0) ;唤醒键盘任务

Sem_Int_ClockTask = OSSemCreate(0) ;唤醒时钟中断

Mbox_Any_UI= OSMboxCreate((void *)0);唤醒UI任务

Mbox_Int_Hook= OSMboxCreate((void *)0);唤醒摘挂机任务



然后,用OSTaskCreate()函数建立6个任务。任务名分别为:HandsetTask(摘/挂机任务)、RingTask(响铃任务)、 KeyTask(键盘任务)、SmTask(短消息任务)、UITask(用户界面(UI)任务)、ClockTask(时钟任务)。最后,在起始任务中将它本身删除掉。



   1. 摘/挂机任务

        当拿起听筒或放下听筒时,就产生中断。在中断中,调用 OSMboxPost(Mbox_Int_Hook,Msg_Int_Hook)来唤醒摘/挂机任务,同时清除中断标志。 Msg_Int_Hook[0]=0x00为摘机,Msg_Int_Hook[0]=0x01为挂机。

        摘/挂机任务不断调用 OSMboxPend(Mbox _Int_Hook,0,&err)来获得信箱。获得信箱后,根据Msg_Int_Hook[0]中的值,就知道是摘机还是挂机,然后调用 OSMboxPost(Mbox_Any_UI,Msg_Any_UI)来唤醒UI任务。Msg_Any_UI [0]=任务号1,Msg_Any_UI [1]=0x00为摘机,Msg_Any_UI [1]=0x01为挂机。

        在挂机的时候,如果先前是在响铃的时候摘机的,那么UI任务把它当做已接来电处理;如果不是在响铃的时候摘机的,那么在挂机的时候把它当做已拨电话处理。

   2. 振铃任务

        当铃声来到时,就产生中断。在这个中断中,调用OSSemPost(Sem_Int_Ring)来唤醒振铃任务。

        响铃任务调用OSSemPend(Sem_Int_Ring,0,&err)来获得信号量。获得信号量后,就把下传的号码接收下来;根据号码就可以知道是短信息,还是普通电话。

               当是短信息时,就调用OSSemPost(Sem_Any _SMTask)来唤醒短消息任务;

               如果是电话,就响铃,同时调用OSMboxPost(Mbox_Any_UI,Msg_Any_UI)来唤醒UI任务。这时Msg_Any_UI[0]=任务号2,从Msg_Any_UI[1]开始存的是来电时间和电话号码,然后调用 OSSemPend(Sem_Int_Ring,RING_RECV_TIMEOUT,&err),来延时响铃一段时间。

        如果在这段时间内没有接电话,那么必然会超时,于是就清除铃声中断,同时调用OSMboxPost(Mbox_Any_UI,Msg_Any_UI)来唤醒UI任务,这时Msg_Any_UI[0]=任务号2,Msg_Any_UI[1]=0xff表示铃声结束。UI任务把它当作未接来电处理。

        如果在这段时间内接电话,就必然唤醒摘/挂机任务。如果从响铃到对摘/挂机任务处理完毕所需要的总时间还没有到RING_RECV_TIMEOUT,那么,当时间到了,UI任务也会收到铃声结束的消息;但此时,UI任务不对它做任何处理。

        响铃任务如何区别是正常的电话还是信息中心的来电信息呢?其实很简单。信息中心也是一个终端,是由一个特定的号码来确定的。就像用不同的电话号码来区别不同的用户一样。这样响铃任务就可以根据电话线上下传的号码,来确定是哪种情况了。

   3. 键盘任务

        有按键按下时,产生一中断,在中断服务子程序中调用OSSemPost(Sem_Int_Keyboard)来唤醒键盘任务,同时清除中断标志。键盘任务调用OSSemPend(Sem_Int_Keyboard,0,&err)来获得信号量。获得信号量后,键盘任务将调用 OSMboxPost(Mbox_Any_UI,Msg_Any_UI)唤醒UI任务。

        Msg_Any_UI[0]为任务号3, Msg_Any_UI[1]为键值。

   4. 短消息任务

        该任务调用OSSemPend(Sem_Any_SMTask,0,&err)获得信号量。当获得信号量后,通过标志位判别是准备上传数据还是下传数据。

        ① 下传数据时,将下传的数据放在recv_buf[]中,然后调用OSMboxPost(Mbox_Any_UI,Msg_Any_UI)唤醒UI任务。 Msg_Any_UI [0]=任务号4,从Msg_Any_UI [1]开始存的是从recv_buf[]中筛选过的数据。这是在连上后从信息中心下载信息的情况,其中Msg_Any_UI [1]存的是信息的种类号,种类号都是大于0x80H小于0xFFH的;没有连上信息中心或者是连上之后完成任务。这时recv_buf[1]存的就是 0xff;如果刚刚连上,就在recv_buf[1]存0x01。

        ② 如果用户需要发送短消息任务,先将信息存在Msg_send_buf[]中,然后UI任务调用OSSemPost(Sem_Any_SMTask),将该任务激活。该任务提取存在Msg_send_buf[]中的信息后,包装后保存在send_buf[],然后将其发出去。

   5. 用户界面任务

        UI任务一直在等待消息。当它被激活时,根据存在Msg_Any_UI[255]中的不同数据进行不同的处理。详述见“3.用户界面任务详述”。

   6. 时钟任务

        单片机每10ms产生一个中断,在这个中断服务子程序中,对clock_count减1。当减为0时,就调用 OSSemPost(Sem_Int_ClockTask)唤醒时钟任务;同时,clock_count重新回到100。这样每1s,就会调用一次 OSSemPost(Sem_Int_ClockTask)。时钟任务调用 OSSemPend(Sem_Int_ClockTask,0,&err)获得信号量。当获得信号量时,就更新时间。如果在23:59:59的时候更新时间,那就要同时更新日期和星期。如果此时UI任务处于待机状态,时钟任务就调用 OSMboxPost(Mbox_Any_UI,Msg_Any_UI)来唤醒UI任务。Msg_Any_UI[0]为任务号0x06。时钟任务只是负责更新时间,显示时间是由UI任务在待机的时候来完成的。



3 用户界面任务详述

  在所有这些任务中,用户界面任务做的工作相对比较烦琐。首先,根据放在Msg_Any_UI[255]中的第一个字节,判断是什么任务激活了本任务。



   1. 如果是摘/挂机任务激活的,再判断第二个字节的值,根据值的不同知道是挂机还是摘机。如果是挂机,就在液晶上显示待机画面。如果是摘机,就在液晶上显示打电话图标和有关的字样,并等待键盘任务送来的数字键,将其显示出来。(只有主动向外打电话才显示数字键,在接电话按数字键转接时不显示数字键。)

   2. 如果是振铃任务激活的,就将Msg_Any_UI[255]中接下来的来电号码、时间和来电图标显示在液晶上。

   3. 如果是键盘任务激活的,就根据3号任务放在Msg_Any_UI[255]中的键值和当前的工作模式做不同的处理。

              如果是在摘机模式下,就只是响应数字键和#*键,并每按一个键就通过5号任务号码发出去。

              如果是在挂机模式下,那么,就可以响应数字键和有关操作菜单的键(包括进入各个子菜单的快捷键、上下键、左右键、返回上级菜单键、快速返回待机画面的键、确定键、删除键、拼音输入法/字母输入法/数字输入法/短语输入法切换键)。各个菜单是不同的状态,通过键值和原来的状态可以知道现在该进入什么状态。然后根据新得到的状态,进行相应的液晶刷新和完成相应的功能。比如添加、删除、查找电话簿;添加、删除、查找通话记录;编辑短消息并发送出去,删除草稿箱里的短消息;写记事本,设置闹钟、时间、日期,设置信箱的密码,设置信息中心的号码等。

              如果是在与信息中心的连接模式下,那么就可以响应上下键,确定键(进入下级菜单),返回上一级菜单,通过选择返回这个选项来实现。

   4. 如果是短消息任务激活的,就根据Msg_ Any_UI[255]中的命令码,来确定该信息的模块种类是信息下载管理模块、信息上传管理模块、信息询问管理模块,或者是屏幕信息输出管理模块,然后,再根据Msg_Any_UI[255]中接下来的信息做相应的处理。

   5. 如果是时钟任务激活的,UI任务就刷新界面上的时间、日期和星期这些信息。



4 调试环境与调试成果

  此程序用EPSON公司的S1C88 C-Compiler编译器编译,用EPSON公司的ICE88UR 的E0C88系列在线仿真器进行仿真。在仿真器下仿真完毕后,再脱机运行。试验结果令人满意,达到了预期的效果。 

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2008-12-27 14:35:06 | 显示全部楼层
可惜ucos-II不是免费的,只能自己玩玩不能用到最终产品里面。

出0入0汤圆

发表于 2008-12-27 14:08:54 | 显示全部楼层
我首先看了UCOS-II,看得晕晕糊糊,因此决定看SMALL RTOS51 1.2

基本上了解了RTOS的工作原理,RTOS的工作机理:

    无非是用软件的方式,人为模拟一次硬件中断,

    (1)、即保存当前任务的工作寄存器到当前任务的私栈

    (2)、保存当前任务的断点PC指针到当前任务的私栈

    (3)、从高优先级任务的堆栈中取出高优先级的工作寄存器

         然后将该工作寄存器的值依次--->CPU工作寄存器

    (4)、从高优先级任务的堆栈中取出高优先级任务的断点PC指针

    (5)、最后跳转到PC处。

准备回过头来重新学习UCOS-II,因为SMALL RTOS不稳定。

出0入31汤圆

发表于 2008-12-26 18:24:24 | 显示全部楼层
顶顶,刚学操作系统,还不知道怎么分配任务呢

出0入0汤圆

发表于 2008-12-26 13:13:35 | 显示全部楼层
我刚学完RTOS,还没有时间编写过相应的应用代码。

    假如:在前后台中,当串口接收到一条消息,要求你将消息中包含的数值写到 EEPROM中。

   用RTOS如何实现。

出0入0汤圆

发表于 2010-5-11 10:37:19 | 显示全部楼层
markk
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 19:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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