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

📄 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 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 + -