|
附件中有某高校ucosII有關信號量的ppt及相關代碼。
51hei.png (10.01 KB, 下載次數: 59)
下載附件
2020-6-8 22:23 上傳
在uCOS_II.H中增加變量定義 1
在test.c中注釋掉變量y 1
文件OS_SEM.C中的OSSemPend函數中添加紅色部分代碼 1
文件OS_SEM.C中的OSSemPost函數中添加紅色部分代碼 3
在uCOS_II.H中增加變量定義
/********************************************************************************************************
GLOBAL VARIABLES
**********************************************************************************************************/
OS_EXT INT8U y; //定義打印輸出位置變量
OS_EXT INT32U OSCtxSwCtr; /* Counter of number of context switches */
#if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
OS_EXT OS_EVENT *OSEventFreeList; /* Pointer to list of free EVENT control blocks */
OS_EXT OS_EVENT OSEventTbl[OS_MAX_EVENTS];/* Table of EVENT control blocks */
#endif
在test.c中注釋掉變量y
文件OS_SEM.C中的OSSemPend函數中添加紅色部分代碼
void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
char str[25];
if (OSIntNesting > 0) { /* See if called from ISR ... */
*err = OS_ERR_PEND_ISR; /* ... can't PEND from an ISR */
return;
}
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
*err = OS_ERR_PEVENT_NULL;
return;
}
if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
*err = OS_ERR_EVENT_TYPE;
return;
}
#endif
OS_ENTER_CRITICAL();
if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
OS_EXIT_CRITICAL();
*err = OS_NO_ERR;
sprintf(str, "task%d--resource count: %d", OSTCBCur->OSTCBPrio, pevent->OSEventCnt);
PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
return;
}
/* Otherwise, must wait until event occurs */
OSTCBCur->OSTCBStat |= OS_STAT_SEM; /* Resource not available, pend on semaphore */
OSTCBCur->OSTCBDly = timeout; /* Store pend timeout in TCB */
OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
OS_EXIT_CRITICAL();
sprintf(str, "task%d--I'll wait", OSTCBCur->OSTCBPrio);
PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
OS_Sched(); /* Find next highest priority task ready */
OS_ENTER_CRITICAL();
if (OSTCBCur->OSTCBStat & OS_STAT_SEM) { /* Must have timed out if still waiting for event*/
OS_EventTO(pevent);
OS_EXIT_CRITICAL();
*err = OS_TIMEOUT; /* Indicate that didn't get event within TO */
sprintf(str, "task%d--time out", OSTCBCur->OSTCBPrio);
PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
return;
}
OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;
OS_EXIT_CRITICAL();
sprintf(str, "task%d--finally get it", OSTCBCur->OSTCBPrio);
PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
*err = OS_NO_ERR;
}
文件OS_SEM.C中的OSSemPost函數中添加紅色部分代碼
INT8U OSSemPost (OS_EVENT *pevent)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
char str[25];
#if OS_ARG_CHK_EN > 0
if (pevent == (OS_EVENT *)0) { /* Validate 'pevent' */
return (OS_ERR_PEVENT_NULL);
}
if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { /* Validate event block type */
return (OS_ERR_EVENT_TYPE);
}
#endif
OS_ENTER_CRITICAL();
if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for semaphore */
OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready highest prio task waiting on event */
OS_EXIT_CRITICAL();
sprintf(str, "task%d--I'll Sched", OSTCBCur->OSTCBPrio);
PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
OS_Sched(); /* Find highest priority task ready to run */
sprintf(str, "task%d--back from Sched", OSTCBCur->OSTCBPrio);
PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
return (OS_NO_ERR);
}
if (pevent->OSEventCnt < 65535) { /* Make sure semaphore will not overflow */
pevent->OSEventCnt++; /* Increment semaphore count to register event */
OS_EXIT_CRITICAL();
sprintf(str, "task%d--resource count: %d", OSTCBCur->OSTCBPrio, pevent->OSEventCnt);
PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
return (OS_NO_ERR);
}
OS_EXIT_CRITICAL(); /* Semaphore value has reached its maximum */
sprintf(str, "task%d--OS_SEM_OVF", OSTCBCur->OSTCBPrio);
PC_DispStr(15, y++, str, DISP_FGND_YELLOW+DISP_BGND_BLUE);
return (OS_SEM_OVF);
}
|
-
-
07-任務的同步與通信.zip
2020-6-8 21:42 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
300.99 KB, 下載次數: 22, 下載積分: 黑幣 -5
評分
-
查看全部評分
|