📄 rd_useserialframe_proc.s
字号:
movw R24,R20
adiw R24,35
ldd R2,y+4
movw R30,R24
ldd R3,z+0
eor R3,R2
std z+0,R3
.dbline 223
; ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData); //将该信息添加到缓冲区
mov R18,R2
movw R16,R22
movw R24,R22
adiw R24,10
movw R10,R24
movw R30,R24
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 225
;
; }
L21:
.dbline 227
;
; if ((pQueue->nCount) == ((pSFP->cFrameSize) - 1))
movw R30,R20
ldd R24,z+36
subi R24,1
clr R25
movw R30,R22
ldd R2,z+8
ldd R3,z+9
cp R2,R24
cpc R3,R25
brne L23
X9:
.dbline 228
; {
.dbline 229
; if (pSFP->cXORCheck)
movw R30,R20
ldd R2,z+35
tst R2
brne X17
rjmp L4
X17:
X10:
.dbline 230
; {
.dbline 233
; //XOR校验错误
; //错误的数据帧长度
; ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
.dbline 233
clr R2
clr R3
movw R30,R22
std z+5,R3
std z+4,R2
.dbline 233
std z+7,R3
std z+6,R2
.dbline 233
std z+9,R3
std z+8,R2
.dbline 233
.dbline 235
;
; SFP_STOP_ALL_ACTION
std y+3,R2
.dbline 237
;
; pSFP->cActionFlag = cTempActionFlag;
movw R30,R20
std z+34,R2
.dbline 238
; cTempData = SFP_ERROR_XOR;
ldi R24,1
std y+4,R24
.dbline 239
; SPF_Send_MSG(pSFP,SFP_CMD_ERROR,&cTempData,1);
std y+2,R24
movw R24,R28
adiw R24,4
std y+1,R25
std y+0,R24
ldi R18,237
movw R16,R30
rcall _SPF_Send_MSG
.dbline 240
; return ;
rjmp L4
L23:
.dbline 247
; }
; else
; {
; //ReceiveData = cTempData;
; }
; }
; else if ((pQueue->nCount) == (pSFP->cFrameSize))
movw R30,R20
ldd R2,z+36
clr R3
movw R30,R22
ldd R4,z+8
ldd R5,z+9
cp R4,R2
cpc R5,R3
brne L4
X11:
.dbline 248
; {
.dbline 250
; //所有的数据都添加完成
; if (cTempData == pSFP->cEndByte)
movw R30,R20
ldd R2,z+25
ldd R3,y+4
cp R3,R2
brne L29
X12:
.dbline 251
; {
.dbline 253
; //获得了所有的数据,并且数据帧正确
; SFP_Check_Frames(pSFP); //进行数据帧检测
movw R16,R30
rcall _SFP_Check_Frames
.dbline 254
; }
L29:
.dbline 256
;
; ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
.dbline 256
clr R2
clr R3
movw R30,R22
std z+5,R3
std z+4,R2
.dbline 256
std z+7,R3
std z+6,R2
.dbline 256
std z+9,R3
std z+8,R2
.dbline 256
.dbline 258
;
; SFP_STOP_ALL_ACTION
std y+3,R2
.dbline 259
; pSFP->cActionFlag = cTempActionFlag;
movw R30,R20
std z+34,R2
.dbline 261
;
; return ;
.dbline 266
; }
;
;
;
; return ;
L19:
.dbline -2
L4:
.dbline 0 ; func end
adiw R28,5
rjmp pop_xgsetF00C
.dbsym l cTempData 4 c
.dbsym r pQueue 22 pS[AbstructDataTypeQueue]
.dbsym l cTempActionFlag 3 c
.dbsym r pSFP 20 pS[SerialFrameProcess]
.dbend
.dbfunc s SFP_Check_Frames _SFP_Check_Frames fV
; cTempData -> y+4
; pMsgItem -> R22,R23
; pQueue -> R10,R11
; n -> y+3
; pSFP -> R20,R21
.even
_SFP_Check_Frames:
rcall push_xgsetF03C
movw R20,R16
sbiw R28,5
.dbline -1
.dbline 278
; }
;
; }
;
; /***********************************************************
; * 函数说明:数据帧提取检测函数 *
; * 输入: 串行数据帧检测结构指针 *
; * 输出: 无 *
; * 调用函数:无 *
; ***********************************************************/
; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP)
; {
.dbline 279
; uint8 n = 0;
clr R2
std y+3,R2
.dbline 280
; uint8 cTempData = 0;
std y+4,R2
.dbline 281
; MSG_ITEM *pMsgItem = &(pSFP->MsgItem);
movw R22,R20
subi R22,236 ; offset = 20
sbci R23,255
.dbline 282
; ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
movw R10,R20
.dbline 285
;
; //将头部去除
; ADT_GET_DATA_FROM_QUEUE((*pQueue),n);
movw R18,R28
subi R18,253 ; offset = 3
sbci R19,255
movw R16,R10
movw R24,R10
adiw R24,12
movw R30,R24
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 288
;
; //获取消息长度
; if (!(pSFP->cFixLength))
movw R30,R20
ldd R2,z+26
tst R2
brne L32
X18:
.dbline 289
; {
.dbline 290
; ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cDataLength));
movw R18,R22
subi R18,255 ; offset = 1
sbci R19,255
movw R16,R30
ldd R26,z+12
ldd R27,z+13
movw R30,R26
rcall xicall
.dbline 292
;
; pMsgItem->cDataLength -= 5;
movw R24,R22
adiw R24,1
movw R12,R24
movw R30,R24
ldd R24,z+0
subi R24,5
std z+0,R24
.dbline 293
; }
rjmp L33
L32:
.dbline 295
; else
; {
.dbline 296
; pMsgItem->cDataLength = pSFP->cFixLength - 4;
movw R30,R20
ldd R24,z+26
subi R24,4
movw R30,R22
std z+1,R24
.dbline 297
; }
L33:
.dbline 300
;
; //获取指令字
; ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cCMD));
movw R18,R22
movw R16,R10
movw R24,R10
adiw R24,12
movw R12,R24
movw R30,R24
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 302
;
; for (n = 0;n < (pMsgItem->cDataLength);n++)
clr R2
std y+3,R2
rjmp L37
L34:
.dbline 303
; {
.dbline 305
; //依次获取所有数据
; ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->pData[n]));
movw R30,R22
ldd R2,z+2
ldd R3,z+3
ldd R18,y+3
clr R19
add R18,R2
adc R19,R3
movw R16,R10
movw R24,R10
adiw R24,12
movw R12,R24
movw R30,R24
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 306
; }
L35:
.dbline 302
ldd R24,y+3
subi R24,255 ; addi 1
std y+3,R24
L37:
.dbline 302
movw R30,R22
ldd R2,z+1
ldd R3,y+3
cp R3,R2
brlo L34
X19:
.dbline 308
;
; if (!MsgMapProcess(pSFP->pMsgMap,pMsgItem))
movw R18,R30
movw R30,R20
ldd R16,z+18
ldd R17,z+19
rcall _MsgMapProcess
mov R10,R16
tst R16
brne L38
X20:
.dbline 309
; {
.dbline 312
; //信息未被正确处理
; //有待添加代码
; cTempData = SFP_ERROR_CMD_ERROR;
clr R2
std y+4,R2
.dbline 313
; SPF_Send_MSG(pSFP,SFP_CMD_ERROR,&cTempData,1);
ldi R24,1
std y+2,R24
movw R24,R28
adiw R24,4
std y+1,R25
std y+0,R24
ldi R18,237
movw R16,R20
rcall _SPF_Send_MSG
.dbline 314
; }
L38:
.dbline -2
L31:
.dbline 0 ; func end
adiw R28,5
rjmp pop_xgsetF03C
.dbsym l cTempData 4 c
.dbsym r pMsgItem 22 pS[MsgItem]
.dbsym r pQueue 10 pS[AbstructDataTypeQueue]
.dbsym l n 3 c
.dbsym r pSFP 20 pS[SerialFrameProcess]
.dbend
.dbfunc e SPF_Send_MSG _SPF_Send_MSG fc
; Reg2 -> R20,R21
; Reg8 -> R22,R23
; n1 -> R12
; cXORCheck0 -> R10
; Length -> R14
; pMSG -> y+14
; cCMD -> R12
; pSFP -> y+10
.even
_SPF_Send_MSG::
rcall push_arg4
rcall push_xgsetF0FC
mov R12,R18
ldd R14,y+16
.dbline -1
.dbline 325
; }
;
; /***********************************************************
; * 函数说明:消息发送函数 *
; * 输入: 串行数据帧检测结构指针,指令,消息,消息长度 *
; * 输出: TRUE *
; * 调用函数:无 *
; ***********************************************************/
; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
; uint8 cCMD,uint8 *pMSG,uint8 Length)
; {
.dbline 326
; uint8 n = 0;
.dbline 327
; uint8 cXORCheck = 0;
clr R10
.dbline 329
;
; (*(pSFP->OutputDataFunc))(pSFP->cHeadByte); //发送消息头部
ldd R30,y+10
ldd R31,y+11
ldd R16,z+24
movw R20,R30
subi R20,226 ; offset = 30
sbci R21,255
movw R30,R20
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 331
;
; if (!(pSFP->cFixLength))
ldd R30,y+10
ldd R31,y+11
ldd R2,z+26
tst R2
brne L41
X21:
.dbline 332
; {
.dbline 333
; (*(pSFP->OutputDataFunc))((Length+5)); //发送消息长度
mov R16,R14
subi R16,251 ; addi 5
movw R30,R20
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 334
; cXORCheck ^= (Length + 5);
mov R24,R14
subi R24,251 ; addi 5
eor R10,R24
.dbline 335
; }
L41:
.dbline 337
;
; (*(pSFP->OutputDataFunc))(cCMD); //发送指令字节
mov R16,R12
movw R30,R20
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 338
; cXORCheck ^= cCMD;
eor R10,R12
.dbline 340
;
; for (n = 0;n < Length;n++)
clr R12
rjmp L46
L43:
.dbline 341
; {
.dbline 342
; (*(pSFP->OutputDataFunc))(pMSG[n]); //发送消息本体
mov R22,R12
clr R23
ldd R0,y+14
ldd R1,y+15
add R22,R0
adc R23,R1
movw R30,R22
ldd R16,z+0
movw R30,R20
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 343
; cXORCheck ^= pMSG[n];
movw R30,R22
ldd R2,z+0
eor R10,R2
.dbline 344
; }
L44:
.dbline 340
inc R12
L46:
.dbline 340
cp R12,R14
brlo L43
X22:
.dbline 346
;
; (*(pSFP->OutputDataFunc))(cXORCheck); //发送校验字节
mov R16,R10
movw R30,R20
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 347
; (*(pSFP->OutputDataFunc))(pSFP->cEndByte); //发送消息头部
ldd R30,y+10
ldd R31,y+11
ldd R16,z+25
movw R30,R20
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 349
;
; return TRUE;
ldi R16,1
.dbline -2
L40:
.dbline 0 ; func end
rcall pop_xgsetF0FC
adiw R28,4
ret
.dbsym r Reg2 20 pV
.dbsym r Reg8 22 pV
.dbsym r n1 12 c
.dbsym r cXORCheck0 10 c
.dbsym r Length 14 c
.dbsym l pMSG 14 pc
.dbsym r cCMD 12 c
.dbsym l pSFP 10 pS[SerialFrameProcess]
.dbend
; }
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -