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

📄 mac.lst

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 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:
  96               	.global	MACInit
  98               	MACInit:
   1:mac.c         **** /*
   2:mac.c         **** ****************************************************************************
   3:mac.c         **** *              宁波中科集成电路设计中心  版权所有 Copyright 2005
   4:mac.c         **** *						http:\\www.nbicc.com
   5:mac.c         **** *文件名:  mac.c
   6:mac.c         **** *程序员:  夏鹏		xpsonny@nbicc.com
   7:mac.c         **** *主要内容:MAC层
   8:mac.c         **** 
   9:mac.c         **** *如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
  10:mac.c         **** ****************************************************************************
  11:mac.c         **** */
  12:mac.c         **** /////
  13:mac.c         **** #include "led.h"
  14:mac.c         **** ////
  15:mac.c         **** #include "os.h"
  16:mac.c         **** #include "mac.h"
  17:mac.c         **** #include "message.h"
  18:mac.c         **** #include "macClock.h"
  19:mac.c         **** #include "global.h"
  20:mac.c         **** #include "physical.h"
  21:mac.c         **** #include "fun.h"
  22:mac.c         **** #include "dataqueue.h"
  23:mac.c         **** #include "radiocontrol.h" // 载波监听
  24:mac.c         **** #include <avr/io.h>
  25:mac.c         **** #include <avr/interrupt.h>
  26:mac.c         **** 
  27:mac.c         **** //内部函数声明
  28:mac.c         **** static result_t MACTxReset(void);								// 清空所有发送任务
  29:mac.c         **** static void handleRTS(void* packet);
  30:mac.c         **** static void handleCTS(void* packet);
  31:mac.c         **** static void* handleDATA(void* packet);
  32:mac.c         **** static void handleACK(void* packet);
  33:mac.c         **** static void startBcast(void);
  34:mac.c         **** //static void sendRTS(void);
  35:mac.c         **** //static void sendCTS(void);
  36:mac.c         **** //static void sendDATA(void);
  37:mac.c         **** static void sendACK(uint8_t DataSrcAddr);
  38:mac.c         **** static void startACK(void);
  39:mac.c         **** static void tryToSend(void);
  40:mac.c         **** 
  41:mac.c         **** static void SetWaitTime(void);
  42:mac.c         **** 
  43:mac.c         **** // MAC层状态
  44:mac.c         **** enum {
  45:mac.c         **** 	SLEEP,
  46:mac.c         **** 	IDLE,
  47:mac.c         **** 	CARR_SENSE,
  48:mac.c         **** 	TX_PKT,
  49:mac.c         **** 	BACKOFF,
  50:mac.c         **** 	WAIT_CTS,
  51:mac.c         **** 	WAIT_DATA,
  52:mac.c         **** 	WAIT_ACK
  53:mac.c         **** };
  54:mac.c         **** 
  55:mac.c         **** // 射频状态
  56:mac.c         **** enum { RADIO_SLEEP, RADIO_IDLE, RADIO_RX, RADIO_TX };
  57:mac.c         **** 
  58:mac.c         **** // 发送方式
  59:mac.c         **** enum { BCAST_DATA, SEND_SYNC, SEND_RTS, SEND_CTS, SEND_DATA, SEND_ACK };
  60:mac.c         **** //enum { BCAST_DATA,SEND_CTRL};
  61:mac.c         **** 
  62:mac.c         **** // MAC 数据包类型
  63:mac.c         **** enum { RTS_PKT, CTS_PKT, DATA_PKT, ACK_PKT };
  64:mac.c         **** 
  65:mac.c         **** 
  66:mac.c         **** // 状态变量
  67:mac.c         **** static char state;		// MAC 状态变量
  68:mac.c         **** //static char ctrlstate; //MAC层的控制状态,主要用于RTS/CTS 以及ACK的控制
  69:mac.c         **** static char oldstate;
  70:mac.c         **** static char radioState;	 
  71:mac.c         **** 
  72:mac.c         **** // 发送相关变量
  73:mac.c         **** static char txRequest;			// 是否接受了一个发送请求,且未发送
  74:mac.c         **** static char howToSend;			// 发送包方式
  75:mac.c         **** static uint8_t txPktLen;		// 传输的数据包长度
  76:mac.c         **** static uint8_t ctrlPktLen;     //  传输的控制包长度
  77:mac.c         **** static OSMACMsgPtr dataPkt;    // MAC包头指针
  78:mac.c         **** static OSMACCtrlMsg ctrlPkt;	// 控制包
  79:mac.c         **** static OSMACCtrlMsgPtr ctrlPktPt;
  80:mac.c         **** static uint8_t AckWaitTime;
  81:mac.c         **** 
  82:mac.c         **** 
  83:mac.c         **** /**********************************************************************************
  84:mac.c         ****   初始化:
  85:mac.c         ****   等待控制包的时间:timeWaitCtrl
  86:mac.c         **** **********************************************************************************/
  87:mac.c         **** result_t MACInit()									
  88:mac.c         **** {
 100               	.LM1:
 101               	/* prologue: frame size=0 */
 102               	/* prologue end (size=0) */
  89:mac.c         **** 	// 初始化状态变量
  90:mac.c         **** 	state = IDLE;
 104               	.LM2:
 105 0000 81E0      		ldi r24,lo8(1)
 106 0002 8093 0000 		sts state,r24
  91:mac.c         **** 	//ctrlstate = IDLE;
  92:mac.c         **** 	oldstate = IDLE;
 108               	.LM3:
 109 0006 8093 0000 		sts oldstate,r24
  93:mac.c         **** 	radioState = RADIO_IDLE;
 111               	.LM4:
 112 000a 8093 0000 		sts radioState,r24
  94:mac.c         **** 	
  95:mac.c         **** 	// 初始化发送相关变量
  96:mac.c         **** 	txRequest = 0;
 114               	.LM5:
 115 000e 1092 0000 		sts txRequest,__zero_reg__
  97:mac.c         **** 	AckWaitTime = 0;
 117               	.LM6:
 118 0012 1092 0000 		sts AckWaitTime,__zero_reg__
  98:mac.c         **** 
  99:mac.c         **** 	// 初始化随机数生成器
 100:mac.c         **** 	RandomInit();
 120               	.LM7:
 121 0016 0E94 0000 		call RandomInit
 101:mac.c         **** 	// 初始化缓冲队列
 102:mac.c         **** 	QueueInit();
 123               	.LM8:
 124 001a 0E94 0000 		call QueueInit
 103:mac.c         ****     //mac层tick时钟初始化
 104:mac.c         **** 	ClockStart();	
 126               	.LM9:
 127 001e 0E94 0000 		call ClockStart
 105:mac.c         **** 	// 初始化物理层
 106:mac.c         **** 	PhysicalInit();
 129               	.LM10:
 130 0022 0E94 0000 		call PhysicalInit
 107:mac.c         **** 	
 108:mac.c         **** 	return SUCCESS;
 109:mac.c         **** } 
 132               	.LM11:
 133 0026 81E0      		ldi r24,lo8(1)
 134 0028 90E0      		ldi r25,hi8(1)
 135               	/* epilogue: frame size=0 */
 136 002a 0895      		ret
 137               	/* epilogue end (size=1) */
 138               	/* function MACInit size 22 (21) */
 142               	tryToSend:
 110:mac.c         **** /*************************************************************************
 111:mac.c         **** *功能描述:发送ack开始,开始空闲监听,准备发送ack数据包
 112:mac.c         **** *参数说明:
 113:mac.c         **** *返回值:
 114:mac.c         **** *************************************************************************/
 115:mac.c         **** static void tryToSendACK(void){
 116:mac.c         **** 	startACK();
 117:mac.c         **** }
 118:mac.c         **** /*************************************************************************
 119:mac.c         **** *功能描述:发送数据包的开始,开始空闲监听,准备发送广播或者RTS数据包
 120:mac.c         **** *参数说明:
 121:mac.c         **** *返回值:  
 122:mac.c         **** **************************************************************************/
 123:mac.c         **** static void tryToSend()														// 判断是否允许发送,如果是,则进行监听
 124:mac.c         **** {
 144               	.LM12:
 145               	/* prologue: frame size=0 */
 146 002c CF93      		push r28
 147               	/* prologue end (size=1) */
 125:mac.c         **** 	char intEnabled;
 126:mac.c         **** 	if (state == IDLE) {													// 空闲时
 149               	.LM13:
 150 002e 8091 0000 		lds r24,state
 151 0032 8130      		cpi r24,lo8(1)
 152 0034 A9F4      		brne .L3
 127:mac.c         ****         howToSend = BCAST_DATA;
 154               	.LM14:
 155 0036 1092 0000 		sts howToSend,__zero_reg__
 128:mac.c         **** 		// 开始载波监听,采用原子操作,防止起始字符检测到调用
 129:mac.c         **** 		intEnabled = inp(SREG) & 0x80;
 157               	.LM15:
 158 003a CFB7      		in r28,95-0x20
 159 003c C078      		andi r28,lo8(-128)
 130:mac.c         **** 		cli();
 161               	.LM16:
 162               	/* #APP */
 163 003e F894      		cli
 131:mac.c         **** 		if (RadiocontrolCarrierSenseStart(80) == SUCCESS) {			// 调用监听函数
 165               	.LM17:
 166               	/* #NOAPP */
 167 0040 80E5      		ldi r24,lo8(80)
 168 0042 90E0      		ldi r25,hi8(80)
 169 0044 0E94 0000 		call RadiocontrolCarrierSenseStart
 170 0048 8130      		cpi r24,lo8(1)
 171 004a 21F4      		brne .L4
 132:mac.c         ****             state = CARR_SENSE;
 173               	.LM18:
 174 004c 82E0      		ldi r24,lo8(2)
 175 004e 8093 0000 		sts state,r24
 176 0052 02C0      		rjmp .L5
 177               	.L4:
 133:mac.c         **** 		}
 134:mac.c         **** 		else {
 135:mac.c         **** 			txRequest =0;
 179               	.LM19:
 180 0054 1092 0000 		sts txRequest,__zero_reg__
 181               	.L5:
 136:mac.c         **** 			
 137:mac.c         **** 		}
 138:mac.c         **** 		if(intEnabled)
 183               	.LM20:
 184 0058 CC23      		tst r28
 185 005a 21F0      		breq .L2
 139:mac.c         **** 			sei();
 187               	.LM21:
 188               	/* #APP */
 189 005c 7894      		sei
 190               	/* #NOAPP */
 191 005e 02C0      		rjmp .L2
 192               	.L3:
 140:mac.c         **** 	} 
 141:mac.c         **** 	else {
 142:mac.c         **** 	
 143:mac.c         **** 	txRequest =0;  //去锁 
 194               	.LM22:
 195 0060 1092 0000 		sts txRequest,__zero_reg__
 196               	.L2:
 197               	/* epilogue: frame size=0 */
 198 0064 CF91      		pop r28
 199 0066 0895      		ret
 200               	/* epilogue end (size=2) */
 201               	/* function tryToSend size 32 (29) */
 207               	.global	MACBroadcastMsg
 209               	MACBroadcastMsg:
 144:mac.c         **** 	
 145:mac.c         **** 	}
 146:mac.c         **** 	return;
 147:mac.c         **** }
 148:mac.c         **** 
 149:mac.c         **** /*************************************************************************
 150:mac.c         **** *功能描述:发送广播数据包的接口函数
 151:mac.c         **** *参数说明:包地址,包长度(MAC包数据部分的长度)
 152:mac.c         **** *返回值:  
 153:mac.c         **** **************************************************************************/
 154:mac.c         **** result_t MACBroadcastMsg(void* data, uint8_t length)
 155:mac.c         **** {   
 211               	.LM23:
 212               	/* prologue: frame size=0 */
 213               	/* prologue end (size=0) */
 214 0068 FC01      		movw r30,r24
 156:mac.c         ****     char intEnabled;					
 157:mac.c         **** 
 158:mac.c         **** 	// 错误的发送方式
 159:mac.c         **** 	if (data == 0 || length == 0 || length > MAX_PKT_LEN - MAC_HEADER_LEN) {
 216               	.LM24:
 217 006a 892B      		or r24,r25
 218 006c C9F0      		breq .L14
 220               	.LM25:
 221 006e 6623      		tst r22
 222 0070 B9F0      		breq .L14
 223 0072 6633      		cpi r22,lo8(54)
 224 0074 A8F4      		brsh .L14
 160:mac.c         **** 		return FAIL;
 161:mac.c         **** 	}
 162:mac.c         **** 
 163:mac.c         **** 	// 设置发送请求标识
 164:mac.c         **** 	intEnabled = inp(SREG) & 0x80;
 226               	.LM26:
 227 0076 9FB7      		in r25,95-0x20
 228 0078 9078      		andi r25,lo8(-128)
 165:mac.c         **** 	cli();
 230               	.LM27:
 231               	/* #APP */
 232 007a F894      		cli
 166:mac.c         **** 
 167:mac.c         **** 	if ((txRequest == 0)&&(AckWaitTime == 0)) {
 234               	.LM28:
 235               	/* #NOAPP */
 236 007c 8091 0000 		lds r24,txRequest
 237 0080 8823      		tst r24
 238 0082 59F4      		brne .L11
 239 0084 8091 0000 		lds r24,AckWaitTime
 240 0088 8823      		tst r24
 241 008a 39F4      		brne .L11
 168:mac.c         **** 		txRequest = 1;
 243               	.LM29:
 244 008c 81E0      		ldi r24,lo8(1)
 245 008e 8093 0000 		sts txRequest,r24
 169:mac.c         **** 		if (intEnabled) sei();
 247               	.LM30:
 248 0092 9923      		tst r25
 249 0094 41F0      		breq .L13
 250               	/* #APP */
 251 0096 7894      		sei
 252               	/* #NOAPP */
 253 0098 06C0      		rjmp .L13
 254               	.L11:
 170:mac.c         **** 	} else {     
 171:mac.c         **** 		if (intEnabled) sei();
 256               	.LM31:
 257 009a 9923      		tst r25
 258 009c 09F0      		breq .L14
 259               	/* #APP */
 260 009e 7894      		sei
 261               	/* #NOAPP */
 262               	.L14:
 172:mac.c         **** 		return FAIL;
 264               	.LM32:
 265 00a0 80E0      		ldi r24,lo8(0)
 266 00a2 90E0      		ldi r25,hi8(0)
 267 00a4 0895      		ret
 268               	.L13:
 173:mac.c         **** 	}
 174:mac.c         **** 
 175:mac.c         **** 	dataPkt = (OSMACMsgPtr)data;
 270               	.LM33:
 271 00a6 F093 0000 		sts (dataPkt)+1,r31
 272 00aa E093 0000 		sts dataPkt,r30
 176:mac.c         **** 	txPktLen = length + MAC_HEADER_LEN;
 274               	.LM34:
 275 00ae 695F      		subi r22,lo8(-(7))
 276 00b0 6093 0000 		sts txPktLen,r22
 177:mac.c         **** 	// 数据包包头设置
 178:mac.c         **** 	dataPkt->type = DATA_PKT;  
 278               	.LM35:
 279 00b4 82E0      		ldi r24,lo8(2)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -