OpenEdv-开源电子网

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

ucos-iii 产生同步信号量请教下 ???

[复制链接]

259

主题

806

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2012-10-28
在线时间
353 小时
发表于 2015-9-23 21:23:56 | 显示全部楼层 |阅读模式
5金钱
CPU_BOOLEAN  BSP_OS_SemCreate (BSP_OS_SEM       *p_sem,
                               BSP_OS_SEM_VAL    sem_val,
                               CPU_CHAR         *p_sem_name)
{
    OS_ERR     err;




    OSSemCreate((OS_SEM    *)p_sem,
                (CPU_CHAR  *)p_sem_name,
                (OS_SEM_CTR )sem_val,
                (OS_ERR    *)&err);



    if (err != OS_ERR_NONE) {
        return (DEF_FAIL);
    }



    return (DEF_OK);
}







static  void  AppObjCreate (void)
{
 /* 创建同步信号量   1 */
    BSP_OS_SemCreate(&SEM_KEY,
      0,
      (CPU_CHAR *)"SEM_KEY"); 



 /* 创建同步信号量   2*/
    BSP_OS_SemCreate(&SEM_RTC,
      0,
      (CPU_CHAR *)"SEM_RTC"); 



}



问题如下:

产生同步信号量 1 ,2 兑换先后顺序,则产生的同步信号量不起作用,也就无效,但是按照上面的先后顺序,产生的同步信号量可以正常使用,这是何故啊 ???

rtc的同步信号量是在rtc的中断函数里面进行发送,美妙发送一次,key是通过按键发送的,

一个任务等带rtc信号量,另外一个任务等待key信号量。

最佳答案

查看完整内容[请看2#楼]

1、信号量有没有效和你创建的顺序没有关系的。 2、如果没有效果的话基本上是任务逻辑的问题。仔细分析一下你的任务代码
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-9-23 21:23:57 | 显示全部楼层
1、信号量有没有效和你创建的顺序没有关系的。
2、如果没有效果的话基本上是任务逻辑的问题。仔细分析一下你的任务代码
开往春天的手扶拖拉机
回复

使用道具 举报

259

主题

806

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1887
金钱
1887
注册时间
2012-10-28
在线时间
353 小时
 楼主| 发表于 2015-9-26 09:32:41 | 显示全部楼层
extern OS_SEM   SEM_RTC;
void RTC_WKUP_IRQHandler(void)
{
        OS_ERR  err;
        if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
        {
                RTC_ClearITPendingBit(RTC_IT_WUT);
                EXTI_ClearITPendingBit(EXTI_Line22);
                
                OSIntEnter();                                        // 这个地方使用关闭中断效果与这个一样的

                        OSSemPost((OS_SEM *)&SEM_RTC,
                                                                (OS_OPT  )OS_OPT_POST_1,
                                                                (OS_ERR *)&err);                

                OSIntExit();
        } 
}

按照上面创建信号量的1、2顺序,返回时ok,创建信号量的顺序颠倒一下 2、1,返回不正确,截图如下:

正确:
 


不正确:
 


程序除创建信号量的1、2 顺序更改外,其他不做任何更改。


现在貌似发现问题所在了啊,
在创建信号量时,如果创建信号量的顺序1、2互换为 2、1,那么就是不能够在中断里面进行发送信号量,但是在其他非中断里面使用发送 SEM_RTC 信号量时完全没有问题的;

如果按照创建信号量的顺序1、2的花,在rtc中断里面是可以使用发送信号量的,请教下是什么情况 啊 ? 有什么好的解决办法吧啊 ??


回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 09:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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