📄 comm.lst
字号:
353 0144 F894 cli
354 /* #NOAPP */
355 0146 8091 0000 lds r24,Os_Enter_Sum
356 014a 8F5F subi r24,lo8(-(1))
357 014c 8093 0000 sts Os_Enter_Sum,r24
99:task/Comm.c **** if (OSQQuery(&UartTxEvent) == OS_Q_NO_EMPTY) //OSQQuery;异常处理
359 .LM18:
360 0150 80E0 ldi r24,lo8(UartTxEvent)
361 0152 90E0 ldi r25,hi8(UartTxEvent)
362 0154 00D0 rcall OSQQuery
363 0156 8330 cpi r24,lo8(3)
364 0158 11F4 brne .L9
100:task/Comm.c **** {
101:task/Comm.c **** UCSRB |= (1 << UDRIE); //UDRIE:数据寄存器空中断使能
366 .LM19:
367 015a 559A sbi 42-0x20,5
368 015c 03C0 rjmp .L10
369 .L9:
102:task/Comm.c **** }
103:task/Comm.c **** else
104:task/Comm.c **** {
105:task/Comm.c **** fTx_done = 1;
371 .LM20:
372 015e 81E0 ldi r24,lo8(1)
373 0160 8093 0000 sts fTx_done,r24
374 .L10:
106:task/Comm.c **** }
107:task/Comm.c **** OS_OPEN_INT();
376 .LM21:
377 0164 8091 0000 lds r24,Os_Enter_Sum
378 0168 8150 subi r24,lo8(-(-1))
379 016a 8093 0000 sts Os_Enter_Sum,r24
380 016e 8091 0000 lds r24,Os_Enter_Sum
381 0172 8823 tst r24
382 0174 09F4 brne .L8
383 /* #APP */
384 0176 7894 sei
385 /* #NOAPP */
386 .L8:
387 /* epilogue: frame size=0 */
388 0178 FF91 pop r31
389 017a EF91 pop r30
390 017c BF91 pop r27
391 017e AF91 pop r26
392 0180 9F91 pop r25
393 0182 8F91 pop r24
394 0184 7F91 pop r23
395 0186 6F91 pop r22
396 0188 5F91 pop r21
397 018a 4F91 pop r20
398 018c 3F91 pop r19
399 018e 2F91 pop r18
400 0190 0F90 pop __tmp_reg__
401 0192 0FBE out __SREG__,__tmp_reg__
402 0194 0F90 pop __tmp_reg__
403 0196 1F90 pop __zero_reg__
404 0198 1895 reti
405 /* epilogue end (size=17) */
406 /* function __vector_13 size 62 (28) */
408 .Lscope2:
411 .global sendbuf
413 sendbuf:
108:task/Comm.c **** }
109:task/Comm.c **** //----------------------------------------
110:task/Comm.c **** /************************************************
111:task/Comm.c **** 函 数 名:sendbuf
112:task/Comm.c **** 功能说明:将要发送的数据传输到发送缓存中
113:task/Comm.c **** *************************************************/
114:task/Comm.c **** void sendbuf(uchar temp)
115:task/Comm.c **** {
415 .LM22:
416 /* prologue: frame size=0 */
417 /* prologue end (size=0) */
116:task/Comm.c **** if ((OSQPost(&UartTxEvent,temp) != OS_Q_FULL) && fTx_done)
419 .LM23:
420 019a 682F mov r22,r24
421 019c 80E0 ldi r24,lo8(UartTxEvent)
422 019e 90E0 ldi r25,hi8(UartTxEvent)
423 01a0 00D0 rcall OSQPost
424 01a2 8230 cpi r24,lo8(2)
425 01a4 39F0 breq .L12
427 .LM24:
428 01a6 8091 0000 lds r24,fTx_done
429 01aa 8823 tst r24
430 01ac 19F0 breq .L12
117:task/Comm.c **** {
118:task/Comm.c **** fTx_done = 0; //完成则重新开始
432 .LM25:
433 01ae 1092 0000 sts fTx_done,__zero_reg__
119:task/Comm.c **** UCSRB |= (1 << UDRIE); //UDRIE:数据寄存器空中断使能
435 .LM26:
436 01b2 559A sbi 42-0x20,5
437 .L12:
438 01b4 0895 ret
439 /* epilogue: frame size=0 */
440 /* epilogue: noreturn */
441 /* epilogue end (size=0) */
442 /* function sendbuf size 14 (14) */
444 .Lscope3:
448 .global CRC16fromByte
450 CRC16fromByte:
120:task/Comm.c **** }
121:task/Comm.c **** }
122:task/Comm.c ****
123:task/Comm.c **** //sendbuf:将要发送的数据传输到发送缓存中
124:task/Comm.c **** //设置发送数据的条件
125:task/Comm.c ****
126:task/Comm.c **** /************************************************
127:task/Comm.c **** 函 数 名:processmsg
128:task/Comm.c **** 功能说明:逐一处理接受缓冲区的字符
129:task/Comm.c **** *************************************************/
130:task/Comm.c **** void Process_Msg(void)
131:task/Comm.c **** {
132:task/Comm.c **** uchar i;
133:task/Comm.c **** uchar temp = 0;
134:task/Comm.c **** static uint CRC16;
135:task/Comm.c **** static uchar MsgNum = 0;
136:task/Comm.c ****
137:task/Comm.c **** static struct Msg_Type
138:task/Comm.c **** {
139:task/Comm.c **** uchar Addr; //地址
140:task/Comm.c **** uchar FunID; //命令码
141:task/Comm.c **** uchar Data_AddrH; //地址高位
142:task/Comm.c **** uchar Data_AddrL; //地址低位
143:task/Comm.c **** uchar DataLenH; //数据长度高位
144:task/Comm.c **** uchar DataLenL; //数据长度低位
145:task/Comm.c **** }MsgBuf;
146:task/Comm.c ****
147:task/Comm.c **** if (OSQAccept(&UartReEvent,&temp) == OS_Q_OK)
148:task/Comm.c **** {
149:task/Comm.c **** if (fRx_start)
150:task/Comm.c **** {
151:task/Comm.c **** fRx_start = 0;
152:task/Comm.c **** MsgNum = 0; //包头同步
153:task/Comm.c **** }
154:task/Comm.c ****
155:task/Comm.c **** switch (MsgNum)
156:task/Comm.c **** {
157:task/Comm.c **** case 0:
158:task/Comm.c **** if (temp == AddrVal) //通信地址 ,当地址与本身的地址相同时
159:task/Comm.c **** {
160:task/Comm.c **** MsgBuf.Addr = temp; //结构体
161:task/Comm.c **** CRC16 = CRC16fromByte(temp,0xffff);
162:task/Comm.c **** MsgNum++;
163:task/Comm.c **** }
164:task/Comm.c **** break;
165:task/Comm.c ****
166:task/Comm.c **** case 1:
167:task/Comm.c **** if (temp == 0x03 || temp == 0x04) //功能码,
168:task/Comm.c **** {
169:task/Comm.c **** MsgBuf.FunID = temp;
170:task/Comm.c **** CRC16 = CRC16fromByte(temp,CRC16);
171:task/Comm.c **** MsgNum++;
172:task/Comm.c **** }
173:task/Comm.c **** else
174:task/Comm.c **** {
175:task/Comm.c **** MsgNum = 0;
176:task/Comm.c **** }
177:task/Comm.c **** break;
178:task/Comm.c ****
179:task/Comm.c **** case 2:
180:task/Comm.c **** MsgBuf.Data_AddrH = temp; //数据地址高位
181:task/Comm.c **** CRC16 = CRC16fromByte(temp,CRC16);
182:task/Comm.c **** MsgNum++;
183:task/Comm.c **** break;
184:task/Comm.c ****
185:task/Comm.c **** case 3:
186:task/Comm.c **** MsgBuf.Data_AddrL = temp; //数据地址低位
187:task/Comm.c **** CRC16 = CRC16fromByte(temp,CRC16);
188:task/Comm.c **** MsgNum++;
189:task/Comm.c **** break;
190:task/Comm.c ****
191:task/Comm.c **** case 4:
192:task/Comm.c **** MsgBuf.DataLenH = temp; //数据长度高位
193:task/Comm.c **** CRC16 = CRC16fromByte(temp,CRC16);
194:task/Comm.c **** MsgNum++;
195:task/Comm.c **** break;
196:task/Comm.c ****
197:task/Comm.c **** case 5:
198:task/Comm.c **** MsgBuf.DataLenL = temp; //数据长度低位
199:task/Comm.c **** CRC16 = CRC16fromByte(temp,CRC16);
200:task/Comm.c **** MsgNum++;
201:task/Comm.c **** break;
202:task/Comm.c ****
203:task/Comm.c **** case 6:
204:task/Comm.c **** if (((uchar *)&CRC16)[LOW_BYTE] == temp) //CRC校验值低位
205:task/Comm.c **** {
206:task/Comm.c **** MsgNum++;
207:task/Comm.c **** }
208:task/Comm.c **** else
209:task/Comm.c **** {
210:task/Comm.c **** MsgNum = 0;
211:task/Comm.c **** }
212:task/Comm.c **** break;
213:task/Comm.c ****
214:task/Comm.c **** case 7:
215:task/Comm.c **** if (((uchar *)&CRC16)[HIGH_BYTE] == temp) //CRC校验值高位
216:task/Comm.c **** {
217:task/Comm.c **** sendbuf(MsgBuf.Addr); //通信地址
218:task/Comm.c **** CRC16 = CRC16fromByte(MsgBuf.Addr,0xffff);
219:task/Comm.c ****
220:task/Comm.c **** sendbuf(MsgBuf.FunID); //功能码
221:task/Comm.c **** CRC16 = CRC16fromByte(MsgBuf.FunID,CRC16);
222:task/Comm.c **** //数据长度
223:task/Comm.c **** MsgBuf.DataLenL <<= 1; //数据字节数,发过来的是字数 ,回的是字节数
224:task/Comm.c **** sendbuf(MsgBuf.DataLenL);
225:task/Comm.c **** CRC16 = CRC16fromByte(MsgBuf.DataLenL,CRC16);//CRC校验值
226:task/Comm.c ****
227:task/Comm.c **** for (i=0; i<MsgBuf.DataLenL; i++)
228:task/Comm.c **** {
229:task/Comm.c **** sendbuf(ValTab(MsgBuf.Data_AddrL));
230:task/Comm.c **** CRC16 = CRC16fromByte(ValTab(MsgBuf.Data_AddrL),CRC16);
231:task/Comm.c **** MsgBuf.Data_AddrL++;
232:task/Comm.c **** }
233:task/Comm.c **** sendbuf(((uchar *)&CRC16)[LOW_BYTE]); //发送CRC校验值
234:task/Comm.c **** sendbuf(((uchar *)&CRC16)[HIGH_BYTE]);
235:task/Comm.c **** }
236:task/Comm.c **** MsgNum = 0;
237:task/Comm.c **** break;
238:task/Comm.c ****
239:task/Comm.c **** default:
240:task/Comm.c **** MsgNum = 0;
241:task/Comm.c **** break;
242:task/Comm.c **** }
243:task/Comm.c **** }
244:task/Comm.c **** }
245:task/Comm.c ****
246:task/Comm.c **** //-------------------------------------------------
247:task/Comm.c **** /************************************************
248:task/Comm.c **** 函 数 名:UART_Init
249:task/Comm.c **** 功能说明:串行口初始化
250:task/Comm.c **** *************************************************/
251:task/Comm.c **** void UART_Init(void)
252:task/Comm.c **** {
253:task/Comm.c **** OS_Q *pq;
254:task/Comm.c ****
255:task/Comm.c **** Baud_Init(BaudAndData);
256:task/Comm.c **** UCSRA = 0;
257:task/Comm.c **** UCSRB |= (1 << RXCIE)|(1 << TXCIE)|(1 << RXEN)|(1 << TXEN); //允许发送和接收
258:task/Comm.c **** UCSRC |= (1 << URSEL)|(1 << UCSZ1)|(1 << UCSZ0); //8位数据位+1位停止位
259:task/Comm.c ****
260:task/Comm.c **** pq = OSQCreat(&UartReEvent,UartReBuf,UART_BUF_SIZE - 1);
261:task/Comm.c **** UartReEvent = *pq;
262:task/Comm.c **** pq = OSQCreat(&UartTxEvent,UartTxBuf,UART_BUF_SIZE - 1);
263:task/Comm.c **** UartTxEvent = *pq;
264:task/Comm.c ****
265:task/Comm.c **** fTx_done = 1;
266:task/Comm.c **** fRx_start = 0;
267:task/Comm.c **** }
268:task/Comm.c ****
269:task/Comm.c ****
270:task/Comm.c **** /*************************************************************************************
271:task/Comm.c **** **功 能 描 述:单个字节CRC16校验
272:task/Comm.c **** **输出:2个字节的CRC校验值
273:task/Comm.c **** *************************************************************************************/
274:task/Comm.c **** uint CRC16fromByte(uchar Byte, uint crc16)
275:task/Comm.c **** {
452 .LM27:
453 /* prologue: frame size=0 */
454 /* prologue end (size=0) */
276:task/Comm.c **** uchar j;
277:task/Comm.c **** uchar CY;
278:task/Comm.c ****
279:task/Comm.c **** crc16 ^= Byte;
456 .LM28:
457 01b6 9927 clr r25
458 01b8 6827 eor r22,r24
459 01ba 7927 eor r23,r25
280:task/Comm.c **** for(j=8; j>0; j--)
461 .LM29:
462 01bc 98E0 ldi r25,lo8(8)
463 01be 21E0 ldi r18,lo8(-24575)
464 01c0 30EA ldi r19,hi8(-24575)
465 .L19:
281:task/Comm.c **** {
282:task/Comm.c **** CY = crc16;
467 .LM30:
468 01c2 862F mov r24,r22
283:task/Comm.c **** CY &= (1 << 0);
284:task/Comm.c **** crc16 >>= 1;
285:task/Comm.c **** crc16 &= 0x7fff;
470 .LM31:
471 01c4 7695 lsr r23
472 01c6 6795 ror r22
286:task/Comm.c **** if(CY)
474 .LM32:
475 01c8 80FF sbrs r24,0
476 01ca 02C0 rjmp .L17
287:task/Comm.c **** {
288:task/Comm.c **** crc16 ^= 0xa001;
478 .LM33:
479 01cc 6227 eor r22,r18
480 01ce 7327 eor r23,r19
481 .L17:
483 .LM34:
484 01d0 9150 subi r25,lo8(-(-1))
485 01d2 B9F7 brne .L19
289:task/Comm.c **** }
290:task/Comm.c **** }
291:task/Comm.c ****
292:task/Comm.c **** return crc16;
293:task/Comm.c **** }
487 .LM35:
488 01d4 CB01 movw r24,r22
489 /* epilogue: frame size=0 */
490 01d6 0895 ret
491 /* epilogue end (size=1) */
492 /* function CRC16fromByte size 18 (17) */
498 .Lscope4:
501 .global ValTab
503 ValTab:
294:task/Comm.c **** /************************************************
295:task/Comm.c **** 函 数 名:initi_serial
296:task/Comm.c **** 功能说明:串行口初始化
297:task/Comm.c **** *************************************************/
298:task/Comm.c **** uchar ValTab(uint8 com_data_index)
299:task/Comm.c **** {
505 .LM36:
506 /* prologue: frame size=0 */
507 /* prologue end (size=0) */
300:task/Comm.c **** uint8 *pReadComData;
301:task/Comm.c **** //FUN_DATA_ADDR_FIRST 0x30
302:task/Comm.c **** if (com_data_index >= FUN_DATA_ADDR_FIRST) //VAL_ADDR_MAX 0x0b
509 .LM37:
510 01d8 8033 cpi r24,lo8(48)
511 01da 08F0 brlo .L23
303:task/Comm.c **** {
304:task/Comm.c **** com_data_index = com_data_index - FUN_DATA_ADDR_FIRST + VAL_ADDR_MAX + 1; //超出范围则读不
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -