📄 sem.lst
字号:
C51 COMPILER V8.08 SEM 05/09/2008 17:57:19 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE SEM
OBJECT MODULE PLACED IN sem.OBJ
COMPILER INVOKED BY: C:\Keil808\C51\BIN\C51.EXE sem.c ROM(COMPACT) DEBUG OBJECTEXTEND
line level source
1
2 #include <AT89X52.H>
3
4 #include "os_core.h"
5 #include "main.h"
6 #include "task_switch.h"
7 #include "sem.h"
8 #include "q.h"
9 #include "uart.h"
10
11 /////////////////信号量定义////////////////////////////////////////////////////
12 SemBlk Sem[MAX_SEM];
13
14
15 /////////////////////////////初始化信号量//////////////////////////////////////
16 void OSSemCreat(uint8 Index,uint8 Count) reentrant
17 {
18 1 if(Index<MAX_SEM) //存在该信号量
19 1 {
20 2 Sem[Index].OSTaskPendTbl=0; //等待信号量的任务列表
21 2 Sem[Index].OSEventCount=Count; //信号量
22 2 }
23 1 }
24
25
26 /////////////////////////任务等待信号量////////////////////////////////////////
27 uint8 OSTaskSemPend(uint8 Index,uint8 Timeout) reentrant
28 {
29 1 if(Index<MAX_SEM) //存在该信号量
30 1 {
31 2
32 2 if(Sem[Index].OSEventCount) //信号量有效
33 2 {
34 3 Sem[Index].OSEventCount -- ; //减一
35 3 }
36 2 else
37 2 {
38 3 Sem[Index].OSTaskPendTbl|=OSMapTbl[OS_Current_ID]; //加入信号的任务等待表
39 3 bb:
40 3 if(OSWait(K_TMO,Timeout)==TMO_EVENT) //超时
41 3 {
42 4 Sem[Index].OSTaskPendTbl &= ~OSMapTbl[OS_Current_ID]; //从等待表中去除
43 4 return SEM_TMO; //返时超时
44 4 }
45 3
46 3 if(Sem[Index].OSTaskPendTbl&OSMapTbl[OS_Current_ID]) //等待表中还有该任务
47 3 goto bb; //不是因为有信号而恢复
48 3 }
49 2 return SEM_OK; //信号量有效
50 2 }
51 1 return NOT_OK;
52 1 }
53
54 ///////////////////////////////任务发送信号量///////////////////////////////////
55 void OSSemPost(uint8 Index) reentrant
C51 COMPILER V8.08 SEM 05/09/2008 17:57:19 PAGE 2
56 {
57 1 uint8 i,tempPrio=255;
58 1
59 1 if(Index<MAX_SEM) //存在该信号量
60 1 {
61 2
62 2 for(i=0;i<TASK_NUM;i++) //查找优先级最高的任务
63 2 {
64 3 if(Sem[Index].OSTaskPendTbl&OSMapTbl[i]&&OS_TCB[i].Prio<tempPrio)
65 3 {
66 4 tempPrio=OS_TCB[i].Prio;
67 4 }
68 3 }
69 2
70 2 for(i=0;i<TASK_NUM;i++)
71 2 {
72 3 if(Sem[Index].OSTaskPendTbl&OSMapTbl[i]&&OS_TCB[i].Prio==tempPrio)
73 3 {
74 4 break;
75 4 }
76 3 }
77 2
78 2 if(i < TASK_NUM) //如果有任务需要
79 2 {
80 3 OS_ENTER_CRITICAL(); //进入临界区
81 3 Sem[Index].OSTaskPendTbl &= ~OSMapTbl[i]; //从等待表中去除
82 3 OS_EXIT_CRITICAL(); //退出临界区
83 3 OSSendSignal(i);
84 3 }
85 2 else //没有任务需要
86 2 {
87 3 Sem[Index].OSEventCount++; //使信号量加一
88 3 }
89 2
90 2 }
91 1 }
92
93
94
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 386 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 ----
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 + -