📄 semb.lst
字号:
C51 COMPILER V6.12 SEMB 12/07/2004 17:58:47 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE SEMB
OBJECT MODULE PLACED IN .\semb.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\..\..\ipc\semb.c INCDIR(d:\rs1.12b\) DEBUG OBJECTEXTEND PRINT(.\semb.lst
-) OBJECT(.\semb.obj)
stmt level source
1 /*
2 ===============================================================================
3 | Copyright (C) 2004 RuanHaiShen, All rights reserved.
4 | SUMMARY:
5 | Binary semaphore implementation.
6 |
7 | DESCRIPTION:
8 | See http://www.01s.org for documentation, latest information, license
9 | and contact details.
10 | email:ruanhaishen@01s.org
11 =============================================================================*/
12 /*===========================================================================*/
13 #include "arch/arch.h"
14 #include "inc/queue.h"
15 #include "inc/kernel.h"
16 #include "inc/memory.h"
17 #include "inc/ipc.h"
18 #include "inc/kapi.h"
19
20
21 #if CFG_SEMB_EN > 0
err_t semb_init(semb_t __p_* semb, bool value)
{
__ASSERT(semb != NULL);
semb->avail = value;
__queue_init(semb->waits);
return EOK;
}
err_t semb_wait(semb_t __p_* semb)
{
__ASSERT(semb != NULL);
#if CFG_ARG_CHK > 0
if (_sched_lock > 0) {
return ELOCK;
}
#else
__ASSERT(_sched_lock == 0);
#endif
CRITICAL_ENTER;
if (semb->avail) {
semb->avail = false;
CRITICAL_EXIT;
return EOK;
}
__ipc_block(&semb->waits, 0);
CRITICAL_EXIT;
__schedule();
return EOK;
}
C51 COMPILER V6.12 SEMB 12/07/2004 17:58:47 PAGE 2
#if CFG_IPC_TIMEOUT_EN > 0
err_t semb_timewait(semb_t __p_* semb, tick_t ticks)
{
__ASSERT(semb != NULL);
#if CFG_ARG_CHK > 0
if (_sched_lock > 0) {
return ELOCK;
}
#else
__ASSERT(_sched_lock == 0);
#endif
CRITICAL_ENTER;
if (semb->avail) {
semb->avail = false;
CRITICAL_EXIT;
return EOK;
}
__ipc_block(&semb->waits, ticks);
CRITICAL_EXIT;
__schedule();
CRITICAL_ENTER;
if (_tasks[_current_prio].state & STATE_BLOCKED) {
__ipc_timeout(&semb->waits);
CRITICAL_EXIT;
return ETIMEOUT;
}
_tasks[_current_prio].delay = 0;
CRITICAL_EXIT;
return EOK;
}
#endif
void semb_post(semb_t __p_* semb)
{
__ASSERT(semb != NULL);
CRITICAL_ENTER;
if (__ipc_resume(&semb->waits) != NULL_PRIO) {
CRITICAL_EXIT;
__schedule();
} else {
semb->avail = true;
CRITICAL_EXIT;
}
}
err_t semb_trywait(semb_t __p_* semb)
{
__ASSERT(semb != NULL);
CRITICAL_ENTER;
if (semb->avail) {
semb->avail = false;
CRITICAL_EXIT;
return EOK;
}
CRITICAL_EXIT;
C51 COMPILER V6.12 SEMB 12/07/2004 17:58:47 PAGE 3
return ENAVAIL;
}
bool semb_getvalue(semb_t __p_* semb)
{
register bool val;
__ASSERT(semb != NULL);
CRITICAL_ENTER;
val = semb->avail;
CRITICAL_EXIT;
return val;
}
err_t semb_destroy(semb_t __p_* semb)
{
__ASSERT(semb != NULL);
while (true) {
CRITICAL_ENTER;
if (__ipc_resume(&semb->waits) == NULL_PRIO) {
CRITICAL_EXIT;
break;
}
CRITICAL_EXIT;
}
return EOK;
}
#endif
147
148
149 /*===========================================================================*/
150
151
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = ---- ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -