📄 rd_useserialframe_proc.s
字号:
clr R3
movw R30,R22
ldd R4,z+8
ldd R5,z+9
cp R4,R2
cpc R5,R3
brsh L21
X8:
.dbline 210
; {
.dbline 211
; pSFP->cXORCheck ^= cTempData;
movw R24,R20
adiw R24,35
ldd R2,y+1
movw R30,R24
ldd R3,z+0
eor R3,R2
std z+0,R3
.dbline 212
; 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
xcall xicallx
.dbline 214
;
; }
L21:
.dbline 216
;
; if ((pQueue->nCount) == ((pSFP->cFrameSize) - 1))
movw R30,R20
ldd R24,z+36
subi R24,1
mov R2,R24
clr R3
movw R30,R22
ldd R4,z+8
ldd R5,z+9
cp R4,R2
cpc R5,R3
brne L23
X9:
.dbline 217
; {
.dbline 218
; if (pSFP->cXORCheck)
movw R30,R20
ldd R2,z+35
tst R2
brne X17
xjmp L4
X17:
X10:
.dbline 219
; {
.dbline 222
; //XOR校验错误
; //错误的数据帧长度
; ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
.dbline 222
clr R2
movw R30,R22
std z+5,R3
std z+4,R2
.dbline 222
std z+7,R3
std z+6,R2
.dbline 222
std z+9,R3
std z+8,R2
.dbline 222
.dbline 224
;
; SFP_STOP_ALL_ACTION
std y+0,R2
.dbline 226
;
; pSFP->cActionFlag = cTempActionFlag;
movw R30,R20
std z+34,R2
.dbline 228
;
; return ;
xjmp L4
L23:
.dbline 235
; }
; 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 236
; {
.dbline 238
; //所有的数据都添加完成
; if (cTempData == pSFP->cEndByte)
movw R30,R20
ldd R2,z+25
ldd R3,y+1
cp R3,R2
brne L29
X12:
.dbline 239
; {
.dbline 241
; //获得了所有的数据,并且数据帧正确
; SFP_Check_Frames(pSFP); //进行数据帧检测
movw R16,R30
xcall _SFP_Check_Frames
.dbline 242
; }
L29:
.dbline 244
;
; ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
.dbline 244
clr R2
clr R3
movw R30,R22
std z+5,R3
std z+4,R2
.dbline 244
std z+7,R3
std z+6,R2
.dbline 244
std z+9,R3
std z+8,R2
.dbline 244
.dbline 246
;
; SFP_STOP_ALL_ACTION
std y+0,R2
.dbline 247
; pSFP->cActionFlag = cTempActionFlag;
movw R30,R20
std z+34,R2
.dbline 249
;
; return ;
.dbline 254
; }
;
;
;
; return ;
L19:
.dbline -2
L4:
.dbline 0 ; func end
adiw R28,2
xjmp pop_xgsetF00C
.dbsym l cTempData 1 c
.dbsym r pQueue 22 pS[AbstructDataTypeQueue]
.dbsym l cTempActionFlag 0 c
.dbsym r pSFP 20 pS[SerialFrameProcess]
.dbend
.dbfunc s SFP_Check_Frames _SFP_Check_Frames fV
; pMsgItem -> R22,R23
; pQueue -> R10,R11
; n -> y+0
; pSFP -> R20,R21
.even
_SFP_Check_Frames:
xcall push_xgsetF03C
movw R20,R16
sbiw R28,1
.dbline -1
.dbline 266
; }
;
; }
;
; /***********************************************************
; * 函数说明:数据帧提取检测函数 *
; * 输入: 串行数据帧检测结构指针 *
; * 输出: 无 *
; * 调用函数:无 *
; ***********************************************************/
; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP)
; {
.dbline 267
; uint8 n = 0;
clr R2
std y+0,R2
.dbline 268
; MSG_ITEM *pMsgItem = &(pSFP->MsgItem);
movw R22,R20
subi R22,236 ; offset = 20
sbci R23,255
.dbline 269
; ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
movw R10,R20
.dbline 272
;
; //将头部去除
; ADT_GET_DATA_FROM_QUEUE((*pQueue),n);
movw R18,R28
movw R16,R10
movw R24,R10
adiw R24,12
movw R30,R24
ldd R26,z+0
ldd R27,z+1
movw R30,R26
xcall xicallx
.dbline 275
;
; //获取消息长度
; if (!(pSFP->cFixLength))
movw R30,R20
ldd R2,z+26
tst R2
brne L32
X18:
.dbline 276
; {
.dbline 277
; 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
xcall xicallx
.dbline 279
;
; 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 280
; }
xjmp L33
L32:
.dbline 282
; else
; {
.dbline 283
; pMsgItem->cDataLength = pSFP->cFixLength - 4;
movw R30,R20
ldd R24,z+26
subi R24,4
movw R30,R22
std z+1,R24
.dbline 284
; }
L33:
.dbline 287
;
; //获取指令字
; 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
xcall xicallx
.dbline 289
;
; for (n = 0;n < (pMsgItem->cDataLength);n++)
clr R2
std y+0,R2
xjmp L37
L34:
.dbline 290
; {
.dbline 292
; //依次获取所有数据
; ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->pData[n]));
movw R30,R22
ldd R2,z+2
ldd R3,z+3
ldd R18,y+0
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
xcall xicallx
.dbline 293
; }
L35:
.dbline 289
ldd R24,y+0
subi R24,255 ; addi 1
std y+0,R24
L37:
.dbline 289
movw R30,R22
ldd R2,z+1
ldd R3,y+0
cp R3,R2
brlo L34
X19:
.dbline 295
;
; if (!MsgMapProcess(pSFP->pMsgMap,pMsgItem))
movw R18,R30
movw R30,R20
ldd R16,z+18
ldd R17,z+19
xcall _MsgMapProcess
mov R10,R16
tst R16
brne L38
X20:
.dbline 296
; {
.dbline 299
; //信息未被正确处理
; //有待添加代码
; }
L38:
.dbline -2
L31:
.dbline 0 ; func end
adiw R28,1
xjmp pop_xgsetF03C
.dbsym r pMsgItem 22 pS[MsgItem]
.dbsym r pQueue 10 pS[AbstructDataTypeQueue]
.dbsym l n 0 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::
xcall push_arg4
xcall push_xgsetF0FC
mov R12,R18
ldd R14,y+16
.dbline -1
.dbline 310
; }
;
; /***********************************************************
; * 函数说明:消息发送函数 *
; * 输入: 串行数据帧检测结构指针,指令,消息,消息长度 *
; * 输出: TRUE *
; * 调用函数:无 *
; ***********************************************************/
; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
; uint8 cCMD,uint8 *pMSG,uint8 Length)
; {
.dbline 311
; uint8 n = 0;
.dbline 312
; uint8 cXORCheck = 0;
clr R10
.dbline 314
;
; (*(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
xcall xicallx
.dbline 316
;
; if (!(pSFP->cFixLength))
ldd R30,y+10
ldd R31,y+11
ldd R2,z+26
tst R2
brne L41
X21:
.dbline 317
; {
.dbline 318
; (*(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
xcall xicallx
.dbline 319
; cXORCheck ^= (Length + 5);
mov R24,R14
subi R24,251 ; addi 5
eor R10,R24
.dbline 320
; }
L41:
.dbline 322
;
; (*(pSFP->OutputDataFunc))(cCMD); //发送指令字节
mov R16,R12
movw R30,R20
ldd R26,z+0
ldd R27,z+1
movw R30,R26
xcall xicallx
.dbline 323
; cXORCheck ^= cCMD;
eor R10,R12
.dbline 325
;
; for (n = 0;n < Length;n++)
clr R12
xjmp L46
L43:
.dbline 326
; {
.dbline 327
; (*(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
xcall xicallx
.dbline 328
; cXORCheck ^= pMSG[n];
movw R30,R22
ldd R2,z+0
eor R10,R2
.dbline 329
; }
L44:
.dbline 325
inc R12
L46:
.dbline 325
cp R12,R14
brlo L43
X22:
.dbline 331
;
; (*(pSFP->OutputDataFunc))(cXORCheck); //发送校验字节
mov R16,R10
movw R30,R20
ldd R26,z+0
ldd R27,z+1
movw R30,R26
xcall xicallx
.dbline 332
; (*(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
xcall xicallx
.dbline 334
;
; return TRUE;
ldi R16,1
.dbline -2
L40:
.dbline 0 ; func end
xcall 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 + -