📄 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 01 .byte 1
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 "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" // 载波监听
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重传最大次数
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 **** // 初始化状态变量
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 **** // 初始化计时变量
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 **** // 初始化发送相关变量
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 **** // 初始化随机数生成器
127:mac.c **** RandomInit();
126 .LM9:
127 002a 0E94 0000 call RandomInit
128:mac.c ****
129:mac.c **** // 初始化并启动MAC层定时器
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 **** *功能描述:发送数据包的开始,开始空闲监听,准备发送广播或者RTS数据包
140:mac.c **** *参数说明:
141:mac.c **** *返回值:
142:mac.c **** **************************************************************************/
143:mac.c **** static void tryToSend() // 判断是否允许发送,如果是,则进行监听
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) { // 空闲时
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; // 退避时间<=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; // 监听数 = 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 **** // 开始载波监听,采用原子操作,防止起始字符检测到调用
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) { // 调用监听函数
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 **** *功能描述:发送广播数据包的接口函数
165:mac.c **** *参数说明:包地址,包长度(MAC包数据部分的长度)
166:mac.c **** *返回值:
167:mac.c **** **************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -