Library os_sem
Require Import os_code_defs.
Require Import os_code_notations.
Require Import os_ucos_h.
Open Scope code_scope.
Definition OSSemAccept_impl :=
Int16u ·OSSemAccept·(⌞pevent @ OS_EVENT∗⌟)··{
⌞
cnt @ Int16u;
legal @ Int8u
⌟;
If (pevent′ ==ₑ NULL){
RETURN ′0
};ₛ
ENTER_CRITICAL;ₛ
legal′ =ᶠ OS_EventSearch(·pevent′·);ₛ
If (legal′ ==ₑ ′0){
EXIT_CRITICAL;ₛ
RETURN ′0
};ₛ
If (pevent′→OSEventType !=ₑ ′OS_EVENT_TYPE_SEM){
EXIT_CRITICAL;ₛ
RETURN ′0
};ₛ
cnt′ =ₑ pevent′→OSEventCnt;ₛ
If (cnt′ >ₑ ′0){
−−pevent′→OSEventCnt
};ₛ
EXIT_CRITICAL;ₛ
RETURN cnt′
}· .
Definition OSSemCreate_impl :=
OS_EVENT∗ ·OSSemCreate·(⌞cnt @ Int16u⌟)··{
⌞pevent @ OS_EVENT∗⌟;
ENTER_CRITICAL;ₛ
pevent′ =ₑ OSEventFreeList′;ₛ
If (OSEventFreeList′ !=ₑ NULL){
OSEventFreeList′ =ₑ 〈OS_EVENT∗〉 OSEventFreeList′→OSEventListPtr
};ₛ
If (pevent′ !=ₑ NULL) {
OS_EventWaitListInit(pevent′);ₛ
pevent′→OSEventType =ₑ ′OS_EVENT_TYPE_SEM;ₛ
pevent′→OSEventCnt =ₑ cnt′;ₛ
pevent′→OSEventPtr =ₑ NULL;ₛ
pevent′→OSEventListPtr =ₑ OSEventList′;ₛ
OSEventList′ =ₑ pevent′
};ₛ
EXIT_CRITICAL;ₛ
RETURN pevent′
}·.
Definition OSSemDel_impl :=
Int8u ·OSSemDel·(⌞pevent @ OS_EVENT∗⌟)··{
⌞
tasks_waiting @ Int8u ;
legal @ Int8u
⌟;
If (pevent′ ==ₑ NULL){
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
ENTER_CRITICAL;ₛ
legal′ =ᶠ OS_EventSearch(·pevent′·);ₛ
If (legal′ ==ₑ ′0){
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
If (pevent′→OSEventType !=ₑ ′OS_EVENT_TYPE_SEM){
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_EVENT_TYPE
};ₛ
IF (pevent′→OSEventGrp !=ₑ ′0){
tasks_waiting′ =ₑ ′1
}ELSE{
tasks_waiting′ =ₑ ′0
};ₛ
IF (tasks_waiting′ ==ₑ ′0){
OS_EventRemove(pevent′);ₛ
pevent′→OSEventType =ₑ ′OS_EVENT_TYPE_UNUSED;ₛ
pevent′→OSEventListPtr =ₑ OSEventFreeList′;ₛ
OSEventFreeList′ =ₑ pevent′;ₛ
EXIT_CRITICAL;ₛ
RETURN ′OS_NO_ERR
}ELSE{
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_TASK_WAITING
}
}·.
Definition OSSemPend_impl :=
Int8u ·OSSemPend·(⌞pevent @ OS_EVENT∗; timeout @ Int16u⌟)··{
⌞legal @ Int8u⌟;
If (pevent′ ==ₑ NULL){
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
ENTER_CRITICAL;ₛ
legal′ =ᶠ OS_EventSearch(·pevent′·);ₛ
If (legal′ ==ₑ ′0){
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
If (pevent′→OSEventType !=ₑ ′OS_EVENT_TYPE_SEM){
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
If (OSTCBCur′→OSTCBPrio ==ₑ ′OS_IDLE_PRIO){
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
If ( (OSTCBCur′→OSTCBStat !=ₑ ′OS_STAT_RDY) ||ₑ (OSTCBCur′→OSTCBDly !=ₑ ′0)){
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
If (pevent′→OSEventCnt >ₑ ′0){
−−pevent′→OSEventCnt;ₛ
EXIT_CRITICAL;ₛ
RETURN ′OS_NO_ERR
};ₛ
If (OSTCBCur′→OSTCBMsg !=ₑ NULL) {
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
OSTCBCur′→OSTCBStat =ₑ ′OS_STAT_SEM;ₛ
OSTCBCur′→OSTCBDly =ₑ timeout′;ₛ
OS_EventTaskWait(pevent′);ₛ
EXIT_CRITICAL;ₛ
OS_Sched();ₛ
ENTER_CRITICAL;ₛ
If (OSTCBCur′→OSTCBMsg ==ₑ NULL) {
EXIT_CRITICAL;ₛ
RETURN ′OS_TIMEOUT
};ₛ
EXIT_CRITICAL;ₛ
RETURN ′OS_NO_ERR
}· .
Definition OSSemPost_impl :=
Int8u ·OSSemPost·(⌞pevent @ OS_EVENT∗⌟)··{
⌞
legal @ Int8u;
x @ Int8u
⌟;
If (pevent′ ==ₑ NULL){
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
ENTER_CRITICAL;ₛ
legal′ =ᶠ OS_EventSearch(·pevent′·);ₛ
If (legal′ ==ₑ ′0){
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
If (pevent′→OSEventType !=ₑ ′OS_EVENT_TYPE_SEM){
EXIT_CRITICAL;ₛ
RETURN ′OS_ERR_PEVENT_NULL
};ₛ
If (pevent′→OSEventGrp !=ₑ ′0){
x′ =ₑ ′OS_STAT_SEM;ₛ
OS_EventTaskRdy(pevent′, 〈Void ∗〉 pevent′, x′);ₛ
EXIT_CRITICAL;ₛ
OS_Sched();ₛ
RETURN ′OS_NO_ERR
};ₛ
If (pevent′→OSEventCnt <ₑ ′65535){
pevent′→OSEventCnt =ₑ pevent′→OSEventCnt +ₑ ′1;ₛ
EXIT_CRITICAL;ₛ
RETURN ′OS_NO_ERR
};ₛ
EXIT_CRITICAL;ₛ
RETURN ′OS_SEM_OVF
}·.
Close Scope code_scope.