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

📄 physical.lst

📁 adhoc汇聚节点程序源代码(点对多点)——for atmega128
💻 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:
  75               	.global	update_crc
  77               	update_crc:
   1:physical.c    **** /*
   2:physical.c    **** ****************************************************************************  
   3:physical.c    **** *                        
   4:physical.c    **** *              宁波中科集成电路设计中心  版权所有 Copyright 2005
   5:physical.c    **** *
   6:physical.c    **** *文件名:  Physical.c
   7:physical.c    **** *程序员:  
   8:physical.c    **** *主要内容:物理层调度控制
   9:physical.c    **** *完成日期:2005.5.25
  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    **** #include "led.h"
  19:physical.c    **** 
  20:physical.c    **** extern uint8_t  OS_BCAST_ADDR;
  21:physical.c    **** 											// 物理层状态值
  22:physical.c    **** enum {
  23:physical.c    ****     IDLE,
  24:physical.c    ****     RECEIVING,
  25:physical.c    ****     TRANSMITTING,
  26:physical.c    ****     TRANSMITTING_LAST,
  27:physical.c    ****     TRANSMITTING_DONE
  28:physical.c    **** };
  29:physical.c    **** 
  30:physical.c    **** enum {FREE, BUSY};							// 缓存状态
  31:physical.c    **** 
  32:physical.c    **** static char state;							// 物理层状态变量
  33:physical.c    **** uint8_t pktLength;							// 包括包头的包长度
  34:physical.c    **** OSMACMsg buffer1;							// 用于接收和处理的缓存空间
  35:physical.c    **** OSMACMsg buffer2;
  36:physical.c    **** char recvBufState;							// 接收缓存状态
  37:physical.c    **** char procBufState;							// 处理缓存状态
  38:physical.c    **** char* procBufPtr;							// 处理缓存地址,用于接收和处理缓存地址交换
  39:physical.c    **** char* sendPtr;								// 指向发送缓存,由上层分配
  40:physical.c    **** char* recvPtr;								// 指向接收缓存
  41:physical.c    **** char* procPtr;								// 指向处理缓存
  42:physical.c    **** static uint8_t txCount;						// 发送字节计数变量
  43:physical.c    **** uint8_t recvCount;							// 接收字节计数变量
  44:physical.c    **** int16_t crcRx;								// 接收数据包CRC计算结果
  45:physical.c    **** int16_t crcTx;								// 发送数据包CRC计算结果
  46:physical.c    **** 
  47:physical.c    **** /*************************************************************************
  48:physical.c    **** *功能描述:16位CRC计算
  49:physical.c    **** *参数说明:待计算的八位数据,上一次计算的CRC结果
  50:physical.c    **** *返回值:  CRC计算一次后的结果
  51:physical.c    **** **************************************************************************/
  52:physical.c    **** int16_t update_crc(char data, int16_t crc)
  53:physical.c    **** {
  79               	.LM1:
  80               	/* prologue: frame size=0 */
  81               	/* prologue end (size=0) */
  54:physical.c    **** 	char i;
  55:physical.c    **** 	int16_t tmp;
  56:physical.c    **** 	tmp = (int16_t)(data);
  83               	.LM2:
  84 0000 9927      		clr r25
  57:physical.c    **** 	crc = crc ^ (tmp << 8);
  86               	.LM3:
  87 0002 982F      		mov r25,r24
  88 0004 8827      		clr r24
  89 0006 6827      		eor r22,r24
  90 0008 7927      		eor r23,r25
  58:physical.c    **** 	for (i = 0; i < 8; i++) {
  92               	.LM4:
  93 000a 20E0      		ldi r18,lo8(0)
  94 000c 41E2      		ldi r20,lo8(4129)
  95 000e 50E1      		ldi r21,hi8(4129)
  96               	.L7:
  97 0010 CB01      		movw r24,r22
  98 0012 880F      		lsl r24
  99 0014 991F      		rol r25
 100 0016 2F5F      		subi r18,lo8(-(1))
  59:physical.c    **** 		if (crc & 0x8000)
 102               	.LM5:
 103 0018 77FF      		sbrs r23,7
 104 001a 04C0      		rjmp .L5
  60:physical.c    ****             crc = (crc << 1) ^ 0x1021;  // << is done before ^
 106               	.LM6:
 107 001c BC01      		movw r22,r24
 108 001e 6427      		eor r22,r20
 109 0020 7527      		eor r23,r21
 110 0022 01C0      		rjmp .L4
 111               	.L5:
  61:physical.c    **** 		else
  62:physical.c    ****             crc = crc << 1;
 113               	.LM7:
 114 0024 BC01      		movw r22,r24
 115               	.L4:
 117               	.LM8:
 118 0026 2830      		cpi r18,lo8(8)
 119 0028 98F3      		brlo .L7
  63:physical.c    **** 	}
  64:physical.c    **** 	return crc;
  65:physical.c    **** }
 121               	.LM9:
 122 002a CB01      		movw r24,r22
 123               	/* epilogue: frame size=0 */
 124 002c 0895      		ret
 125               	/* epilogue end (size=1) */
 126               	/* function update_crc size 23 (22) */
 131               	.global	packet_received
 133               	packet_received:
  66:physical.c    **** 
  67:physical.c    **** /*************************************************************************
  68:physical.c    **** *功能描述:数据包接收完成任务函数,通知MAC接收处理缓存中的包,并清空处理缓存
  69:physical.c    **** *          和接收缓存
  70:physical.c    **** *参数说明:无
  71:physical.c    **** *返回值:  无
  72:physical.c    **** **************************************************************************/
  73:physical.c    **** void packet_received(void)
  74:physical.c    **** {
 135               	.LM10:
 136               	/* prologue: frame size=0 */
 137               	/* prologue end (size=0) */
  75:physical.c    **** 	void* tmp;
  76:physical.c    **** 	char error, intEnabled;
  77:physical.c    **** 	uint8_t len;
  78:physical.c    **** 	len = (uint8_t)procPtr[0];
 139               	.LM11:
 140 002e E091 0000 		lds r30,procPtr
 141 0032 F091 0000 		lds r31,(procPtr)+1
 142 0036 8081      		ld r24,Z
  79:physical.c    **** 	if (crcRx != *(int16_t*)(procPtr + len - 2)) {
 144               	.LM12:
 145 0038 E80F      		add r30,r24
 146 003a F11D      		adc r31,__zero_reg__
 147 003c 3297      		sbiw r30,2
 148 003e 2091 0000 		lds r18,crcRx
 149 0042 3091 0000 		lds r19,(crcRx)+1
 150 0046 8081      		ld r24,Z
 151 0048 9181      		ldd r25,Z+1
 152 004a 2817      		cp r18,r24
 153 004c 3907      		cpc r19,r25
 154 004e 11F0      		breq .L11
  80:physical.c    **** 		error = 1;
 156               	.LM13:
 157 0050 61E0      		ldi r22,lo8(1)
 158 0052 01C0      		rjmp .L12
 159               	.L11:
  81:physical.c    **** 	} else {
  82:physical.c    **** 		error = 0;
 161               	.LM14:
 162 0054 60E0      		ldi r22,lo8(0)
 163               	.L12:
  83:physical.c    **** 	}
  84:physical.c    **** 	tmp = MACPhysicalRxPktDone(procPtr, error);					// 通知MAC对接收到的数据包进行处理
 165               	.LM15:
 166 0056 8091 0000 		lds r24,procPtr
 167 005a 9091 0000 		lds r25,(procPtr)+1
 168 005e 0E94 0000 		call MACPhysicalRxPktDone
 169 0062 9C01      		movw r18,r24
  85:physical.c    **** 	if (tmp) {
 171               	.LM16:
 172 0064 892B      		or r24,r25
 173 0066 09F4      		brne .+2
 174 0068 43C0      		rjmp .L10
  86:physical.c    **** 		intEnabled = (* (volatile unsigned char *) (0x3F + 0x20)) & 0x80;
 176               	.LM17:
 177 006a 4FB7      		in r20,95-0x20
 178 006c 4078      		andi r20,lo8(-128)
  87:physical.c    **** 		* (volatile unsigned char *) (0x3F + 0x20) &= ~0x80;		// 关中断
 180               	.LM18:
 181 006e 8FB7      		in r24,95-0x20
 182 0070 8F77      		andi r24,lo8(127)
 183 0072 8FBF      		out 95-0x20,r24
  88:physical.c    **** 		if (recvBufState == BUSY) {									// 接收缓冲中有数据待处理
 185               	.LM19:
 186 0074 8091 0000 		lds r24,recvBufState
 187 0078 8130      		cpi r24,lo8(1)
 188 007a 79F4      		brne .L14
  89:physical.c    ****             procPtr = recvPtr;										// 处理缓冲获得待处理数据地址
 190               	.LM20:
 191 007c 8091 0000 		lds r24,recvPtr
 192 0080 9091 0000 		lds r25,(recvPtr)+1
 193 0084 9093 0000 		sts (procPtr)+1,r25
 194 0088 8093 0000 		sts procPtr,r24
  90:physical.c    ****             recvPtr = (char*)tmp;									// 接收缓冲置空闲,可用于接收
 196               	.LM21:
 197 008c 3093 0000 		sts (recvPtr)+1,r19
 198 0090 2093 0000 		sts recvPtr,r18
  91:physical.c    ****             recvBufState = FREE;  
 200               	.LM22:
 201 0094 1092 0000 		sts recvBufState,__zero_reg__
 202 0098 0AC0      		rjmp .L15
 203               	.L14:
  92:physical.c    **** 		} else {
  93:physical.c    ****             procPtr = 0;											// 接收缓冲中无数据
 205               	.LM23:
 206 009a 1092 0000 		sts (procPtr)+1,__zero_reg__
 207 009e 1092 0000 		sts procPtr,__zero_reg__
  94:physical.c    ****             procBufPtr = (char *)tmp;
 209               	.LM24:
 210 00a2 3093 0000 		sts (procBufPtr)+1,r19
 211 00a6 2093 0000 		sts procBufPtr,r18
  95:physical.c    ****             procBufState = FREE;									// 处理缓冲可用
 213               	.LM25:
 214 00aa 1092 0000 		sts procBufState,__zero_reg__
 215               	.L15:
  96:physical.c    **** 		}
  97:physical.c    **** 		if (intEnabled) 
 217               	.LM26:
 218 00ae 4423      		tst r20
 219 00b0 19F0      		breq .L16
  98:physical.c    **** 			* (volatile unsigned char *) (0x3F + 0x20) |= 0x80;		// 开中断
 221               	.LM27:
 222 00b2 8FB7      		in r24,95-0x20
 223 00b4 8068      		ori r24,lo8(-128)
 224 00b6 8FBF      		out 95-0x20,r24
 225               	.L16:
  99:physical.c    **** 		if (procPtr) {												// 处理从接收缓冲得到的数据
 227               	.LM28:
 228 00b8 8091 0000 		lds r24,procPtr
 229 00bc 9091 0000 		lds r25,(procPtr)+1
 230 00c0 892B      		or r24,r25
 231 00c2 B1F0      		breq .L10
 100:physical.c    ****             if ( !OSPostTask(packet_received) ) {					// 任务队列满,丢弃数据包
 233               	.LM29:
 234 00c4 80E0      		ldi r24,lo8(pm(packet_received))
 235 00c6 90E0      		ldi r25,hi8(pm(packet_received))
 236 00c8 0E94 0000 		call OSPostTask
 237 00cc 282F      		mov r18,r24
 238 00ce 8823      		tst r24
 239 00d0 79F4      		brne .L10
 101:physical.c    **** 				procBufPtr = procPtr;					
 241               	.LM30:
 242 00d2 8091 0000 		lds r24,procPtr
 243 00d6 9091 0000 		lds r25,(procPtr)+1
 244 00da 9093 0000 		sts (procBufPtr)+1,r25
 245 00de 8093 0000 		sts procBufPtr,r24
 102:physical.c    **** 				procBufState = FREE;
 247               	.LM31:
 248 00e2 2093 0000 		sts procBufState,r18
 103:physical.c    **** 				MACPhysicalRxPktDone((void *) 0, 1);				// 通知MAC
 250               	.LM32:
 251 00e6 61E0      		ldi r22,lo8(1)
 252 00e8 80E0      		ldi r24,lo8(0)
 253 00ea 90E0      		ldi r25,hi8(0)
 254 00ec 0E94 0000 		call MACPhysicalRxPktDone
 255               	.L10:
 256 00f0 0895      		ret
 257               	/* epilogue: frame size=0 */
 258 00f2 0895      		ret
 259               	/* epilogue end (size=1) */
 260               	/* function packet_received size 99 (98) */
 267               	.global	packet_sent
 269               	packet_sent:
 104:physical.c    ****             }
 105:physical.c    **** 		}
 106:physical.c    **** 	}
 107:physical.c    **** }
 108:physical.c    **** 
 109:physical.c    **** /*************************************************************************
 110:physical.c    **** *功能描述:数据包发送完成任务函数,通知MAC数据包已经发送
 111:physical.c    **** *参数说明:无
 112:physical.c    **** *返回值:  无
 113:physical.c    **** **************************************************************************/
 114:physical.c    **** void packet_sent(void)
 115:physical.c    **** {
 271               	.LM33:
 272               	/* prologue: frame size=0 */
 273               	/* prologue end (size=0) */
 116:physical.c    **** 	MACPhysicalTxPktDone(sendPtr);
 275               	.LM34:
 276 00f4 8091 0000 		lds r24,sendPtr
 277 00f8 9091 0000 		lds r25,(sendPtr)+1
 278 00fc 0E94 0000 		call MACPhysicalTxPktDone
 279               	/* epilogue: frame size=0 */
 280 0100 0895      		ret
 281               	/* epilogue end (size=1) */
 282               	/* function packet_sent size 7 (6) */
 285               	.global	PhysicalInit
 287               	PhysicalInit:
 117:physical.c    **** }
 118:physical.c    **** 
 119:physical.c    **** /*************************************************************************
 120:physical.c    **** *功能描述:物理层初始化
 121:physical.c    **** *参数说明:无
 122:physical.c    **** *返回值:  无
 123:physical.c    **** **************************************************************************/
 124:physical.c    **** result_t PhysicalInit(void)
 125:physical.c    **** {
 289               	.LM35:
 290               	/* prologue: frame size=0 */
 291               	/* prologue end (size=0) */
 126:physical.c    **** 	state = IDLE;

⌨️ 快捷键说明

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