?? mac.lst
字號(hào):
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 01 .byte 1
91 .text
93 .global MACInit
95 MACInit:
1:mac.c **** /*
2:mac.c **** ****************************************************************************
3:mac.c **** *
4:mac.c **** * 寧波中科集成電路設(shè)計(jì)中心 版權(quán)所有 Copyright 2005
5:mac.c **** *
6:mac.c **** *文件名: mac.c
7:mac.c **** *程序員: xp
8:mac.c **** *主要內(nèi)容:mac通信協(xié)議棧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 "testBase.h"
17:mac.c **** #include "led.h"
18:mac.c **** #include "physical.h"
19:mac.c **** #include "uartPacket.h"
20:mac.c **** #include "fun.h"
21:mac.c **** #include "macClock.h"
22:mac.c **** #include "radiocontrol.h" // 載波監(jiān)聽
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 = 0x01;
27:mac.c **** uint8_t OS_BCAST_ADDR = 0xFF;
28:mac.c ****
29:mac.c ****
30:mac.c **** #define MAC_RETRY_LIMIT 2 // RTS重傳最大次數(shù)
31:mac.c **** #define DIFS 10 // 空閑監(jiān)聽間隔
32:mac.c **** #define SIFS 1 // CTS,DATA,ACK包之前
33:mac.c **** #define EIFS 10 // 802.11在接收到錯(cuò)誤幀后的重新監(jiān)聽間隔
34:mac.c **** #define TX_PKT_DONE_TIME 2000
35:mac.c **** #define SLOTTIME 1 // MAC層競爭窗口時(shí)隙長度
36:mac.c **** #define DATA_CW 31 // 數(shù)據(jù)幀退避窗口最大值
37:mac.c **** #define GUARDTIME 5
38:mac.c ****
39:mac.c **** // MAC層狀態(tài)
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 **** // 射頻狀態(tài)
52:mac.c **** enum { RADIO_SLEEP, RADIO_IDLE, RADIO_RX, RADIO_TX };
53:mac.c ****
54:mac.c **** // 發(fā)送方式
55:mac.c **** enum { BCAST_DATA, SEND_SYNC, SEND_RTS, SEND_CTS, SEND_DATA, SEND_ACK };
56:mac.c ****
57:mac.c **** // MAC 數(shù)據(jù)包類型
58:mac.c **** enum { RTS_PKT, CTS_PKT, DATA_PKT, ACK_PKT };
59:mac.c ****
60:mac.c ****
61:mac.c **** // 狀態(tài)變量
62:mac.c **** static char state; // MAC 狀態(tài)變量
63:mac.c **** static char radioState; //
64:mac.c ****
65:mac.c **** // 計(jì)時(shí)變量
66:mac.c **** uint32_t clockTime; // 微秒為單位的MAC層時(shí)鐘計(jì)數(shù)變量
67:mac.c **** uint16_t durCtrlPkt; // 發(fā)送控制幀需要的時(shí)間
68:mac.c **** uint16_t timeWaitCtrl; // 等待控制幀CTS、ACK的時(shí)間
69:mac.c **** uint16_t durDataPkt;
70:mac.c **** uint16_t timeWaitData; // 等待DATA的時(shí)間
71:mac.c **** uint16_t geneTime; //
72:mac.c **** uint8_t txDelay; // 短幀間隔到達(dá)定時(shí),發(fā)送CTS、DATA、ACK之前等待的時(shí)間
73:mac.c **** uint8_t retryTime; //
74:mac.c ****
75:mac.c **** // 發(fā)送相關(guān)變量
76:mac.c **** char txRequest; // 是否接受了一個(gè)發(fā)送請(qǐng)求,且未發(fā)送
77:mac.c **** char howToSend; // 發(fā)送包方式
78:mac.c **** uint16_t sendAddr; // 目的節(jié)點(diǎn)地址
79:mac.c **** uint8_t numRetry; // RTS重傳次數(shù)
80:mac.c **** uint8_t numExtend; // ACK超時(shí)時(shí)發(fā)送時(shí)間的擴(kuò)展次數(shù)
81:mac.c **** uint8_t txPktLen; // 傳輸?shù)陌L度
82:mac.c **** static OSMACMsgPtr dataPkt;// MAC包頭指針
83:mac.c **** OSMACCtrlMsg ctrlPkt; // 控制包
84:mac.c ****
85:mac.c **** // 接收相關(guān)變量
86:mac.c **** uint16_t recvAddr; // 數(shù)據(jù)包源地址
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 **** 等待控制包的時(shí)間: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 **** // 初始化狀態(tài)變量
110:mac.c **** state = IDLE;
101 .LM2:
102 0000 81E0 ldi r24,lo8(1)
103 0002 8093 0000 sts state,r24
111:mac.c **** radioState = RADIO_IDLE;
105 .LM3:
106 0006 8093 0000 sts radioState,r24
112:mac.c ****
113:mac.c ****
114:mac.c **** // 初始化計(jì)時(shí)變量
115: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__
116:mac.c **** txDelay = 0;
114 .LM5:
115 001a 1092 0000 sts txDelay,__zero_reg__
117:mac.c ****
118:mac.c **** // 初始化發(fā)送相關(guān)變量
119:mac.c **** txRequest = 0;
117 .LM6:
118 001e 1092 0000 sts txRequest,__zero_reg__
120:mac.c ****
121:mac.c **** retryTime = 0;
120 .LM7:
121 0022 1092 0000 sts retryTime,__zero_reg__
122:mac.c ****
123:mac.c **** // 初始化UART debugging
124:mac.c **** uartDebug_init();
123 .LM8:
124 0026 0E94 0000 call uartDebug_init
125:mac.c ****
126:mac.c **** // 初始化隨機(jī)數(shù)生成器
127:mac.c **** RandomInit();
126 .LM9:
127 002a 0E94 0000 call RandomInit
128:mac.c ****
129:mac.c **** // 初始化并啟動(dòng)MAC層定時(shí)器
130:mac.c **** ClockStart();
129 .LM10:
130 002e 0E94 0000 call ClockStart
131:mac.c ****
132:mac.c **** // 初始化物理層
133:mac.c **** PhysicalInit();
132 .LM11:
133 0032 0E94 0000 call PhysicalInit
134:mac.c ****
135:mac.c **** return SUCCESS;
136:mac.c **** }
135 .LM12:
136 0036 81E0 ldi r24,lo8(1)
137 0038 90E0 ldi r25,hi8(1)
138 /* epilogue: frame size=0 */
139 003a 0895 ret
140 /* epilogue end (size=1) */
141 /* function MACInit size 30 (29) */
145 tryToSend:
137:mac.c ****
138:mac.c **** /*************************************************************************
139:mac.c **** *功能描述:發(fā)送數(shù)據(jù)包的開始,開始空閑監(jiān)聽,準(zhǔn)備發(fā)送廣播或者RTS數(shù)據(jù)包
140:mac.c **** *參數(shù)說明:
141:mac.c **** *返回值:
142:mac.c **** **************************************************************************/
143:mac.c **** static void tryToSend() // 判斷是否允許發(fā)送,如果是,則進(jìn)行監(jiān)聽
144:mac.c **** {
147 .LM13:
148 /* prologue: frame size=0 */
149 003c CF93 push r28
150 /* prologue end (size=1) */
145:mac.c **** uint16_t backoffSlots, listenBits;
146:mac.c **** char intEnabled;
147:mac.c **** if (state == IDLE) { // 空閑時(shí)
152 .LM14:
153 003e 8091 0000 lds r24,state
154 0042 8130 cpi r24,lo8(1)
155 0044 F9F4 brne .L2
148:mac.c **** howToSend = BCAST_DATA;
157 .LM15:
158 0046 1092 0000 sts howToSend,__zero_reg__
149:mac.c **** backoffSlots = RandomLFSRGen() & (uint16_t)DATA_CW; // 退避時(shí)間<=DATA_CW
160 .LM16:
161 004a 0E94 0000 call RandomLFSRGen
162 004e 8F71 andi r24,lo8(31)
163 0050 9070 andi r25,hi8(31)
150:mac.c **** listenBits = (DIFS + SLOTTIME * backoffSlots) * LISTEN_RATE; // 監(jiān)聽數(shù) = kbps * ms = bits
165 .LM17:
166 0052 23E1 ldi r18,lo8(19)
167 0054 30E0 ldi r19,hi8(19)
168 0056 829F mul r24,r18
169 0058 A001 movw r20,r0
170 005a 839F mul r24,r19
171 005c 500D add r21,r0
172 005e 929F mul r25,r18
173 0060 500D add r21,r0
174 0062 1124 clr r1
175 0064 CA01 movw r24,r20
176 0066 8254 subi r24,lo8(-(190))
177 0068 9F4F sbci r25,hi8(-(190))
151:mac.c **** // 開始載波監(jiān)聽,采用原子操作,防止起始字符檢測(cè)到調(diào)用
152:mac.c **** intEnabled = inp(SREG) & 0x80;
179 .LM18:
180 006a CFB7 in r28,95-0x20
181 006c C078 andi r28,lo8(-128)
153:mac.c **** cli();
183 .LM19:
184 /* #APP */
185 006e F894 cli
154:mac.c **** if (RadiocontrolCarrierSenseStart(listenBits) == SUCCESS) { // 調(diào)用監(jiān)聽函數(shù)
187 .LM20:
188 /* #NOAPP */
189 0070 0E94 0000 call RadiocontrolCarrierSenseStart
190 0074 8130 cpi r24,lo8(1)
191 0076 19F4 brne .L4
155:mac.c **** state = CARR_SENSE;
193 .LM21:
194 0078 82E0 ldi r24,lo8(2)
195 007a 8093 0000 sts state,r24
196 .L4:
156:mac.c **** }
157:mac.c **** if(intEnabled)
198 .LM22:
199 007e CC23 tst r28
200 0080 09F0 breq .L2
158:mac.c **** sei();
202 .LM23:
203 /* #APP */
204 0082 7894 sei
205 /* #NOAPP */
206 .L2:
207 /* epilogue: frame size=0 */
208 0084 CF91 pop r28
209 0086 0895 ret
210 /* epilogue end (size=2) */
211 /* function tryToSend size 40 (37) */
218 .global MACBroadcastMsg
220 MACBroadcastMsg:
159:mac.c **** }
160:mac.c **** return;
161:mac.c **** }
162:mac.c ****
163:mac.c **** /*************************************************************************
164:mac.c **** *功能描述:發(fā)送廣播數(shù)據(jù)包的接口函數(shù)
165:mac.c **** *參數(shù)說明:包地址,包長度(MAC包數(shù)據(jù)部分的長度)
166:mac.c **** *返回值:
167:mac.c **** **************************************************************************/
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -