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

📄 dataqueue.lst

📁 一个WSN的树状路由,对于那些学WSN路由方面的朋友应该有说帮助.
💻 LST
📖 第 1 页 / 共 3 页
字号:
   1               		.file	"dataqueue.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:
  93               	.global	QueueInit
  95               	QueueInit:
   1:dataqueue.c   **** /*
   2:dataqueue.c   **** ****************************************************************************
   3:dataqueue.c   **** *              宁波中科集成电路设计中心  版权所有 Copyright 2005
   4:dataqueue.c   **** *						http:\\www.nbicc.com
   5:dataqueue.c   **** *文件名:  dataqueue.c
   6:dataqueue.c   **** *程序员:  蒋文丰
   7:dataqueue.c   **** *主要内容:数据包缓存的队列管理
   8:dataqueue.c   **** *
   9:dataqueue.c   **** *如有问题或BUG,请登录www.wsn.net.cn 提问或用邮件和作者联系
  10:dataqueue.c   **** ****************************************************************************
  11:dataqueue.c   **** */
  12:dataqueue.c   **** /////
  13:dataqueue.c   **** #include "led.h"
  14:dataqueue.c   **** #include "type.h"
  15:dataqueue.c   **** #include "message.h"
  16:dataqueue.c   **** #include "mac.h"
  17:dataqueue.c   **** #include "dataqueue.h"
  18:dataqueue.c   **** #include "os.h"
  19:dataqueue.c   **** #include "route.h"
  20:dataqueue.c   **** #include "app.h"
  21:dataqueue.c   **** #include "global.h"
  22:dataqueue.c   **** static void routeSendTask(void);
  23:dataqueue.c   **** static void routeSendBroadcast(void);
  24:dataqueue.c   **** static void routeSendLocalMsg(void);
  25:dataqueue.c   **** static uint8_t enqueue_next; //队列尾指针
  26:dataqueue.c   **** static uint8_t dequeue_next; //队列头指针
  27:dataqueue.c   **** static bool QueueIdle; //队列的互斥变量
  28:dataqueue.c   **** static uint8_t FreeAreaInQueue;//队列中的可用的空间数目
  29:dataqueue.c   **** 
  30:dataqueue.c   **** extern uint8_t currentparent;
  31:dataqueue.c   **** static uint8_t TimeMask;
  32:dataqueue.c   **** static uint8_t nextAddr;
  33:dataqueue.c   **** static uint8_t QueueBroadcastState;
  34:dataqueue.c   **** static uint8_t QueueLocalMsgState;
  35:dataqueue.c   **** enum {IDLE,WRITE,USEFULL};
  36:dataqueue.c   **** void QueueInit(void){  //mac层的调用在mac.c中被调用
  97               	.LM1:
  98               	/* prologue: frame size=0 */
  99               	/* prologue end (size=0) */
  37:dataqueue.c   ****    TimeMask = 0;
 101               	.LM2:
 102 0000 1092 0000 		sts TimeMask,__zero_reg__
  38:dataqueue.c   ****    enqueue_next = 0; 
 104               	.LM3:
 105 0004 1092 0000 		sts enqueue_next,__zero_reg__
 106 0008 80E0      		ldi r24,lo8(0)
 107 000a E0E0      		ldi r30,lo8(Queuemsgqueue)
 108 000c F0E0      		ldi r31,hi8(Queuemsgqueue)
 109               	.L5:
  39:dataqueue.c   ****    for( ;enqueue_next < MESSAGE_QUEUE_SIZE ; enqueue_next ++ )
  40:dataqueue.c   ****    Queuemsgqueue[enqueue_next].length = 0 ;
 111               	.LM4:
 112 000e 1082      		st Z,__zero_reg__
 113 0010 FE96      		adiw r30,62
 115               	.LM5:
 116 0012 8F5F      		subi r24,lo8(-(1))
 117 0014 8630      		cpi r24,lo8(6)
 118 0016 D8F3      		brlo .L5
  41:dataqueue.c   ****    enqueue_next = 0; 
 120               	.LM6:
 121 0018 1092 0000 		sts enqueue_next,__zero_reg__
  42:dataqueue.c   ****    dequeue_next = 0;
 123               	.LM7:
 124 001c 1092 0000 		sts dequeue_next,__zero_reg__
  43:dataqueue.c   ****    FreeAreaInQueue = MESSAGE_QUEUE_SIZE;
 126               	.LM8:
 127 0020 86E0      		ldi r24,lo8(6)
 128 0022 8093 0000 		sts FreeAreaInQueue,r24
  44:dataqueue.c   ****    QueueIdle    = TRUE;
 130               	.LM9:
 131 0026 81E0      		ldi r24,lo8(1)
 132 0028 8093 0000 		sts QueueIdle,r24
  45:dataqueue.c   ****    QueueBroadcastState = IDLE;
 134               	.LM10:
 135 002c 1092 0000 		sts QueueBroadcastState,__zero_reg__
  46:dataqueue.c   ****    QueueLocalMsgState  = IDLE;
 137               	.LM11:
 138 0030 1092 0000 		sts QueueLocalMsgState,__zero_reg__
 139               	/* epilogue: frame size=0 */
 140 0034 0895      		ret
 141               	/* epilogue end (size=1) */
 142               	/* function QueueInit size 27 (26) */
 148               	.global	InQueue
 150               	InQueue:
  47:dataqueue.c   **** }
  48:dataqueue.c   **** /**************************************************************************
  49:dataqueue.c   **** *功能描述:数据入缓冲队列
  50:dataqueue.c   **** *参数说明:type 表示单播或广播,type由message.h中的enum定义,BROADCAST代表广播方式,SENSOR 代表单播
  51:dataqueue.c   **** enum PACKETTYPE {
  52:dataqueue.c   ****     BROADCAST = 4,
  53:dataqueue.c   ****     SENSOR = 3
  54:dataqueue.c   **** };
  55:dataqueue.c   ****            adress 表示下一调的地址还是广播地址,由type决定
  56:dataqueue.c   **** 		   length 数据包的长度
  57:dataqueue.c   **** 		   msg    数据包地址
  58:dataqueue.c   ****                  
  59:dataqueue.c   **** *返回值:
  60:dataqueue.c   **** **************************************************************************/
  61:dataqueue.c   **** result_t InQueue(uint8_t type, uint8_t length, OSMACMsgPtr msg) {
 152               	.LM12:
 153               	/* prologue: frame size=0 */
 154 0036 0F93      		push r16
 155 0038 1F93      		push r17
 156 003a CF93      		push r28
 157 003c DF93      		push r29
 158               	/* prologue end (size=4) */
 159 003e 082F      		mov r16,r24
 160 0040 162F      		mov r17,r22
 161 0042 EA01      		movw r28,r20
  62:dataqueue.c   ****     
  63:dataqueue.c   **** 	if ((enqueue_next + 1) % MESSAGE_QUEUE_SIZE == dequeue_next) {
 163               	.LM13:
 164 0044 8091 0000 		lds r24,enqueue_next
 165 0048 E82F      		mov r30,r24
 166 004a FF27      		clr r31
 167 004c CF01      		movw r24,r30
 168 004e 0196      		adiw r24,1
 169 0050 66E0      		ldi r22,lo8(6)
 170 0052 70E0      		ldi r23,hi8(6)
 171 0054 0E94 0000 		call __divmodhi4
 172 0058 2091 0000 		lds r18,dequeue_next
 173 005c 3327      		clr r19
 174 005e 8217      		cp r24,r18
 175 0060 9307      		cpc r25,r19
 176 0062 39F4      		brne .L10
  64:dataqueue.c   ****             OSPostTask(routeSendTask); //队列满,调用任务,加快传输
 178               	.LM14:
 179 0064 80E0      		ldi r24,lo8(pm(routeSendTask))
 180 0066 90E0      		ldi r25,hi8(pm(routeSendTask))
 181 0068 0E94 0000 		call OSPostTask
  65:dataqueue.c   **** 		    return FAIL;
 183               	.LM15:
 184 006c 80E0      		ldi r24,lo8(0)
 185 006e 90E0      		ldi r25,hi8(0)
 186 0070 2EC0      		rjmp .L9
 187               	.L10:
  66:dataqueue.c   **** 	}
  67:dataqueue.c   **** 	if(QueueIdle == TRUE) {
 189               	.LM16:
 190 0072 3091 0000 		lds r19,QueueIdle
 191 0076 3130      		cpi r19,lo8(1)
 192 0078 41F5      		brne .L11
  68:dataqueue.c   **** 	QueueIdle = FALSE;
 194               	.LM17:
 195 007a 1092 0000 		sts QueueIdle,__zero_reg__
  69:dataqueue.c   **** 	//设置队列内容
  70:dataqueue.c   **** 	Queuemsgqueue[enqueue_next].length = length;
 197               	.LM18:
 198 007e 8EE3      		ldi r24,lo8(62)
 199 0080 90E0      		ldi r25,hi8(62)
 200 0082 E89F      		mul r30,r24
 201 0084 A001      		movw r20,r0
 202 0086 E99F      		mul r30,r25
 203 0088 500D      		add r21,r0
 204 008a F89F      		mul r31,r24
 205 008c 500D      		add r21,r0
 206 008e 1124      		clr r1
 207 0090 FA01      		movw r30,r20
 208 0092 E050      		subi r30,lo8(-(Queuemsgqueue))
 209 0094 F040      		sbci r31,hi8(-(Queuemsgqueue))
 210 0096 1083      		st Z,r17
  71:dataqueue.c   **** 	Queuemsgqueue[enqueue_next].type = type;
 212               	.LM19:
 213 0098 0183      		std Z+1,r16
  72:dataqueue.c   **** 	Queuemsgqueue[enqueue_next].Msg = *msg;
 215               	.LM20:
 216 009a 2CE3      		ldi r18,lo8(60)
 217 009c FA01      		movw r30,r20
 218 009e E050      		subi r30,lo8(-(Queuemsgqueue+2))
 219 00a0 F040      		sbci r31,hi8(-(Queuemsgqueue+2))
 220 00a2 DE01      		movw r26,r28
 221 00a4 0D90      		ld __tmp_reg__,X+
 222 00a6 0192      		st Z+,__tmp_reg__
 223 00a8 2A95      		dec r18
 224 00aa E1F7      		brne .-8
  73:dataqueue.c   **** 	enqueue_next++;  //进入队列数目加1
 226               	.LM21:
 227 00ac 8091 0000 		lds r24,enqueue_next
  74:dataqueue.c   ****     enqueue_next %= MESSAGE_QUEUE_SIZE;
 229               	.LM22:
 230 00b0 8F5F      		subi r24,lo8(-(1))
 231 00b2 66E0      		ldi r22,lo8(6)
 232 00b4 0E94 0000 		call __udivmodqi4
 233 00b8 9093 0000 		sts enqueue_next,r25
  75:dataqueue.c   **** 	FreeAreaInQueue = FreeAreaInQueue - 1;
 235               	.LM23:
 236 00bc 8091 0000 		lds r24,FreeAreaInQueue
 237 00c0 8150      		subi r24,lo8(-(-1))
 238 00c2 8093 0000 		sts FreeAreaInQueue,r24
  76:dataqueue.c   **** 	QueueIdle = TRUE;
 240               	.LM24:
 241 00c6 3093 0000 		sts QueueIdle,r19
 242               	.L11:
  77:dataqueue.c   ****     }
  78:dataqueue.c   **** 	return SUCCESS;
 244               	.LM25:
 245 00ca 81E0      		ldi r24,lo8(1)
 246 00cc 90E0      		ldi r25,hi8(1)
 247               	.L9:
 248               	/* epilogue: frame size=0 */
 249 00ce DF91      		pop r29
 250 00d0 CF91      		pop r28
 251 00d2 1F91      		pop r17
 252 00d4 0F91      		pop r16
 253 00d6 0895      		ret
 254               	/* epilogue end (size=5) */
 255               	/* function InQueue size 81 (72) */
 261               	.global	InBroadQueue
 263               	InBroadQueue:
  79:dataqueue.c   **** }
  80:dataqueue.c   **** 
  81:dataqueue.c   **** /**************************************************************************
  82:dataqueue.c   **** *功能描述:广播包入缓冲区
  83:dataqueue.c   **** *参数说明:type 表示单播或广播,type由message.h中的enum定义,BROADCAST代表广播方式,SENSOR 代表单播
  84:dataqueue.c   **** enum PACKETTYPE {
  85:dataqueue.c   ****     BROADCAST = 4,
  86:dataqueue.c   ****     SENSOR = 3
  87:dataqueue.c   **** };
  88:dataqueue.c   ****            adress 表示下一调的地址还是广播地址,由type决定
  89:dataqueue.c   **** 		   length 数据包的长度
  90:dataqueue.c   **** 		   msg    数据包地址
  91:dataqueue.c   ****                  
  92:dataqueue.c   **** *返回值:
  93:dataqueue.c   **** **************************************************************************/
  94:dataqueue.c   **** result_t InBroadQueue(uint8_t type, uint8_t length, OSMACMsgPtr msg) {
 265               	.LM26:
 266               	/* prologue: frame size=0 */
 267               	/* prologue end (size=0) */
 268 00d8 982F      		mov r25,r24
  95:dataqueue.c   ****     if(QueueBroadcastState == IDLE){
 270               	.LM27:
 271 00da 8091 0000 		lds r24,QueueBroadcastState
 272 00de 8823      		tst r24
 273 00e0 A9F4      		brne .L13
  96:dataqueue.c   **** 	QueueBroadcastState = WRITE;
 275               	.LM28:
 276 00e2 81E0      		ldi r24,lo8(1)
 277 00e4 8093 0000 		sts QueueBroadcastState,r24
  97:dataqueue.c   **** 	QueueBroadcast.length = length;
 279               	.LM29:
 280 00e8 6093 0000 		sts QueueBroadcast,r22
  98:dataqueue.c   **** 	QueueBroadcast.type = type;
 282               	.LM30:
 283 00ec 9093 0000 		sts QueueBroadcast+1,r25
  99:dataqueue.c   **** 	QueueBroadcast.Msg = *msg;
 285               	.LM31:
 286 00f0 8CE3      		ldi r24,lo8(60)
 287 00f2 A0E0      		ldi r26,lo8(QueueBroadcast+2)
 288 00f4 B0E0      		ldi r27,hi8(QueueBroadcast+2)
 289 00f6 FA01      		movw r30,r20
 290 00f8 0190      		ld __tmp_reg__,Z+
 291 00fa 0D92      		st X+,__tmp_reg__
 292 00fc 8A95      		dec r24
 293 00fe E1F7      		brne .-8
 100:dataqueue.c   **** 	QueueBroadcastState = USEFULL;
 295               	.LM32:
 296 0100 82E0      		ldi r24,lo8(2)
 297 0102 8093 0000 		sts QueueBroadcastState,r24
 101:dataqueue.c   **** 	return 1;
 299               	.LM33:
 300 0106 81E0      		ldi r24,lo8(1)
 301 0108 90E0      		ldi r25,hi8(1)
 302 010a 0895      		ret
 303               	.L13:
 102:dataqueue.c   **** 	}else{
 103:dataqueue.c   **** 	return 0;
 305               	.LM34:
 306 010c 80E0      		ldi r24,lo8(0)
 307 010e 90E0      		ldi r25,hi8(0)
 104:dataqueue.c   **** 	}
 105:dataqueue.c   **** }
 309               	.LM35:
 310 0110 0895      		ret
 311               	/* epilogue: frame size=0 */
 312 0112 0895      		ret
 313               	/* epilogue end (size=1) */
 314               	/* function InBroadQueue size 30 (29) */
 320               	.global	InLocalMsgQueue
 322               	InLocalMsgQueue:
 106:dataqueue.c   **** 
 107:dataqueue.c   **** /**************************************************************************
 108:dataqueue.c   **** *功能描述:本地数据包入缓冲区
 109:dataqueue.c   **** *参数说明:type 表示单播或广播,type由message.h中的enum定义,BROADCAST代表广播方式,SENSOR 代表单播
 110:dataqueue.c   **** enum PACKETTYPE {
 111:dataqueue.c   ****     BROADCAST = 4,
 112:dataqueue.c   ****     SENSOR = 3
 113:dataqueue.c   **** };
 114:dataqueue.c   ****            adress 表示下一调的地址还是广播地址,由type决定
 115:dataqueue.c   **** 		   length 数据包的长度
 116:dataqueue.c   **** 		   msg    数据包地址
 117:dataqueue.c   ****                  
 118:dataqueue.c   **** *返回值:
 119:dataqueue.c   **** **************************************************************************/
 120:dataqueue.c   **** result_t InLocalMsgQueue(uint8_t type, uint8_t length, OSMACMsgPtr msg){
 324               	.LM36:
 325               	/* prologue: frame size=0 */
 326               	/* prologue end (size=0) */

⌨️ 快捷键说明

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