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

📄 physical.lst

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 LST
📖 第 1 页 / 共 3 页
字号:
   1               		.file	"physical.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:
  87               	.global	update_crc
  89               	update_crc:
   1:physical.c    **** /*
   2:physical.c    **** ****************************************************************************
   3:physical.c    **** *              宁波中科集成电路设计中心  版权所有 Copyright 2005
   4:physical.c    **** *						http:\\www.nbicc.com
   5:physical.c    **** *文件名:  physical.h
   6:physical.c    **** *程序员:  夏鹏		xpsonny@nbicc.com
   7:physical.c    **** *主要内容  物理层调度控制
   8:physical.c    **** 
   9:physical.c    **** *如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
  10:physical.c    **** ****************************************************************************
  11:physical.c    **** */
  12:physical.c    **** 
  13:physical.c    **** #include "physical.h"
  14:physical.c    **** #include "message.h"
  15:physical.c    **** #include "radiocontrol.h"
  16:physical.c    **** #include "os.h"
  17:physical.c    **** #include "mac.h"
  18:physical.c    **** 
  19:physical.c    **** //static result_t PhysicalIdle(void);										// 进入空闲
  20:physical.c    **** //static result_t PhysicalSleep(void);										// 睡眠
  21:physical.c    **** 
  22:physical.c    **** //extern uint8_t  OS_BCAST_ADDR;
  23:physical.c    **** 											// 物理层状态值
  24:physical.c    **** enum {
  25:physical.c    ****     IDLE,
  26:physical.c    ****     RECEIVING,
  27:physical.c    ****     TRANSMITTING,
  28:physical.c    ****     TRANSMITTING_LAST,
  29:physical.c    ****     TRANSMITTING_DONE
  30:physical.c    **** };
  31:physical.c    **** 
  32:physical.c    **** enum {FREE, BUSY};							// 缓存状态
  33:physical.c    **** 
  34:physical.c    **** static char state;							// 物理层状态变量
  35:physical.c    **** static uint8_t pktLength;							// 包括包头的包长度
  36:physical.c    **** static OSMACMsg buffer1;							// 用于接收和处理的缓存空间
  37:physical.c    **** static OSMACMsg buffer2;
  38:physical.c    **** static char recvBufState;							// 接收缓存状态
  39:physical.c    **** static char procBufState;							// 处理缓存状态
  40:physical.c    **** static char* procBufPtr;							// 处理缓存地址,用于接收和处理缓存地址交换
  41:physical.c    **** static char* sendPtr;								// 指向发送缓存,由上层分配
  42:physical.c    **** static char* recvPtr;								// 指向接收缓存
  43:physical.c    **** static char* procPtr;								// 指向处理缓存
  44:physical.c    **** static uint8_t txCount;						// 发送字节计数变量
  45:physical.c    **** static uint8_t recvCount;							// 接收字节计数变量
  46:physical.c    **** static int16_t crcRx;								// 接收数据包CRC计算结果
  47:physical.c    **** static int16_t crcTx;								// 发送数据包CRC计算结果
  48:physical.c    **** 
  49:physical.c    **** /*************************************************************************
  50:physical.c    **** *功能描述:16位CRC计算
  51:physical.c    **** *参数说明:待计算的八位数据,上一次计算的CRC结果
  52:physical.c    **** *返回值:  CRC计算一次后的结果
  53:physical.c    **** **************************************************************************/
  54:physical.c    **** int16_t update_crc(char data, int16_t crc)
  55:physical.c    **** {
  91               	.LM1:
  92               	/* prologue: frame size=0 */
  93               	/* prologue end (size=0) */
  56:physical.c    **** 	char i;
  57:physical.c    **** 	int16_t tmp;
  58:physical.c    **** 	tmp = (int16_t)(data);
  95               	.LM2:
  96 0000 9927      		clr r25
  59:physical.c    **** 	crc = crc ^ (tmp << 8);
  98               	.LM3:
  99 0002 982F      		mov r25,r24
 100 0004 8827      		clr r24
 101 0006 6827      		eor r22,r24
 102 0008 7927      		eor r23,r25
  60:physical.c    **** 	for (i = 0; i < 8; i++) {
 104               	.LM4:
 105 000a 20E0      		ldi r18,lo8(0)
 106 000c 41E2      		ldi r20,lo8(4129)
 107 000e 50E1      		ldi r21,hi8(4129)
 108               	.L7:
 109 0010 CB01      		movw r24,r22
 110 0012 880F      		lsl r24
 111 0014 991F      		rol r25
 112 0016 2F5F      		subi r18,lo8(-(1))
  61:physical.c    **** 		if (crc & 0x8000)
 114               	.LM5:
 115 0018 77FF      		sbrs r23,7
 116 001a 04C0      		rjmp .L5
  62:physical.c    ****             crc = (crc << 1) ^ 0x1021;  // << is done before ^
 118               	.LM6:
 119 001c BC01      		movw r22,r24
 120 001e 6427      		eor r22,r20
 121 0020 7527      		eor r23,r21
 122 0022 01C0      		rjmp .L4
 123               	.L5:
  63:physical.c    **** 		else
  64:physical.c    ****             crc = crc << 1;
 125               	.LM7:
 126 0024 BC01      		movw r22,r24
 127               	.L4:
 129               	.LM8:
 130 0026 2830      		cpi r18,lo8(8)
 131 0028 98F3      		brlo .L7
  65:physical.c    **** 	}
  66:physical.c    **** 	return crc;
  67:physical.c    **** }
 133               	.LM9:
 134 002a CB01      		movw r24,r22
 135               	/* epilogue: frame size=0 */
 136 002c 0895      		ret
 137               	/* epilogue end (size=1) */
 138               	/* function update_crc size 23 (22) */
 143               	.global	packet_received
 145               	packet_received:
  68:physical.c    **** 
  69:physical.c    **** /*************************************************************************
  70:physical.c    **** *功能描述:数据包接收完成任务函数,通知MAC接收处理缓存中的包,并清空处理缓存
  71:physical.c    **** *          和接收缓存
  72:physical.c    **** *参数说明:无
  73:physical.c    **** *返回值:  无
  74:physical.c    **** **************************************************************************/
  75:physical.c    **** void packet_received(void)
  76:physical.c    **** {
 147               	.LM10:
 148               	/* prologue: frame size=0 */
 149 002e CF93      		push r28
 150               	/* prologue end (size=1) */
  77:physical.c    **** 	//void* tmp;
  78:physical.c    **** 	char error, intEnabled;
  79:physical.c    **** 	uint8_t len;
  80:physical.c    **** 	len = (uint8_t)procPtr[0];
 152               	.LM11:
 153 0030 E091 0000 		lds r30,procPtr
 154 0034 F091 0000 		lds r31,(procPtr)+1
 155 0038 8081      		ld r24,Z
  81:physical.c    **** 	if (crcRx != *(int16_t*)(procPtr + len - 2)) {
 157               	.LM12:
 158 003a E80F      		add r30,r24
 159 003c F11D      		adc r31,__zero_reg__
 160 003e 3297      		sbiw r30,2
 161 0040 2091 0000 		lds r18,crcRx
 162 0044 3091 0000 		lds r19,(crcRx)+1
 163 0048 8081      		ld r24,Z
 164 004a 9181      		ldd r25,Z+1
 165 004c 2817      		cp r18,r24
 166 004e 3907      		cpc r19,r25
 167 0050 11F0      		breq .L11
  82:physical.c    **** 		error = 1;
 169               	.LM13:
 170 0052 61E0      		ldi r22,lo8(1)
 171 0054 01C0      		rjmp .L12
 172               	.L11:
  83:physical.c    **** 	} else {
  84:physical.c    **** 		error = 0;
 174               	.LM14:
 175 0056 60E0      		ldi r22,lo8(0)
 176               	.L12:
  85:physical.c    **** 	}
  86:physical.c    **** 	// 通知MAC对接收到的数据包进行处理
  87:physical.c    **** 	MACPhysicalRxPktDone(procPtr, error);
 178               	.LM15:
 179 0058 8091 0000 		lds r24,procPtr
 180 005c 9091 0000 		lds r25,(procPtr)+1
 181 0060 0E94 0000 		call MACPhysicalRxPktDone
  88:physical.c    **** 	intEnabled = (* (volatile unsigned char *) (0x3F + 0x20)) & 0x80;
 183               	.LM16:
 184 0064 CFB7      		in r28,95-0x20
 185 0066 C078      		andi r28,lo8(-128)
  89:physical.c    **** 		* (volatile unsigned char *) (0x3F + 0x20) &= ~0x80;		// 关中断
 187               	.LM17:
 188 0068 8FB7      		in r24,95-0x20
 189 006a 8F77      		andi r24,lo8(127)
 190 006c 8FBF      		out 95-0x20,r24
  90:physical.c    **** 		if (recvBufState == BUSY) {									// 接收缓冲中有数据待处理
 192               	.LM18:
 193 006e 8091 0000 		lds r24,recvBufState
 194 0072 8130      		cpi r24,lo8(1)
 195 0074 C9F4      		brne .L13
  91:physical.c    ****             procPtr = recvPtr;										// 处理缓冲获得待处理数据地址
 197               	.LM19:
 198 0076 2091 0000 		lds r18,recvPtr
 199 007a 3091 0000 		lds r19,(recvPtr)+1
 200 007e 3093 0000 		sts (procPtr)+1,r19
 201 0082 2093 0000 		sts procPtr,r18
  92:physical.c    ****             recvPtr = procBufPtr;
 203               	.LM20:
 204 0086 8091 0000 		lds r24,procBufPtr
 205 008a 9091 0000 		lds r25,(procBufPtr)+1
 206 008e 9093 0000 		sts (recvPtr)+1,r25
 207 0092 8093 0000 		sts recvPtr,r24
  93:physical.c    **** 			procBufPtr = procPtr;
 209               	.LM21:
 210 0096 3093 0000 		sts (procBufPtr)+1,r19
 211 009a 2093 0000 		sts procBufPtr,r18
  94:physical.c    **** 			recvBufState = FREE;  
 213               	.LM22:
 214 009e 1092 0000 		sts recvBufState,__zero_reg__
  95:physical.c    **** 		    packet_received();
 216               	.LM23:
 217 00a2 0E94 0000 		call packet_received
 218 00a6 02C0      		rjmp .L15
 219               	.L13:
  96:physical.c    **** 		} else {
  97:physical.c    ****             procBufState = FREE;									// 处理缓冲可用
 221               	.LM24:
 222 00a8 1092 0000 		sts procBufState,__zero_reg__
 223               	.L15:
  98:physical.c    **** 		}
  99:physical.c    **** 		if (intEnabled) 
 225               	.LM25:
 226 00ac CC23      		tst r28
 227 00ae 19F0      		breq .L10
 100:physical.c    **** 			* (volatile unsigned char *) (0x3F + 0x20) |= 0x80;		// 开中断
 229               	.LM26:
 230 00b0 8FB7      		in r24,95-0x20
 231 00b2 8068      		ori r24,lo8(-128)
 232 00b4 8FBF      		out 95-0x20,r24
 233               	.L10:
 234               	/* epilogue: frame size=0 */
 235 00b6 CF91      		pop r28
 236 00b8 0895      		ret
 237               	/* epilogue end (size=2) */
 238               	/* function packet_received size 70 (67) */
 244               	.global	packet_sent
 246               	packet_sent:
 101:physical.c    **** 
 102:physical.c    **** }
 103:physical.c    **** 
 104:physical.c    **** /*************************************************************************
 105:physical.c    **** *功能描述:数据包发送完成任务函数,通知MAC数据包已经发送
 106:physical.c    **** *参数说明:无
 107:physical.c    **** *返回值:  无
 108:physical.c    **** **************************************************************************/
 109:physical.c    **** void packet_sent(void)
 110:physical.c    **** {
 248               	.LM27:
 249               	/* prologue: frame size=0 */
 250               	/* prologue end (size=0) */
 111:physical.c    **** 	MACPhysicalTxPktDone(sendPtr);
 252               	.LM28:
 253 00ba 8091 0000 		lds r24,sendPtr
 254 00be 9091 0000 		lds r25,(sendPtr)+1
 255 00c2 0E94 0000 		call MACPhysicalTxPktDone
 256               	/* epilogue: frame size=0 */
 257 00c6 0895      		ret
 258               	/* epilogue end (size=1) */
 259               	/* function packet_sent size 7 (6) */
 262               	.global	PhysicalInit
 264               	PhysicalInit:
 112:physical.c    **** }
 113:physical.c    **** 
 114:physical.c    **** /*************************************************************************
 115:physical.c    **** *功能描述:物理层初始化
 116:physical.c    **** *参数说明:无
 117:physical.c    **** *返回值:  无
 118:physical.c    **** **************************************************************************/
 119:physical.c    **** result_t PhysicalInit(void)
 120:physical.c    **** {
 266               	.LM29:
 267               	/* prologue: frame size=0 */
 268               	/* prologue end (size=0) */
 121:physical.c    **** 	state = IDLE;
 270               	.LM30:
 271 00c8 1092 0000 		sts state,__zero_reg__
 122:physical.c    **** 	recvPtr = (char*)&buffer1;
 273               	.LM31:
 274 00cc 80E0      		ldi r24,lo8(buffer1)
 275 00ce 90E0      		ldi r25,hi8(buffer1)
 276 00d0 9093 0000 		sts (recvPtr)+1,r25
 277 00d4 8093 0000 		sts recvPtr,r24
 123:physical.c    **** 	procBufPtr = (char*)&buffer2;

⌨️ 快捷键说明

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