搜索
bottom↓
回复: 17

关于ucOS的信号量、邮箱、消息队列的问题

[复制链接]

出0入0汤圆

发表于 2011-12-14 09:11:07 | 显示全部楼层 |阅读模式
在ucOS中提供的任务见通信的机制有信号量、邮箱和消息队列等几种方式,我现在要实现以下功能,觉得用着几种方式都不行,可能是我对ucOSll的理解还不到位,特把疑问贴出来,期待各位大牛们指点解惑。
   我要实现的功能很简单,就是做一个实时显示的按键计数器,显示用8位7段数码管扫描显示的方式,按键用中断方式。具体的功能就是按一下按键,数码管显示的数加1,就是实现这么一个功能。我现在初步用的是信号量的方式,在按键中断处理函数里面释放一个信号量,显示函数里面接收到这个信号量就把显示的数据加1.可是现在的问题是,数码管的显示用的是扫描的方式,需要不停的扫描显示。可是等待按键的信号量把这个任务挂起了,不能实时扫描显示。
   实现这种功能是不是就不能用信号量、邮箱、消息队列啊,是不是必须得用全局变量啊!不过又感觉用信号量、邮箱、消息队列应该能实现,就是不知道具体怎么实现,期待各位大牛指点!

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

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

出0入0汤圆

发表于 2011-12-14 09:25:26 | 显示全部楼层
你要是一定要用信号量呢,就多建立一个任务吧,

一个任务专门来扫描数码管,另一个任务专门完成你的加一。

出0入0汤圆

 楼主| 发表于 2011-12-14 17:51:25 | 显示全部楼层
回复【1楼】GNMXD
-----------------------------------------------------------------------

这样的话 和用全局变量有什么不同,有什么好处呢?

出0入0汤圆

发表于 2011-12-14 18:23:22 | 显示全部楼层
可以用你这个模型的。
你扫描的频率不会很快,估计也是ms级别的,估计你不会一直都在扫描,例如,显示频的刷新频率就是60Hz,够用了。所以你不妨在等待一个信号量的时候,设置一个超时的限制,然后就超过这个限制时,你就继续按原值进行扫描。
估计你是想把这些时分秒值作为局部变量不?
这样你就可以由中断出来后,发送一个message box就可以了,或者sem信号也可以。

全局变量和这些信号量的不同就是,全局变量也可以由多个人来维护,但也会导致冲突的,信号量机制对这些作了临界保护,并且能引发调度。

出0入0汤圆

发表于 2011-12-14 18:26:32 | 显示全部楼层
扫描就用OSTimeDly好了,不能用Pend的话就用OSSemAccept()

出0入0汤圆

发表于 2011-12-14 19:21:05 | 显示全部楼层
回复【楼主位】zhongjun 中军
-----------------------------------------------------------------------

OSxxxAccept()函数不像OSxxxPend那样,其不用等待,也不会挂起,有没有信号都会执行下面的程序,但是是否来信号需要if判断一下。

出0入0汤圆

发表于 2011-12-14 20:24:38 | 显示全部楼层
你可以使用不等待的信号量申请方式,然后利用err来判断是否接收到的信号量,如果接受到了,那就+1,否则就不增加。

出0入0汤圆

发表于 2011-12-15 00:10:27 | 显示全部楼层
你可以把处理这个信号量的任务的优先级设为最高等级,这样实时性会很不错,最多就是一个任务切换的时间。

出0入0汤圆

 楼主| 发表于 2011-12-15 21:56:48 | 显示全部楼层
回复【3楼】nazily215
-----------------------------------------------------------------------

大侠 ,我明天试试你这个思路 然后在向你请教啊

出0入0汤圆

 楼主| 发表于 2011-12-15 21:59:28 | 显示全部楼层
----------------------------------------------------

回复【4楼】schwarz
-----------------------------------------------------------------------

回复【6楼】tiancaigao7 天才杨威利
-----------------------------------------------------------------------

回复【4楼】schwarz
-----------------------------------------------------------------------

回复【3楼】nazily215
-----------------------------------------------------------------------

回复【5楼】ustbyf
-----------------------------------------------------------------------

回复【6楼】tiancaigao7 天才杨威利
-----------------------------------------------------------------------

谢谢楼上的给为大侠,今天去学了一天驾校,明天按各位大侠的指点来试验一下,然后回来交流啊

出0入0汤圆

 楼主| 发表于 2011-12-16 14:13:44 | 显示全部楼层
回复【3楼】nazily215
-----------------------------------------------------------------------

回复【5楼】ustbyf
-----------------------------------------------------------------------

我现在这么根据《μC/OS-II V2.90 Reference Manual》 这么编写了一段程序,怎么提示不能类型转换呢,恳求大侠指点
OS_EVENT *Key_Set_Box ;

Key_Set_Box = OSMboxCreate((void *) 0);

static void App_TaskLed(void *p_arg)

{
  void* pmsg;
  INT8U Set;      

  
   while (DEF_TRUE)
  {
    pmsg = OSMboxAccept(Key_Set_Box);
    if( pmsg != (void*)0)
    {
      Set = (INT8U)(* pmsg); //错误就出在这里,我觉得应该对啊,pmsg是void*型,我通过)(* pmsg)取出指针里面的内容,利用(INT8U)强制类型转换,怎么就错误呢?
    }
     
  }
  
  
}

void ISR_EXTI9_5_Handler(void)
{
  INT8U err , Isr_Set = 2, Isr_Shift = 2;

  if(EXTI_GetITStatus(EXTI_Line9) != RESET)                  /* 按键set */
  {
    OSTimeDly(10);
    if(!(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)))
    {
      OSTimeDly(10);
      if(!(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)))
      {
        Isr_Set = 1;
        err = OSMboxPost(Key_Set_Box, (void*)Isr_Set);        
      }
    }
    EXTI_ClearITPendingBit(EXTI_Line9);                    /* Clear the EXTI Line 9 */
}
IAR编译提示错误如下:Error[Pe171]: invalid type conversion D:\ucOS\2011-12-16_MessBox\App\app.c 175

出0入0汤圆

发表于 2011-12-19 20:14:25 | 显示全部楼层
INT8U *Set;





Set = (INT8U*)(pmsg);

出0入0汤圆

发表于 2011-12-22 23:56:05 | 显示全部楼层
.

出0入0汤圆

发表于 2013-11-7 14:46:02 | 显示全部楼层

出0入0汤圆

发表于 2013-11-9 17:44:21 | 显示全部楼层
等待按键中断的信号量不用一直一直等待啊···比如每10ms检测一次信号量就好啦,剩下的9ms都用来扫描数码管,人的眼睛分辨不出差别的。

出0入0汤圆

发表于 2013-12-9 23:03:50 | 显示全部楼层
路过              

出0入0汤圆

发表于 2013-12-16 15:14:42 | 显示全部楼层
来取经~~~~~~

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-21 03:33

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

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