OpenEdv-开源电子网

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

创建互斥锁后,程序不动了

[复制链接]

17

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-11-21
在线时间
11 小时
发表于 2015-5-28 17:30:38 | 显示全部楼层 |阅读模式
5金钱
在程序中调用OSMutexCteate()创建一个互斥锁后,没有返回(后面的代码都没有运行)
具体代码如下:

OS_EVENT *g_pBeepMutex;
INT8U *g_u8BeepMutexErr;

void TaskStart(void *p_arg)
{
    (void)p_arg;                 // 'p_arg' 并没有用到,防止编译器提示警告
    LoadParameters();
    g_pBeepMutex = OSMutexCreate(23,g_u8BeepMutexErr);
    printf("%d<---\r\n", g_u8BeepMutexErr);
    while(1)
    {
        ……
    }
}
用上述代码,创建互斥锁时,出现卡死现象,故在OSMutesCreate()中添加打印输出函数(如下面代码),结果在最后的图可以看到。
OS_EVENT  *OSMutexCreate (INT8U   prio,
                          INT8U  *perr)
{
    OS_EVENT  *pevent;
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr = 0u;
#endif

printf(" step 1!<---\r\n");

#ifdef OS_SAFETY_CRITICAL
    if (perr == (INT8U *)0) {
        OS_SAFETY_CRITICAL_EXCEPTION();
    }
#endif
printf(" step 2!<---\r\n");
#ifdef OS_SAFETY_CRITICAL_IEC61508
    if (OSSafetyCriticalStartFlag == OS_TRUE) {
        OS_SAFETY_CRITICAL_EXCEPTION();
    }
#endif
printf(" step 3!<---\r\n");
#if OS_ARG_CHK_EN > 0u
    if (prio >= OS_LOWEST_PRIO) {                          /* Validate PIP                             */
        *perr = OS_ERR_PRIO_INVALID;
return ((OS_EVENT *)0);
    }
#endif
printf(" step 4!<---\r\n");
    if (OSIntNesting > 0u) {                               /* See if called from ISR ...               */
        *perr = OS_ERR_CREATE_ISR;                         /* ... can't CREATE mutex from an ISR       */
return ((OS_EVENT *)0);
    }
printf(" step 5!<---\r\n");
    OS_ENTER_CRITICAL();
printf(" step 6!<---\r\n");
    if (OSTCBPrioTbl[prio] != (OS_TCB *)0) {               /* Mutex priority must not already exist    */
        OS_EXIT_CRITICAL();                                /* Task already exist at priority ...       */
        *perr = OS_ERR_PRIO_EXIST;                         /* ... inheritance priority                 */
return ((OS_EVENT *)0);
    }
printf(" step 7!<---\r\n");
    OSTCBPrioTbl[prio] = OS_TCB_RESERVED;                  /* Reserve the table entry                  */
    pevent             = OSEventFreeList;                  /* Get next free event control block        */
    if (pevent == (OS_EVENT *)0) {                         /* See if an ECB was available              */
        OSTCBPrioTbl[prio] = (OS_TCB *)0;                  /* No, Release the table entry              */
        OS_EXIT_CRITICAL();
        *perr              = OS_ERR_PEVENT_NULL;           /* No more event control blocks             */
return (pevent);
    }
printf(" step 8!<---\r\n");
    OSEventFreeList        = (OS_EVENT *)OSEventFreeList->OSEventPtr;   /* Adjust the free list        */
    OS_EXIT_CRITICAL();
printf(" step 9!<---\r\n");
    pevent->OSEventType    = OS_EVENT_TYPE_MUTEX;
    pevent->OSEventCnt     = (INT16U)((INT16U)prio << 8u) | OS_MUTEX_AVAILABLE; /* Resource is avail.  */
    pevent->OSEventPtr     = (void *)0;                                 /* No task owning the mutex    */
#if OS_EVENT_NAME_EN > 0u
    pevent->OSEventName    = (INT8U *)(void *)"?";
#endif
    OS_EventWaitListInit(pevent);
printf(" step 10!<---\r\n");
    *perr                  = OS_ERR_NONE;
printf(" step 11!<---\r\n");
    return (pevent);
}
输出的结果如下:


照这个看的话,应该是返回错误代码的赋值语句出问题了,但是我前面定义的类型是匹配的呀,为什么会出现这个问题呢?

最佳答案

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

回复【2楼】正点原子: --------------------------------- 是由于创建指针g_u8BeepMutexErr之后没有初始化,即为空,所以赋值的时候出错了。。。。。
水好深。。。。。。。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-11-21
在线时间
11 小时
 楼主| 发表于 2015-5-28 17:30:39 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
是由于创建指针g_u8BeepMutexErr之后没有初始化,即为空,所以赋值的时候出错了。。。。。
水好深。。。。。。。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-5-28 22:43:08 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 14:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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