硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4993|回复: 4
收起左侧

[有问必答] 产生同步信号量请教 ???

[复制链接]

656

主题

3304

回帖

5297

积分

论坛元老

积分
5297
发表于 2015-9-23 21:20:45 | 显示全部楼层 |阅读模式
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信号量。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
111801
QQ
发表于 2015-9-24 14:45:49 | 显示全部楼层
保证先创建,后使用,在RTC中断里面的post函数是不是比创建函数先执行了。
回复

使用道具 举报

656

主题

3304

回帖

5297

积分

论坛元老

积分
5297
 楼主| 发表于 2015-9-24 14:57:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:保证先创建,后使用,在RTC中断里面的post函数是不是比创建函数先执行了。 (2015-09-24 14:45) 
哦,你这么一指点,似乎明白了,有可能是哦,
回复

使用道具 举报

656

主题

3304

回帖

5297

积分

论坛元老

积分
5297
 楼主| 发表于 2015-9-24 20:11:29 | 显示全部楼层

回 eric2013 的帖子

eric2013:保证先创建,后使用,在RTC中断里面的post函数是不是比创建函数先执行了。 (2015-09-24 14:45)
你好,我刚刚已经确认了,这个rtc 的信号量 确实是先创建的,请教下还有什么其他的原因啊 ???

任务如下:
void   AppTaskRtc                        (void           *p_arg)
{
         OS_ERR      err;
         (void)p_arg;                       /* 避免编译器报警 */

// rtc 显示顶部显示条颜色
         GUI_SetBkColor(GUI_LIGHTBLUE);
         GUI_ClearRect        (0, 0, 320-1, LCD_RTC_TOP_DISP_Y_ADDR);                        // 显示顶部矩形颜色
         GUI_SetBkColor(GUI_WHITE);
         GUI_ClearRect(0, LCD_RTC_TOP_DISP_Y_ADDR, 320-1, 480-1);
         
         while(1)
         {
                         // 如果把创建信号量1,2互换,那么此处等待信号量无效,也就是当程序调度到此时会不停的运行,
                             OSSemPend(&SEM_RTC,
                                                               0,             //如果这个参数设置为0就一直等待下去
                               OS_OPT_PEND_BLOCKING,  //如果没有信号量可用就等待
                                                         0,                         //这个参数是指向存放信号量被提交、强制解除等待状态、或者信号量被删除的时间戳
                                                               &err);               
                 {
                         printf("\\r\\nSEM_RTC %d", 27);
                         RTC_Display();
                        
                         GUI_SetFont(GUI_FONT_8X16);
                 }
         
                 BSP_OS_TimeDlyMs(10);            
         }
}



// 按键发送 key信号量
void AppTaskUserIF(void *p_arg)
{
         static uint8_t uKeyCode=0;

         (void)p_arg;               
         while (1)
         {

                 BSP_OS_TimeDlyMs(10);        
                 
                 uKeyCode = bsp_GetKey();
                 if(uKeyCode != KEY_NONE)
                 {
                         if(uKeyCode == KEY_DOWN_UP)
                         {
                                 DispTaskInfo();        
                         }
                         else if(uKeyCode == KEY_DOWN_DOWN)
                         {
                                 BSP_OS_SemPost(&SEM_KEY);       // 发送按键信号量
                         }
                 }
         }
}



static void AppTaskUsbh(void *p_arg)
{        
         OS_ERR      err;
         (void)p_arg;
         
         while(1)
         {        
                     OSSemPend(&SEM_KEY,      // 等待按键信号量
                                                       0,         
               OS_OPT_PEND_BLOCKING,
                                                 0,                        
               &err);        
                                                
         
                 LED1 ^= 1;

                 BSP_OS_TimeDlyMs(10);  
         }                                                                                                                                                                              
}
回复

使用道具 举报

656

主题

3304

回帖

5297

积分

论坛元老

积分
5297
 楼主| 发表于 2015-9-26 09:34:38 | 显示全部楼层

回 eric2013 的帖子

eric2013:
保证先创建,后使用,在RTC中断里面的post函数是不是比创建函数先执行了。

信号量创建不管是先创建1、2还是 2、1 返回值都是ok的,


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中断里面是可以使用发送信号量的,请教下是什么情况 啊 ? 有什么好的解决办法吧啊 ??











回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-11-11 03:40 , Processed in 0.227937 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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