⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac.lst

📁 adhoc信息节点程序源代码(点对多点)——for atmega128
💻 LST
📖 第 1 页 / 共 4 页
字号:
   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 + -