OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9254|回复: 8

UCOSII信号量有问题,CNT值会自己变化

[复制链接]

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
发表于 2013-1-11 09:39:12 | 显示全部楼层 |阅读模式

我移植通过了,创建任务、删除任务这些实验也做过,没问题,然后我就准备来学习信号量,就发现问题了。
//这个是起始任务
void TaskStart(void * pdata)
{
 pdata = pdata;
 Sem_Event = OSSemCreate(1);   //创建信号量 
 OSTaskCreate(MY_STK, (void * )0,(OS_STK *)&TaskMy_STK[LED_STK_SIZE], LED_TASK_Prio);
 OSTaskCreate(YOU_STK, (void * )0,(OS_STK *)&TaskYou_STK[LED_STK_SIZE], LED1_TASK_Prio);
 err=OSTaskDel(OS_PRIO_SELF);//删除自己 OSTaskSuspend(START_TASK_Prio);
 } 
我在开始任务中创建了一个信号量  Sem_Event = OSSemCreate(1);    
   在运行完 TaskStart任务之后,就进入MY_STK任务。    MY_STK  优先级比   YOU_STK  高
如果这个创建信号量放在 MY_STK,YOU_STK前面创建的话, 信号量的(tpye)类型也会发生变化(即不是Sem信号类型了)。
   这结果是我跟踪程序的时候发现的:
     在MY_STK任务的信号量请求和释放的函数中,程序运行了下列     return (OS_ERR_EVENT_TYPE);  这行语句,说明了信号量的类型发生改变了     如果我删除了  err=OSTaskDel(OS_PRIO_SELF);//删除自己 OSTaskSuspend(START_TASK_Prio);   这条语句的话,信号量类型又不会发生变化
      这到底是怎么回事的呢? 

     if (pevent->OSEventType != OS_EVENT_TYPE_SEM) {   /* Validate event block type                     */
        return (OS_ERR_EVENT_TYPE);
    }

void MY_STK(void * pdata)
{
 while(1)
 {     
 
   OSSemPend(Sem_Event,0,&err);   //请求信号量
   GPIO_ResetBits(GPIOA,GPIO_Pin_8);
   OSSemPost(Sem_Event);          //发送(释放)信号量
   OSTimeDlyHMSM(0,0,0,250);

 } 
}

这个任务的    OSSemPend(Sem_Event,0,&err);   //请求信号量    前面 加上一个测量信号量Sem_Event->OSEventCnt的值发现,我都还没请求信号量的呢,OSEventCnt的值就变成0了。

下面这个是YOU_STK任务
void YOU_STK(void * pdata)
{
 while(1)
 {    
   OSSemPend(Sem_Event,0,&err);       //请求信号量
   GPIO_ResetBits(GPIOD,GPIO_Pin_2);
   OSSemPost(Sem_Event);          //发送(释放)信号量
   OSTimeDlyHMSM(0,0,0,250);
 } 
}

经过我初步验证后  貌似是   每次切换任务的时候   信号量的CNT值就会发生变化。
     还有,我在MY_STK 任务的  OSSemPost(Sem_Event);          //发送(释放)信号量  后检测到了CNT的值会变为1,但是经过
OSTimeDlyHMSM(0,0,0,250);  之后跳入YOU_STK任务的时候,在  OSSemPend(Sem_Event,0,&err);       //请求信号量
之前来检测CNT的值,发现又变为0了,真奇怪
         我没发现任务切换和信号量有什么关系啊。     
       我百思不得其解,这是什么原因呢?
  我粗略的跟踪了下程序,发现没有什么和信号量等变化有关的函数和变量。
 
     请各位兄弟姐妹门忙帮解决一下

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-11 10:49:13 | 显示全部楼层
战舰板的信号量和邮箱实验,你可以在这个上面测试下。
这个代码是经过我们验证的,无问题。

实验54 UCOSII实验2-信号量和邮箱.rar

254.98 KB, 下载次数: 777

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
 楼主| 发表于 2013-1-11 11:00:59 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我的UCOSII是自己移植的,会不会有移植缺陷造成的啊?
    可是任务的切、创建和删除,与信号量里面的各个参数应该是没有变化的吧。
  怎么我挂起 开始任务或者删除开始任务,都会导致信号量类型的变化;
    还有把信号量的创建放到任务创建的前面和后面,都会信号量发生改变,导致实验结果的不同。
 
   最后一个是   任务的切换 怎么会导致信号量CNT计数值的改变?

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-11 11:07:06 | 显示全部楼层
估计是你跟踪方法有问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
 楼主| 发表于 2013-1-11 11:17:41 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
我直接用if判断CNT的值,然后用LED来显示结果,也得到的是CNT值在切换任务的时候发生了变化。
   在信号量请求和释放的时候,CNT值变化是正常的,可是一经过 OSTimeDlyHMSM(0,0,0,250);
 这个语句切换出去的时候,在另一个任务的开头,也用if语句和LED显示来测量CNT的值,就发生了改变了。比如在 MY_STK任务切换出去之前 CNT值是 1 , 在YOU_STK任务的开头测CNT的值,就变为0了


    还有,我直接把你发过来的 UCOSII 文件夹里面的东西移植到我程序里面,发现有118个问题,而且都是说  UCOSII.H与别的.C文件里面声明有重复的,类似下面这个,全都是这种错误
  UCOSII实验二.axf: Error: L6200E: Symbol OSTimeGet multiply defined (by ucos_ii.o and os_time.o).



    好像我解决了,貌似是建立2个任务的时候堆栈没有减一造成的
OSTaskCreate(MY_STK, (void * )0,(OS_STK *)&TaskMy_STK[LED_STK_SIZE], LED_TASK_Prio);
 OSTaskCreate(YOU_STK, (void * )0,(OS_STK *)&TaskYou_STK[LED_STK_SIZE], LED1_TASK_Prio); 

改成
OSTaskCreate(MY_STK, (void * )0,(OS_STK *)&TaskMy_STK[LED_STK_SIZE-1], LED_TASK_Prio);
 OSTaskCreate(YOU_STK, (void * )0,(OS_STK *)&TaskYou_STK[LED_STK_SIZE-1], LED1_TASK_Prio); 
这样,貌似就OK了,我再去测试一下。
回复 支持 反对

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
 楼主| 发表于 2013-1-11 11:34:33 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
没错原子哥,就是那创建任务的时候堆栈没有减一造成的。
   具体为什么没减一会造成这样的原因,我也不太清楚。

  请看到这文章的兄弟姐妹们也多多注意一下,以后用上UCOSII的时候,创建任务一定要小心谨慎啊,一定要把堆栈减一啊,否则出现莫名其妙的问题,会找晕人的。


        最后再感谢一下原子哥。

  还有,为什么移植你发的UCOSII文件夹过来,会出现那么多 重复定义的问题啊?我移植mini板的时候和UCOSII2.52源码的时候也是出现上百个这种重复定义的问题。还不知道怎么解决。
   然后我就用不不清晰介绍的那种版本移植去了,然后没发现重复定义的问题
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-11 15:28:15 | 显示全部楼层
回复【6楼】颓废ю小寶:
---------------------------------
我怎么没发现报这种错误啊?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

23

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2012-10-24
在线时间
0 小时
 楼主| 发表于 2013-1-11 15:40:21 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
不知道哦,我是光光把UCOSII文件夹里面3个子文件夹拿出来弄到我自己的程序当中的,发现会报错,是重复定义的问题,而且都是UCOS_II.H与各个.c源文件中一些函数重复定义。
    我用mini板中的UCOSII文件夹也是的,而且我自己到网上下载的UCOSII2.52版的源文件移植也出现相同的问题,只是问题个数不同。
   我尝试过把UCOS_II.H文件中有关重复定义的函数注释掉,但是问题也没减少,我也不太清楚是怎么回事。会不会头文件重复包含造成的?

    最后我是参考了不不清晰的解说,然后下载2.8几版本的UCOSII,然后把例程移植过来,才成功滴。移植2.8几版本的过程却没有发现那个重复定义的报错
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-11 16:40:20 | 显示全部楼层
哦哦,我现在都用2.91.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 11:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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