📄 rd_useserialframe_proc.lis
字号:
01E2 .dbfunc s SFP_Check_Frames _SFP_Check_Frames fV
01E2 ; pMsgItem -> R22,R23
01E2 ; pQueue -> R10,R11
01E2 ; n -> y+0
01E2 ; pSFP -> R20,R21
.even
01E2 _SFP_Check_Frames:
01E2 0E940000 xcall push_xgsetF03C
01E6 A801 movw R20,R16
01E8 2197 sbiw R28,1
01EA .dbline -1
01EA .dbline 266
01EA ; }
01EA ;
01EA ; }
01EA ;
01EA ; /***********************************************************
01EA ; * 函数说明:数据帧提取检测函数 *
01EA ; * 输入: 串行数据帧检测结构指针 *
01EA ; * 输出: 无 *
01EA ; * 调用函数:无 *
01EA ; ***********************************************************/
01EA ; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP)
01EA ; {
01EA .dbline 267
01EA ; uint8 n = 0;
01EA 2224 clr R2
01EC 2882 std y+0,R2
01EE .dbline 268
01EE ; MSG_ITEM *pMsgItem = &(pSFP->MsgItem);
01EE BA01 movw R22,R20
01F0 6C5E subi R22,236 ; offset = 20
01F2 7F4F sbci R23,255
01F4 .dbline 269
01F4 ; ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
01F4 5A01 movw R10,R20
01F6 .dbline 272
01F6 ;
01F6 ; //将头部去除
01F6 ; ADT_GET_DATA_FROM_QUEUE((*pQueue),n);
01F6 9E01 movw R18,R28
01F8 8501 movw R16,R10
01FA C501 movw R24,R10
01FC 0C96 adiw R24,12
01FE FC01 movw R30,R24
0200 A081 ldd R26,z+0
0202 B181 ldd R27,z+1
0204 FD01 movw R30,R26
0206 0E940000 xcall xicallx
020A .dbline 275
020A ;
020A ; //获取消息长度
020A ; if (!(pSFP->cFixLength))
020A FA01 movw R30,R20
020C 228C ldd R2,z+26
020E 2220 tst R2
0210 89F4 brne L32
0212 X18:
0212 .dbline 276
0212 ; {
0212 .dbline 277
0212 ; ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cDataLength));
0212 9B01 movw R18,R22
0214 2F5F subi R18,255 ; offset = 1
0216 3F4F sbci R19,255
0218 8F01 movw R16,R30
021A A485 ldd R26,z+12
021C B585 ldd R27,z+13
021E FD01 movw R30,R26
0220 0E940000 xcall xicallx
0224 .dbline 279
0224 ;
0224 ; pMsgItem->cDataLength -= 5;
0224 CB01 movw R24,R22
0226 0196 adiw R24,1
0228 6C01 movw R12,R24
022A FC01 movw R30,R24
022C 8081 ldd R24,z+0
022E 8550 subi R24,5
0230 8083 std z+0,R24
0232 .dbline 280
0232 ; }
0232 05C0 xjmp L33
0234 L32:
0234 .dbline 282
0234 ; else
0234 ; {
0234 .dbline 283
0234 ; pMsgItem->cDataLength = pSFP->cFixLength - 4;
0234 FA01 movw R30,R20
0236 828D ldd R24,z+26
0238 8450 subi R24,4
023A FB01 movw R30,R22
023C 8183 std z+1,R24
023E .dbline 284
023E ; }
023E L33:
023E .dbline 287
023E ;
023E ; //获取指令字
023E ; ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cCMD));
023E 9B01 movw R18,R22
0240 8501 movw R16,R10
0242 C501 movw R24,R10
0244 0C96 adiw R24,12
0246 6C01 movw R12,R24
0248 FC01 movw R30,R24
024A A081 ldd R26,z+0
024C B181 ldd R27,z+1
024E FD01 movw R30,R26
0250 0E940000 xcall xicallx
0254 .dbline 289
0254 ;
0254 ; for (n = 0;n < (pMsgItem->cDataLength);n++)
0254 2224 clr R2
0256 2882 std y+0,R2
0258 14C0 xjmp L37
025A L34:
025A .dbline 290
025A ; {
025A .dbline 292
025A ; //依次获取所有数据
025A ; ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->pData[n]));
025A FB01 movw R30,R22
025C 2280 ldd R2,z+2
025E 3380 ldd R3,z+3
0260 2881 ldd R18,y+0
0262 3327 clr R19
0264 220D add R18,R2
0266 331D adc R19,R3
0268 8501 movw R16,R10
026A C501 movw R24,R10
026C 0C96 adiw R24,12
026E 6C01 movw R12,R24
0270 FC01 movw R30,R24
0272 A081 ldd R26,z+0
0274 B181 ldd R27,z+1
0276 FD01 movw R30,R26
0278 0E940000 xcall xicallx
027C .dbline 293
027C ; }
027C L35:
027C .dbline 289
027C 8881 ldd R24,y+0
027E 8F5F subi R24,255 ; addi 1
0280 8883 std y+0,R24
0282 L37:
0282 .dbline 289
0282 FB01 movw R30,R22
0284 2180 ldd R2,z+1
0286 3880 ldd R3,y+0
0288 3214 cp R3,R2
028A 38F3 brlo L34
028C X19:
028C .dbline 295
028C ;
028C ; if (!MsgMapProcess(pSFP->pMsgMap,pMsgItem))
028C 9F01 movw R18,R30
028E FA01 movw R30,R20
0290 0289 ldd R16,z+18
0292 1389 ldd R17,z+19
0294 0E940000 xcall _MsgMapProcess
0298 A02E mov R10,R16
029A 0023 tst R16
029C 01F4 brne L38
029E X20:
029E .dbline 296
029E ; {
029E .dbline 299
029E ; //信息未被正确处理
029E ; //有待添加代码
029E ; }
029E L38:
029E .dbline -2
029E L31:
029E .dbline 0 ; func end
029E 2196 adiw R28,1
02A0 0C940000 xjmp pop_xgsetF03C
02A4 .dbsym r pMsgItem 22 pS[MsgItem]
02A4 .dbsym r pQueue 10 pS[AbstructDataTypeQueue]
02A4 .dbsym l n 0 c
02A4 .dbsym r pSFP 20 pS[SerialFrameProcess]
02A4 .dbend
02A4 .dbfunc e SPF_Send_MSG _SPF_Send_MSG fc
02A4 ; Reg2 -> R20,R21
02A4 ; Reg8 -> R22,R23
02A4 ; n1 -> R12
02A4 ; cXORCheck0 -> R10
02A4 ; Length -> R14
02A4 ; pMSG -> y+14
02A4 ; cCMD -> R12
02A4 ; pSFP -> y+10
.even
02A4 _SPF_Send_MSG::
02A4 0E940000 xcall push_arg4
02A8 0E940000 xcall push_xgsetF0FC
02AC C22E mov R12,R18
02AE E888 ldd R14,y+16
02B0 .dbline -1
02B0 .dbline 310
02B0 ; }
02B0 ;
02B0 ; /***********************************************************
02B0 ; * 函数说明:消息发送函数 *
02B0 ; * 输入: 串行数据帧检测结构指针,指令,消息,消息长度 *
02B0 ; * 输出: TRUE *
02B0 ; * 调用函数:无 *
02B0 ; ***********************************************************/
02B0 ; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
02B0 ; uint8 cCMD,uint8 *pMSG,uint8 Length)
02B0 ; {
02B0 .dbline 311
02B0 ; uint8 n = 0;
02B0 .dbline 312
02B0 ; uint8 cXORCheck = 0;
02B0 AA24 clr R10
02B2 .dbline 314
02B2 ;
02B2 ; (*(pSFP->OutputDataFunc))(pSFP->cHeadByte); //发送消息头部
02B2 EA85 ldd R30,y+10
02B4 FB85 ldd R31,y+11
02B6 008D ldd R16,z+24
02B8 AF01 movw R20,R30
02BA 425E subi R20,226 ; offset = 30
02BC 5F4F sbci R21,255
02BE FA01 movw R30,R20
02C0 A081 ldd R26,z+0
02C2 B181 ldd R27,z+1
02C4 FD01 movw R30,R26
02C6 0E940000 xcall xicallx
02CA .dbline 316
02CA ;
02CA ; if (!(pSFP->cFixLength))
02CA EA85 ldd R30,y+10
02CC FB85 ldd R31,y+11
02CE 228C ldd R2,z+26
02D0 2220 tst R2
02D2 59F4 brne L41
02D4 X21:
02D4 .dbline 317
02D4 ; {
02D4 .dbline 318
02D4 ; (*(pSFP->OutputDataFunc))((Length+5)); //发送消息长度
02D4 0E2D mov R16,R14
02D6 0B5F subi R16,251 ; addi 5
02D8 FA01 movw R30,R20
02DA A081 ldd R26,z+0
02DC B181 ldd R27,z+1
02DE FD01 movw R30,R26
02E0 0E940000 xcall xicallx
02E4 .dbline 319
02E4 ; cXORCheck ^= (Length + 5);
02E4 8E2D mov R24,R14
02E6 8B5F subi R24,251 ; addi 5
02E8 A826 eor R10,R24
02EA .dbline 320
02EA ; }
02EA L41:
02EA .dbline 322
02EA ;
02EA ; (*(pSFP->OutputDataFunc))(cCMD); //发送指令字节
02EA 0C2D mov R16,R12
02EC FA01 movw R30,R20
02EE A081 ldd R26,z+0
02F0 B181 ldd R27,z+1
02F2 FD01 movw R30,R26
02F4 0E940000 xcall xicallx
02F8 .dbline 323
02F8 ; cXORCheck ^= cCMD;
02F8 AC24 eor R10,R12
02FA .dbline 325
02FA ;
02FA ; for (n = 0;n < Length;n++)
02FA CC24 clr R12
02FC 12C0 xjmp L46
02FE L43:
02FE .dbline 326
02FE ; {
02FE .dbline 327
02FE ; (*(pSFP->OutputDataFunc))(pMSG[n]); //发送消息本体
02FE 6C2D mov R22,R12
0300 7727 clr R23
0302 0E84 ldd R0,y+14
0304 1F84 ldd R1,y+15
0306 600D add R22,R0
0308 711D adc R23,R1
030A FB01 movw R30,R22
030C 0081 ldd R16,z+0
030E FA01 movw R30,R20
0310 A081 ldd R26,z+0
0312 B181 ldd R27,z+1
0314 FD01 movw R30,R26
0316 0E940000 xcall xicallx
031A .dbline 328
031A ; cXORCheck ^= pMSG[n];
031A FB01 movw R30,R22
031C 2080 ldd R2,z+0
031E A224 eor R10,R2
0320 .dbline 329
0320 ; }
0320 L44:
0320 .dbline 325
0320 C394 inc R12
0322 L46:
0322 .dbline 325
0322 CE14 cp R12,R14
0324 60F3 brlo L43
0326 X22:
0326 .dbline 331
0326 ;
0326 ; (*(pSFP->OutputDataFunc))(cXORCheck); //发送校验字节
0326 0A2D mov R16,R10
0328 FA01 movw R30,R20
032A A081 ldd R26,z+0
032C B181 ldd R27,z+1
032E FD01 movw R30,R26
0330 0E940000 xcall xicallx
0334 .dbline 332
0334 ; (*(pSFP->OutputDataFunc))(pSFP->cEndByte); //发送消息头部
0334 EA85 ldd R30,y+10
0336 FB85 ldd R31,y+11
0338 018D ldd R16,z+25
033A FA01 movw R30,R20
033C A081 ldd R26,z+0
033E B181 ldd R27,z+1
0340 FD01 movw R30,R26
0342 0E940000 xcall xicallx
0346 .dbline 334
0346 ;
0346 ; return TRUE;
0346 01E0 ldi R16,1
0348 .dbline -2
0348 L40:
0348 .dbline 0 ; func end
0348 0E940000 xcall pop_xgsetF0FC
034C 2496 adiw R28,4
034E 0895 ret
0350 .dbsym r Reg2 20 pV
0350 .dbsym r Reg8 22 pV
0350 .dbsym r n1 12 c
0350 .dbsym r cXORCheck0 10 c
0350 .dbsym r Length 14 c
0350 .dbsym l pMSG 14 pc
0350 .dbsym r cCMD 12 c
0350 .dbsym l pSFP 10 pS[SerialFrameProcess]
0350 .dbend
0350 ; }
0350 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -