📄 os_sem.lst
字号:
C51 COMPILER V6.23a OS_SEM 01/01/2001 02:30:57 PAGE 1
C51 COMPILER V6.23a, COMPILATION OF MODULE OS_SEM
OBJECT MODULE PLACED IN .\OS_SEM.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ..\OS\OS_SEM.C BROWSE DEBUG OBJECTEXTEND PRINT(.\OS_SEM.lst) OBJECT(.\OS_SE
-M.obj)
stmt level source
1 /*********************************************************************************************************
2 ** Small RTOS(51)
3 ** The Real-Time Kernel(For Keil c51)
4 **
5 ** (c) Copyright 2002-2003, chenmingji
6 ** All Rights Reserved
7 **
8 ** V1.20.0
9 **
10 **
11 **--------------文件信息--------------------------------------------------------------------------------
12 **文 件 名: OS_Q.C
13 **创 建 人: 陈明计
14 **最后修改日期: 2003年8月3日
15 **描 述: Small RTOS(51)信号量代码
16 **
17 **--------------历史版本信息----------------------------------------------------------------------------
18 ** 创建人: 陈明计
19 ** 版 本: V1.10~V1.12.0
20 ** 日 期: 2002年9月1日~2002年12月30日
21 ** 描 述: 完善信号量代码
22 **
23 **------------------------------------------------------------------------------------------------------
24 ** 修改人: 陈明计
25 ** 版 本: V1.20.0
26 ** 日 期: 2003年8月3日
27 ** 描 述: 删除OSInt*函数,根据新版本要求改变一些代码
28 **
29 **--------------当前版本修订----------------------------------------------------------------------------
30 ** 修改人:
31 ** 日 期:
32 ** 描 述:
33 **
34 **------------------------------------------------------------------------------------------------------
35 ********************************************************************************************************/
36
37 #define IN_OS_SEM
38 #include "config.h"
39
40 /* 分配信号量存储空间 */
41 #if EN_OS_SEM > 0
#if OS_MAX_TASKS < 9
uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 2];
#else
uint8 OS_SEM_MEM_SEL OsSemBuf[OS_MAX_SEMS * 3];
#endif
/*********************************************************************************************************
** 函数名称: OSSemCreate
** 功能描述: 初始化消息队列
** 输 入: Index:信号量索引
** data:信号量初始值
C51 COMPILER V6.23a OS_SEM 01/01/2001 02:30:57 PAGE 2
** 输 出: NOT_OK:没有这个信号量
** OS_SEM_OK:成功
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint8 OSSemCreate(uint8 Index,uint8 Data)
{
OS_ENTER_CRITICAL();
if (Index < OS_MAX_SEMS )
{
#if OS_MAX_TASKS < 9
OsSemBuf[2 * Index] = Data; /* 计数器置初值 */
OsSemBuf[2 * Index + 1] = 0; /* 清空等待队列 */
#else
OsSemBuf[3 * Index] = Data; /* 计数器置初值 */
/* 清空等待队列 */
OsSemBuf[3 * Index + 1] = 0;
OsSemBuf[3 * Index + 2] = 0;
#endif
OS_EXIT_CRITICAL();
return OS_SEM_OK;
}
OS_EXIT_CRITICAL();
return NOT_OK;
}
/*********************************************************************************************************
** 函数名称: OSSemPend
** 功能描述: 等待一个信号量
** 输 入: Index:信号量索引
** Tick:等待时间
** 输 出: NOT_OK:参数错误
** OS_SEM_OK:得到信号量
** OS_SEM_TMO:超时到
** OS_SEM_NOT_OK:没有得到信号量
** 全局变量: 无
** 调用模块: OSRunningTaskID,OS_TaskSuspend,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月20日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月26日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月2日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年12月30日
**-------------------------------------------------------------------------------------------------------
** 修改人:
C51 COMPILER V6.23a OS_SEM 01/01/2001 02:30:57 PAGE 3
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_SEM_PENT > 0
uint8 OSSemPend(uint8 Index, uint8 Tick)
{
#if EN_OS_SEM_CHK > 0
if (Index >= OS_MAX_SEMS)
{
return 0;
}
#endif
OS_ENTER_CRITICAL();
OSWaitTick[OSRunningTaskID()] = Tick; /* 设置超时时间 */
/* 可以优化寄存器的使用 */
/* 把任务加入等待任务队列 */
#if OS_MAX_TASKS < 9
OsSemBuf[Index * 2 + 1] |= OSMapTbl[OSRunningTaskID()];
#else
if (OSRunningTaskID() < 8)
{
OsSemBuf[Index * 3 + 1] |= OSMapTbl[OSRunningTaskID()];
}
else
{
OsSemBuf[Index * 3 + 2] |= OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
/* 信号量是否有效 */
#if OS_MAX_TASKS < 9
while (OsSemBuf[Index * 2] == 0)
{
#else
while (OsSemBuf[Index * 3] == 0)
{
#endif
/* 使用堆栈是为了使函数具有重入性 */
#ifdef __C51__
SP++;
*((uint8 data *)SP) = Index;
#endif
/* 信号量无效 */
OS_TaskSuspend(OSRunningTaskID()); /* 任务进入等待状态 */
OSSched(); /* 运行下一个任务 */
#ifdef __C51__
Index = *((uint8 data *)SP);
SP--;
#endif
/* 任务再次运行,如果超时到,退出循环 */
if (OSWaitTick[OSRunningTaskID()] == 0)
{
break;
}
}
/* 将任务从等待队列中清除(可以删除) */
#if OS_MAX_TASKS < 9
OsSemBuf[Index * 2 + 1] &= ~OSMapTbl[OSRunningTaskID()];
C51 COMPILER V6.23a OS_SEM 01/01/2001 02:30:57 PAGE 4
#else
if (OSRunningTaskID() < 8)
{
OsSemBuf[Index * 3 + 1] &= ~OSMapTbl[OSRunningTaskID()];
}
else
{
OsSemBuf[Index * 3 + 2] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
/* 判断信号量是否有效。有效,信号量计数器减一 */
#if OS_MAX_TASKS < 9
if (OsSemBuf[Index * 2] > 0)
{
OsSemBuf[Index * 2]--;
#else
if (OsSemBuf[Index * 3] > 0)
{
OsSemBuf[Index * 3]--;
#endif
OS_EXIT_CRITICAL();
return OS_SEM_OK;
}
else
{
/* 无信号返回信号无效 */
OS_EXIT_CRITICAL();
return OS_SEM_TMO;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -