📄 mac.lst
字号:
1 .file "mac.c"
2 .arch atmega128
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
11 .text
12 .Ltext0:
96 .global MACInit
98 MACInit:
1:mac.c **** /*
2:mac.c **** ****************************************************************************
3:mac.c **** * 宁波中科集成电路设计中心 版权所有 Copyright 2005
4:mac.c **** * http:\\www.nbicc.com
5:mac.c **** *文件名: mac.c
6:mac.c **** *程序员: 夏鹏 xpsonny@nbicc.com
7:mac.c **** *主要内容:MAC层
8:mac.c ****
9:mac.c **** *如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
10:mac.c **** ****************************************************************************
11:mac.c **** */
12:mac.c **** /////
13:mac.c **** #include "led.h"
14:mac.c **** ////
15:mac.c **** #include "os.h"
16:mac.c **** #include "mac.h"
17:mac.c **** #include "message.h"
18:mac.c **** #include "macClock.h"
19:mac.c **** #include "global.h"
20:mac.c **** #include "physical.h"
21:mac.c **** #include "fun.h"
22:mac.c **** #include "dataqueue.h"
23:mac.c **** #include "radiocontrol.h" // 载波监听
24:mac.c **** #include <avr/io.h>
25:mac.c **** #include <avr/interrupt.h>
26:mac.c ****
27:mac.c **** //内部函数声明
28:mac.c **** static result_t MACTxReset(void); // 清空所有发送任务
29:mac.c **** static void handleRTS(void* packet);
30:mac.c **** static void handleCTS(void* packet);
31:mac.c **** static void* handleDATA(void* packet);
32:mac.c **** static void handleACK(void* packet);
33:mac.c **** static void startBcast(void);
34:mac.c **** //static void sendRTS(void);
35:mac.c **** //static void sendCTS(void);
36:mac.c **** //static void sendDATA(void);
37:mac.c **** static void sendACK(uint8_t DataSrcAddr);
38:mac.c **** static void startACK(void);
39:mac.c **** static void tryToSend(void);
40:mac.c ****
41:mac.c **** static void SetWaitTime(void);
42:mac.c ****
43:mac.c **** // MAC层状态
44:mac.c **** enum {
45:mac.c **** SLEEP,
46:mac.c **** IDLE,
47:mac.c **** CARR_SENSE,
48:mac.c **** TX_PKT,
49:mac.c **** BACKOFF,
50:mac.c **** WAIT_CTS,
51:mac.c **** WAIT_DATA,
52:mac.c **** WAIT_ACK
53:mac.c **** };
54:mac.c ****
55:mac.c **** // 射频状态
56:mac.c **** enum { RADIO_SLEEP, RADIO_IDLE, RADIO_RX, RADIO_TX };
57:mac.c ****
58:mac.c **** // 发送方式
59:mac.c **** enum { BCAST_DATA, SEND_SYNC, SEND_RTS, SEND_CTS, SEND_DATA, SEND_ACK };
60:mac.c **** //enum { BCAST_DATA,SEND_CTRL};
61:mac.c ****
62:mac.c **** // MAC 数据包类型
63:mac.c **** enum { RTS_PKT, CTS_PKT, DATA_PKT, ACK_PKT };
64:mac.c ****
65:mac.c ****
66:mac.c **** // 状态变量
67:mac.c **** static char state; // MAC 状态变量
68:mac.c **** //static char ctrlstate; //MAC层的控制状态,主要用于RTS/CTS 以及ACK的控制
69:mac.c **** static char oldstate;
70:mac.c **** static char radioState;
71:mac.c ****
72:mac.c **** // 发送相关变量
73:mac.c **** static char txRequest; // 是否接受了一个发送请求,且未发送
74:mac.c **** static char howToSend; // 发送包方式
75:mac.c **** static uint8_t txPktLen; // 传输的数据包长度
76:mac.c **** static uint8_t ctrlPktLen; // 传输的控制包长度
77:mac.c **** static OSMACMsgPtr dataPkt; // MAC包头指针
78:mac.c **** static OSMACCtrlMsg ctrlPkt; // 控制包
79:mac.c **** static OSMACCtrlMsgPtr ctrlPktPt;
80:mac.c **** static uint8_t AckWaitTime;
81:mac.c ****
82:mac.c ****
83:mac.c **** /**********************************************************************************
84:mac.c **** 初始化:
85:mac.c **** 等待控制包的时间:timeWaitCtrl
86:mac.c **** **********************************************************************************/
87:mac.c **** result_t MACInit()
88:mac.c **** {
100 .LM1:
101 /* prologue: frame size=0 */
102 /* prologue end (size=0) */
89:mac.c **** // 初始化状态变量
90:mac.c **** state = IDLE;
104 .LM2:
105 0000 81E0 ldi r24,lo8(1)
106 0002 8093 0000 sts state,r24
91:mac.c **** //ctrlstate = IDLE;
92:mac.c **** oldstate = IDLE;
108 .LM3:
109 0006 8093 0000 sts oldstate,r24
93:mac.c **** radioState = RADIO_IDLE;
111 .LM4:
112 000a 8093 0000 sts radioState,r24
94:mac.c ****
95:mac.c **** // 初始化发送相关变量
96:mac.c **** txRequest = 0;
114 .LM5:
115 000e 1092 0000 sts txRequest,__zero_reg__
97:mac.c **** AckWaitTime = 0;
117 .LM6:
118 0012 1092 0000 sts AckWaitTime,__zero_reg__
98:mac.c ****
99:mac.c **** // 初始化随机数生成器
100:mac.c **** RandomInit();
120 .LM7:
121 0016 0E94 0000 call RandomInit
101:mac.c **** // 初始化缓冲队列
102:mac.c **** QueueInit();
123 .LM8:
124 001a 0E94 0000 call QueueInit
103:mac.c **** //mac层tick时钟初始化
104:mac.c **** ClockStart();
126 .LM9:
127 001e 0E94 0000 call ClockStart
105:mac.c **** // 初始化物理层
106:mac.c **** PhysicalInit();
129 .LM10:
130 0022 0E94 0000 call PhysicalInit
107:mac.c ****
108:mac.c **** return SUCCESS;
109:mac.c **** }
132 .LM11:
133 0026 81E0 ldi r24,lo8(1)
134 0028 90E0 ldi r25,hi8(1)
135 /* epilogue: frame size=0 */
136 002a 0895 ret
137 /* epilogue end (size=1) */
138 /* function MACInit size 22 (21) */
142 tryToSend:
110:mac.c **** /*************************************************************************
111:mac.c **** *功能描述:发送ack开始,开始空闲监听,准备发送ack数据包
112:mac.c **** *参数说明:
113:mac.c **** *返回值:
114:mac.c **** *************************************************************************/
115:mac.c **** static void tryToSendACK(void){
116:mac.c **** startACK();
117:mac.c **** }
118:mac.c **** /*************************************************************************
119:mac.c **** *功能描述:发送数据包的开始,开始空闲监听,准备发送广播或者RTS数据包
120:mac.c **** *参数说明:
121:mac.c **** *返回值:
122:mac.c **** **************************************************************************/
123:mac.c **** static void tryToSend() // 判断是否允许发送,如果是,则进行监听
124:mac.c **** {
144 .LM12:
145 /* prologue: frame size=0 */
146 002c CF93 push r28
147 /* prologue end (size=1) */
125:mac.c **** char intEnabled;
126:mac.c **** if (state == IDLE) { // 空闲时
149 .LM13:
150 002e 8091 0000 lds r24,state
151 0032 8130 cpi r24,lo8(1)
152 0034 A9F4 brne .L3
127:mac.c **** howToSend = BCAST_DATA;
154 .LM14:
155 0036 1092 0000 sts howToSend,__zero_reg__
128:mac.c **** // 开始载波监听,采用原子操作,防止起始字符检测到调用
129:mac.c **** intEnabled = inp(SREG) & 0x80;
157 .LM15:
158 003a CFB7 in r28,95-0x20
159 003c C078 andi r28,lo8(-128)
130:mac.c **** cli();
161 .LM16:
162 /* #APP */
163 003e F894 cli
131:mac.c **** if (RadiocontrolCarrierSenseStart(80) == SUCCESS) { // 调用监听函数
165 .LM17:
166 /* #NOAPP */
167 0040 80E5 ldi r24,lo8(80)
168 0042 90E0 ldi r25,hi8(80)
169 0044 0E94 0000 call RadiocontrolCarrierSenseStart
170 0048 8130 cpi r24,lo8(1)
171 004a 21F4 brne .L4
132:mac.c **** state = CARR_SENSE;
173 .LM18:
174 004c 82E0 ldi r24,lo8(2)
175 004e 8093 0000 sts state,r24
176 0052 02C0 rjmp .L5
177 .L4:
133:mac.c **** }
134:mac.c **** else {
135:mac.c **** txRequest =0;
179 .LM19:
180 0054 1092 0000 sts txRequest,__zero_reg__
181 .L5:
136:mac.c ****
137:mac.c **** }
138:mac.c **** if(intEnabled)
183 .LM20:
184 0058 CC23 tst r28
185 005a 21F0 breq .L2
139:mac.c **** sei();
187 .LM21:
188 /* #APP */
189 005c 7894 sei
190 /* #NOAPP */
191 005e 02C0 rjmp .L2
192 .L3:
140:mac.c **** }
141:mac.c **** else {
142:mac.c ****
143:mac.c **** txRequest =0; //去锁
194 .LM22:
195 0060 1092 0000 sts txRequest,__zero_reg__
196 .L2:
197 /* epilogue: frame size=0 */
198 0064 CF91 pop r28
199 0066 0895 ret
200 /* epilogue end (size=2) */
201 /* function tryToSend size 32 (29) */
207 .global MACBroadcastMsg
209 MACBroadcastMsg:
144:mac.c ****
145:mac.c **** }
146:mac.c **** return;
147:mac.c **** }
148:mac.c ****
149:mac.c **** /*************************************************************************
150:mac.c **** *功能描述:发送广播数据包的接口函数
151:mac.c **** *参数说明:包地址,包长度(MAC包数据部分的长度)
152:mac.c **** *返回值:
153:mac.c **** **************************************************************************/
154:mac.c **** result_t MACBroadcastMsg(void* data, uint8_t length)
155:mac.c **** {
211 .LM23:
212 /* prologue: frame size=0 */
213 /* prologue end (size=0) */
214 0068 FC01 movw r30,r24
156:mac.c **** char intEnabled;
157:mac.c ****
158:mac.c **** // 错误的发送方式
159:mac.c **** if (data == 0 || length == 0 || length > MAX_PKT_LEN - MAC_HEADER_LEN) {
216 .LM24:
217 006a 892B or r24,r25
218 006c C9F0 breq .L14
220 .LM25:
221 006e 6623 tst r22
222 0070 B9F0 breq .L14
223 0072 6633 cpi r22,lo8(54)
224 0074 A8F4 brsh .L14
160:mac.c **** return FAIL;
161:mac.c **** }
162:mac.c ****
163:mac.c **** // 设置发送请求标识
164:mac.c **** intEnabled = inp(SREG) & 0x80;
226 .LM26:
227 0076 9FB7 in r25,95-0x20
228 0078 9078 andi r25,lo8(-128)
165:mac.c **** cli();
230 .LM27:
231 /* #APP */
232 007a F894 cli
166:mac.c ****
167:mac.c **** if ((txRequest == 0)&&(AckWaitTime == 0)) {
234 .LM28:
235 /* #NOAPP */
236 007c 8091 0000 lds r24,txRequest
237 0080 8823 tst r24
238 0082 59F4 brne .L11
239 0084 8091 0000 lds r24,AckWaitTime
240 0088 8823 tst r24
241 008a 39F4 brne .L11
168:mac.c **** txRequest = 1;
243 .LM29:
244 008c 81E0 ldi r24,lo8(1)
245 008e 8093 0000 sts txRequest,r24
169:mac.c **** if (intEnabled) sei();
247 .LM30:
248 0092 9923 tst r25
249 0094 41F0 breq .L13
250 /* #APP */
251 0096 7894 sei
252 /* #NOAPP */
253 0098 06C0 rjmp .L13
254 .L11:
170:mac.c **** } else {
171:mac.c **** if (intEnabled) sei();
256 .LM31:
257 009a 9923 tst r25
258 009c 09F0 breq .L14
259 /* #APP */
260 009e 7894 sei
261 /* #NOAPP */
262 .L14:
172:mac.c **** return FAIL;
264 .LM32:
265 00a0 80E0 ldi r24,lo8(0)
266 00a2 90E0 ldi r25,hi8(0)
267 00a4 0895 ret
268 .L13:
173:mac.c **** }
174:mac.c ****
175:mac.c **** dataPkt = (OSMACMsgPtr)data;
270 .LM33:
271 00a6 F093 0000 sts (dataPkt)+1,r31
272 00aa E093 0000 sts dataPkt,r30
176:mac.c **** txPktLen = length + MAC_HEADER_LEN;
274 .LM34:
275 00ae 695F subi r22,lo8(-(7))
276 00b0 6093 0000 sts txPktLen,r22
177:mac.c **** // 数据包包头设置
178:mac.c **** dataPkt->type = DATA_PKT;
278 .LM35:
279 00b4 82E0 ldi r24,lo8(2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -