搜索
bottom↓
回复: 6

UCOS V2.86 对信号量的疑惑!

[复制链接]

出0入0汤圆

发表于 2009-7-13 15:45:33 | 显示全部楼层 |阅读模式
源程序
#include <includes.h>
                                
#define  TaskaStkLengh              256
#define  TaskbStkLengh              256
#define  TaskcStkLengh              256

OS_STK  TaskaStk[TaskaStkLengh];
OS_STK  TaskbStk[TaskbStkLengh];
OS_STK  TaskcStk[TaskcStkLengh];

OS_EVENT * DispSem;


void Taska (void * pdata);
void Taskb (void * pdata);
void Taskc (void * pdata);
static  void  App_DispScr_SignOn (void);


int main (void)
{
BSP_IntDisAll();                                            /* Disable all ints until we are ready to accept them.  */
OSInit();                                                   /* Initialize "uC/OS-II, The Real-Time Kernel".         */
BSP_Init();                                                 /* Initialize BSP functions.  */
App_DispScr_SignOn ();                                     
printf("OS Init OK!\r\n");
OSTaskCreate (Taska,(void*)0,&TaskaStk[TaskaStkLengh-1],7) ;
OSTaskCreate (Taskb,(void*)0,&TaskbStk[TaskbStkLengh-1],8) ;
OSTaskCreate (Taskc,(void*)0,&TaskcStk[TaskcStkLengh-1],9) ;
OSTimeSet(0);
OS_CPU_SysTickInit();                                       /* Initialize the SysTick.                 */
OSStart();                                                  /* Start multitasking (i.e. give control to uC/OS-II).  */
return 0;
}


void Taska (void * pdata)
{
INT8U err;
INT8U  i=0;
DispSem=OSSemCreate(1);              //建立信号量
while(1)
{
OSSemPend(DispSem,0,&err);           
i++;
if(i==100)i=0;
printf("\r\nTaska \r\n");
//OSTimeDly(500);
err=OSSemPost(DispSem);
}
}

void Taskb (void * pdata)
{
INT8U err;
INT8U  i=0;
while(1)
{
OSSemPend(DispSem,0,&err);
i++;
if(i==100)i=0;
printf("\r\n        Taskb \r\n");
err=OSSemPost(DispSem);
//OSTimeDly(600);
}
}

void Taskc (void * pdata)
{
INT8U err;
INT8U  i=0;
while(1)
{
OSSemPend(DispSem,0,&err);
i++;
if(i==100)i=0;
printf("\r\n                Taskc \r\n");
err=OSSemPost(DispSem);
//OSTimeDly(700);
}
}
程序的本意是让这个三任务交替执行.如果不注释掉延时可以达到交替执行的目的.但是注释掉打//地方的延时后程序只运行Taska .其它的任务都不会被执行.
难道   err=OSSemPost(DispSem); 后面或前面必需加   OSTimeDly(500);延时.

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2009-7-13 18:27:11 | 显示全部楼层
不是必须加
你先去内核看看OSSemPost(); 这个函数,然后理清你的程序中任务的运作和调度,你的问题就不是问题了

出0入0汤圆

发表于 2009-7-16 08:57:48 | 显示全部楼层
任务优先级不同,如果高优先级不调用类似Pend或者OSTimeDly之类的函数,低优先级是永远不能执行的。

出0入0汤圆

发表于 2009-12-13 20:43:47 | 显示全部楼层
二楼正解

出0入0汤圆

发表于 2009-12-14 22:45:41 | 显示全部楼层
信号量的初始化强烈建议在OSStart()函数调用前完成

出0入0汤圆

发表于 2009-12-14 23:15:28 | 显示全部楼层
楼主这个测试代码真够烂的
taska里先设置信号量为1
然后请求释放,就这么一直循环着玩
只要信号量有效
高优先级任务是永不阻塞的

出0入0汤圆

发表于 2012-12-31 11:01:16 | 显示全部楼层
任务优先级不同,如果高优先级不调用类似Pend或者OSTimeDly之类的函数,低优先级是永远不能执行的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-25 21:22

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

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