📄 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:
80 .global OS_BCAST_ADDR
81 .data
84 OS_BCAST_ADDR:
85 0000 FF .byte -1
86 .global OS_LOCAL_ADDRESS
89 OS_LOCAL_ADDRESS:
90 0001 12 .byte 18
91 .text
93 .global MACInit
95 MACInit:
1:mac.c **** /*
2:mac.c **** ****************************************************************************
3:mac.c **** *
4:mac.c **** * 宁波中科集成电路设计中心 版权所有 Copyright 2005
5:mac.c **** *
6:mac.c **** *文件名: mac.c
7:mac.c **** *程序员: xp
8:mac.c **** *主要内容:mac通信协议栈MAC层
9:mac.c **** *完成日期:2005.8.28
10:mac.c **** ****************************************************************************
11:mac.c **** */
12:mac.c ****
13:mac.c **** #include "os.h"
14:mac.c **** #include "mac.h"
15:mac.c **** #include "message.h"
16:mac.c **** #include "app.h"
17:mac.c **** #include "led.h"
18:mac.c **** #include "physical.h"
19:mac.c **** #include "uartDebug.h"
20:mac.c **** #include "fun.h"
21:mac.c **** #include "macClock.h"
22:mac.c **** #include "radiocontrol.h" // 载波监听
23:mac.c **** #include <avr/io.h>
24:mac.c **** #include <avr/interrupt.h>
25:mac.c ****
26:mac.c **** uint8_t OS_LOCAL_ADDRESS = 0x12;
27:mac.c **** uint8_t OS_BCAST_ADDR = 0xFF;
28:mac.c ****
29:mac.c ****
30:mac.c **** #define MAC_RETRY_LIMIT 2 // RTS重传最大次数
31:mac.c **** #define DIFS 10 // 空闲监听间隔
32:mac.c **** #define SIFS 1 // CTS,DATA,ACK包之前
33:mac.c **** #define EIFS 10 // 802.11在接收到错误帧后的重新监听间隔
34:mac.c **** #define TX_PKT_DONE_TIME 2000
35:mac.c **** #define SLOTTIME 1 // MAC层竞争窗口时隙长度
36:mac.c **** #define DATA_CW 31 // 数据帧退避窗口最大值
37:mac.c **** #define GUARDTIME 5
38:mac.c ****
39:mac.c **** // MAC层状态
40:mac.c **** enum {
41:mac.c **** SLEEP,
42:mac.c **** IDLE,
43:mac.c **** CARR_SENSE,
44:mac.c **** TX_PKT,
45:mac.c **** BACKOFF,
46:mac.c **** WAIT_CTS,
47:mac.c **** WAIT_DATA,
48:mac.c **** WAIT_ACK
49:mac.c **** };
50:mac.c ****
51:mac.c **** // 射频状态
52:mac.c **** enum { RADIO_SLEEP, RADIO_IDLE, RADIO_RX, RADIO_TX };
53:mac.c ****
54:mac.c **** // 发送方式
55:mac.c **** enum { BCAST_DATA, SEND_SYNC, SEND_RTS, SEND_CTS, SEND_DATA, SEND_ACK };
56:mac.c ****
57:mac.c **** // MAC 数据包类型
58:mac.c **** enum { RTS_PKT, CTS_PKT, DATA_PKT, ACK_PKT };
59:mac.c ****
60:mac.c ****
61:mac.c **** // 状态变量
62:mac.c **** static char state; // MAC 状态变量
63:mac.c **** static char radioState; //
64:mac.c ****
65:mac.c **** // 计时变量
66:mac.c **** uint32_t clockTime; // 微秒为单位的MAC层时钟计数变量
67:mac.c **** uint16_t durCtrlPkt; // 发送控制帧需要的时间
68:mac.c **** uint16_t timeWaitCtrl; // 等待控制帧CTS、ACK的时间
69:mac.c **** uint16_t durDataPkt;
70:mac.c **** uint16_t timeWaitData; // 等待DATA的时间
71:mac.c **** uint16_t geneTime; //
72:mac.c **** uint8_t txDelay; // 短帧间隔到达定时,发送CTS、DATA、ACK之前等待的时间
73:mac.c **** uint8_t retryTime; //
74:mac.c ****
75:mac.c **** // 发送相关变量
76:mac.c **** char txRequest; // 是否接受了一个发送请求,且未发送
77:mac.c **** char howToSend; // 发送包方式
78:mac.c **** uint16_t sendAddr; // 目的节点地址
79:mac.c **** uint8_t numRetry; // RTS重传次数
80:mac.c **** uint8_t numExtend; // ACK超时时发送时间的扩展次数
81:mac.c **** uint8_t txPktLen; // 传输的包长度
82:mac.c **** static OSMACMsgPtr dataPkt;// MAC包头指针
83:mac.c **** OSMACCtrlMsg ctrlPkt; // 控制包
84:mac.c ****
85:mac.c **** // 接收相关变量
86:mac.c **** uint16_t recvAddr; // 数据包源地址
87:mac.c ****
88:mac.c ****
89:mac.c **** static void handleRTS(void* packet);
90:mac.c **** static void handleCTS(void* packet);
91:mac.c **** static void* handleDATA(void* packet);
92:mac.c **** static void handleACK(void* packet);
93:mac.c **** static void startBcast(void);
94:mac.c **** static void sendRTS(void);
95:mac.c **** static void sendCTS(void);
96:mac.c **** static void sendDATA(void);
97:mac.c **** static void sendACK(void);
98:mac.c **** static void tryToSend(void);
99:mac.c **** static void tryToResend(uint8_t delay);
100:mac.c **** static void txMsgDone(void);
101:mac.c ****
102:mac.c **** /**********************************************************************************
103:mac.c **** 初始化:
104:mac.c **** 等待控制包的时间:timeWaitCtrl
105:mac.c **** **********************************************************************************/
106:mac.c **** result_t MACInit()
107:mac.c **** {
97 .LM1:
98 /* prologue: frame size=0 */
99 /* prologue end (size=0) */
108:mac.c **** // 初始化状态变量
109:mac.c **** state = IDLE;
101 .LM2:
102 0000 81E0 ldi r24,lo8(1)
103 0002 8093 0000 sts state,r24
110:mac.c **** radioState = RADIO_IDLE;
105 .LM3:
106 0006 8093 0000 sts radioState,r24
111:mac.c ****
112:mac.c ****
113:mac.c **** // 初始化计时变量
114:mac.c **** clockTime = 0;
108 .LM4:
109 000a 1092 0000 sts clockTime,__zero_reg__
110 000e 1092 0000 sts (clockTime)+1,__zero_reg__
111 0012 1092 0000 sts (clockTime)+2,__zero_reg__
112 0016 1092 0000 sts (clockTime)+3,__zero_reg__
115:mac.c **** txDelay = 0;
114 .LM5:
115 001a 1092 0000 sts txDelay,__zero_reg__
116:mac.c ****
117:mac.c **** // 初始化发送相关变量
118:mac.c **** txRequest = 0;
117 .LM6:
118 001e 1092 0000 sts txRequest,__zero_reg__
119:mac.c ****
120:mac.c **** // 控制包初始化
121:mac.c **** ctrlPkt.fromAddr = OS_LOCAL_ADDRESS;
120 .LM7:
121 0022 8091 0000 lds r24,OS_LOCAL_ADDRESS
122 0026 8093 0000 sts ctrlPkt+3,r24
122:mac.c ****
123:mac.c **** retryTime = 0;
124 .LM8:
125 002a 1092 0000 sts retryTime,__zero_reg__
124:mac.c ****
125:mac.c ****
126:mac.c **** // 初始化UART debugging
127:mac.c **** uartDebug_init();
127 .LM9:
128 002e 0E94 0000 call uartDebug_init
128:mac.c ****
129:mac.c **** // 初始化随机数生成器
130:mac.c **** RandomInit();
130 .LM10:
131 0032 0E94 0000 call RandomInit
131:mac.c ****
132:mac.c **** // 初始化并启动MAC层定时器
133:mac.c **** ClockStart();
133 .LM11:
134 0036 0E94 0000 call ClockStart
134:mac.c ****
135:mac.c **** // 初始化物理层
136:mac.c **** PhysicalInit();
136 .LM12:
137 003a 0E94 0000 call PhysicalInit
137:mac.c ****
138:mac.c **** return SUCCESS;
139:mac.c **** }
139 .LM13:
140 003e 81E0 ldi r24,lo8(1)
141 0040 90E0 ldi r25,hi8(1)
142 /* epilogue: frame size=0 */
143 0042 0895 ret
144 /* epilogue end (size=1) */
145 /* function MACInit size 34 (33) */
149 tryToSend:
140:mac.c ****
141:mac.c **** /*************************************************************************
142:mac.c **** *功能描述:发送数据包的开始,开始空闲监听,准备发送广播或者RTS数据包
143:mac.c **** *参数说明:
144:mac.c **** *返回值:
145:mac.c **** **************************************************************************/
146:mac.c **** static void tryToSend() // 判断是否允许发送,如果是,则进行监听
147:mac.c **** {
151 .LM14:
152 /* prologue: frame size=0 */
153 0044 CF93 push r28
154 /* prologue end (size=1) */
148:mac.c **** uint16_t backoffSlots, listenBits;
149:mac.c **** char intEnabled;
150:mac.c **** if (state == IDLE) { // 空闲时
156 .LM15:
157 0046 8091 0000 lds r24,state
158 004a 8130 cpi r24,lo8(1)
159 004c F9F4 brne .L2
151:mac.c **** howToSend = BCAST_DATA;
161 .LM16:
162 004e 1092 0000 sts howToSend,__zero_reg__
152:mac.c **** backoffSlots = RandomLFSRGen() & (uint16_t)DATA_CW; // 退避时间<=DATA_CW
164 .LM17:
165 0052 0E94 0000 call RandomLFSRGen
166 0056 8F71 andi r24,lo8(31)
167 0058 9070 andi r25,hi8(31)
153:mac.c **** listenBits = (DIFS + SLOTTIME * backoffSlots) * LISTEN_RATE; // 监听数 = kbps * ms = bits
169 .LM18:
170 005a 23E1 ldi r18,lo8(19)
171 005c 30E0 ldi r19,hi8(19)
172 005e 829F mul r24,r18
173 0060 A001 movw r20,r0
174 0062 839F mul r24,r19
175 0064 500D add r21,r0
176 0066 929F mul r25,r18
177 0068 500D add r21,r0
178 006a 1124 clr r1
179 006c CA01 movw r24,r20
180 006e 8254 subi r24,lo8(-(190))
181 0070 9F4F sbci r25,hi8(-(190))
154:mac.c **** // 开始载波监听,采用原子操作,防止起始字符检测到调用
155:mac.c **** intEnabled = inp(SREG) & 0x80;
183 .LM19:
184 0072 CFB7 in r28,95-0x20
185 0074 C078 andi r28,lo8(-128)
156:mac.c **** cli();
187 .LM20:
188 /* #APP */
189 0076 F894 cli
157:mac.c **** if (RadiocontrolCarrierSenseStart(listenBits) == SUCCESS) { // 调用监听函数
191 .LM21:
192 /* #NOAPP */
193 0078 0E94 0000 call RadiocontrolCarrierSenseStart
194 007c 8130 cpi r24,lo8(1)
195 007e 19F4 brne .L4
158:mac.c **** state = CARR_SENSE;
197 .LM22:
198 0080 82E0 ldi r24,lo8(2)
199 0082 8093 0000 sts state,r24
200 .L4:
159:mac.c **** }
160:mac.c **** if(intEnabled)
202 .LM23:
203 0086 CC23 tst r28
204 0088 09F0 breq .L2
161:mac.c **** sei();
206 .LM24:
207 /* #APP */
208 008a 7894 sei
209 /* #NOAPP */
210 .L2:
211 /* epilogue: frame size=0 */
212 008c CF91 pop r28
213 008e 0895 ret
214 /* epilogue end (size=2) */
215 /* function tryToSend size 40 (37) */
222 .global MACBroadcastMsg
224 MACBroadcastMsg:
162:mac.c **** }
163:mac.c **** return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -