在程序中调用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);
}
输出的结果如下:
照这个看的话,应该是返回错误代码的赋值语句出问题了,但是我前面定义的类型是匹配的呀,为什么会出现这个问题呢?
|