📄 model.lst
字号:
221 818B LDD R24,Y+3
222 6084 ORI R24,4
223 838B STD Y+3,R24
(0211) SFP_WAIT_FOR_FRAME_SIZE = FALSE;
224 7F8D ANDI R24,0xFD
225 838B STD Y+3,R24
(0212) }
(0213)
(0214) pSFP->cActionFlag = cTempActionFlag;
226 802B LDD R2,Y+3
227 01FA MOVW R30,R20
228 A222 STD Z+34,R2
(0215) return ;
229 C063 RJMP 0x028D
(0216) }
(0217)
(0218) if (SFP_WAIT_FOR_ALL_DATA)
22A 01FE MOVW R30,R28
22B 8183 LDD R24,Z+3
22C 9586 LSR R24
22D 9586 LSR R24
22E 7081 ANDI R24,1
22F F409 BNE 0x0231
230 C05C RJMP 0x028D
(0219) {
(0220) if ((pQueue->nCount) < (pSFP->cFrameSize))
231 01FA MOVW R30,R20
232 A024 LDD R2,Z+36
233 2433 CLR R3
234 01FB MOVW R30,R22
235 8440 LDD R4,Z+8
236 8451 LDD R5,Z+9
237 1442 CP R4,R2
238 0453 CPC R5,R3
239 F488 BCC 0x024B
(0221) {
(0222) pSFP->cXORCheck ^= cTempData;
23A 01CA MOVW R24,R20
23B 9683 ADIW R24,0x23
23C 802C LDD R2,Y+4
23D 01FC MOVW R30,R24
23E 8030 LDD R3,Z+0
23F 2432 EOR R3,R2
240 8230 STD Z+0,R3
(0223) ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData); //将该信息添加到缓冲区
241 2D22 MOV R18,R2
242 018B MOVW R16,R22
243 01CB MOVW R24,R22
244 960A ADIW R24,0xA
245 015C MOVW R10,R24
246 01FC MOVW R30,R24
247 81A0 LDD R26,Z+0
248 81B1 LDD R27,Z+1
249 01FD MOVW R30,R26
24A D84D RCALL xicall
(0224)
(0225) }
(0226)
(0227) if ((pQueue->nCount) == ((pSFP->cFrameSize) - 1))
24B 01FA MOVW R30,R20
24C A184 LDD R24,Z+36
24D 5081 SUBI R24,1
24E 2799 CLR R25
24F 01FB MOVW R30,R22
250 8420 LDD R2,Z+8
251 8431 LDD R3,Z+9
252 1628 CP R2,R24
253 0639 CPC R3,R25
254 F4E1 BNE 0x0271
(0228) {
(0229) if (pSFP->cXORCheck)
255 01FA MOVW R30,R20
256 A023 LDD R2,Z+35
257 2022 TST R2
258 F409 BNE 0x025A
259 C033 RJMP 0x028D
(0230) {
(0231) //XOR校验错误
(0232) //错误的数据帧长度
(0233) ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
25A 2422 CLR R2
25B 2433 CLR R3
25C 01FB MOVW R30,R22
25D 8235 STD Z+5,R3
25E 8224 STD Z+4,R2
25F 8237 STD Z+7,R3
260 8226 STD Z+6,R2
261 8631 STD Z+9,R3
262 8620 STD Z+8,R2
(0234)
(0235) SFP_STOP_ALL_ACTION
263 822B STD Y+3,R2
(0236)
(0237) pSFP->cActionFlag = cTempActionFlag;
264 01FA MOVW R30,R20
265 A222 STD Z+34,R2
(0238) cTempData = SFP_ERROR_XOR;
266 E081 LDI R24,1
267 838C STD Y+4,R24
(0239) SPF_Send_MSG(pSFP,SFP_CMD_ERROR,&cTempData,1);
268 838A STD Y+2,R24
269 01CE MOVW R24,R28
26A 9604 ADIW R24,4
26B 8399 STD Y+1,R25
26C 8388 STD Y+0,R24
26D EE2D LDI R18,0xED
26E 018F MOVW R16,R30
26F D087 RCALL _SPF_Send_MSG
(0240) return ;
270 C01C RJMP 0x028D
(0241) }
(0242) else
(0243) {
(0244) //ReceiveData = cTempData;
(0245) }
(0246) }
(0247) else if ((pQueue->nCount) == (pSFP->cFrameSize))
271 01FA MOVW R30,R20
272 A024 LDD R2,Z+36
273 2433 CLR R3
274 01FB MOVW R30,R22
275 8440 LDD R4,Z+8
276 8451 LDD R5,Z+9
277 1442 CP R4,R2
278 0453 CPC R5,R3
279 F499 BNE 0x028D
(0248) {
(0249) //所有的数据都添加完成
(0250) if (cTempData == pSFP->cEndByte)
27A 01FA MOVW R30,R20
27B 8C21 LDD R2,Z+25
27C 803C LDD R3,Y+4
27D 1432 CP R3,R2
27E F411 BNE 0x0281
(0251) {
(0252) //获得了所有的数据,并且数据帧正确
(0253) SFP_Check_Frames(pSFP); //进行数据帧检测
27F 018F MOVW R16,R30
280 D00E RCALL RD_UseSerialFrame_PROC.c:SFP_Check_Frames
(0254) }
(0255)
(0256) ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
281 2422 CLR R2
282 2433 CLR R3
283 01FB MOVW R30,R22
284 8235 STD Z+5,R3
285 8224 STD Z+4,R2
286 8237 STD Z+7,R3
287 8226 STD Z+6,R2
288 8631 STD Z+9,R3
289 8620 STD Z+8,R2
(0257)
(0258) SFP_STOP_ALL_ACTION
28A 822B STD Y+3,R2
(0259) pSFP->cActionFlag = cTempActionFlag;
28B 01FA MOVW R30,R20
28C A222 STD Z+34,R2
(0260)
(0261) return ;
(0262) }
(0263)
(0264)
(0265)
(0266) return ;
28D 9625 ADIW R28,5
28E C7F0 RJMP pop_xgsetF00C
RD_UseSerialFrame_PROC.c:SFP_Check_Frames:
_SFP_Check_Frames:
cTempData --> Y,+4
pMsgItem --> R22
pQueue --> R10
n --> Y,+3
pSFP --> R20
28F D7F6 RCALL push_xgsetF03C
290 01A8 MOVW R20,R16
291 9725 SBIW R28,5
(0267) }
(0268)
(0269) }
(0270)
(0271) /***********************************************************
(0272) * 函数说明:数据帧提取检测函数 *
(0273) * 输入: 串行数据帧检测结构指针 *
(0274) * 输出: 无 *
(0275) * 调用函数:无 *
(0276) ***********************************************************/
(0277) static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP)
(0278) {
(0279) uint8 n = 0;
292 2422 CLR R2
293 822B STD Y+3,R2
(0280) uint8 cTempData = 0;
294 822C STD Y+4,R2
(0281) MSG_ITEM *pMsgItem = &(pSFP->MsgItem);
295 01BA MOVW R22,R20
296 5E6C SUBI R22,0xEC
297 4F7F SBCI R23,0xFF
(0282) ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
298 015A MOVW R10,R20
(0283)
(0284) //将头部去除
(0285) ADT_GET_DATA_FROM_QUEUE((*pQueue),n);
299 019E MOVW R18,R28
29A 5F2D SUBI R18,0xFD
29B 4F3F SBCI R19,0xFF
29C 0185 MOVW R16,R10
29D 01C5 MOVW R24,R10
29E 960C ADIW R24,0xC
29F 01FC MOVW R30,R24
2A0 81A0 LDD R26,Z+0
2A1 81B1 LDD R27,Z+1
2A2 01FD MOVW R30,R26
2A3 D7F4 RCALL xicall
(0286)
(0287) //获取消息长度
(0288) if (!(pSFP->cFixLength))
2A4 01FA MOVW R30,R20
2A5 8C22 LDD R2,Z+26
2A6 2022 TST R2
2A7 F481 BNE 0x02B8
(0289) {
(0290) ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cDataLength));
2A8 019B MOVW R18,R22
2A9 5F2F SUBI R18,0xFF
2AA 4F3F SBCI R19,0xFF
2AB 018F MOVW R16,R30
2AC 85A4 LDD R26,Z+12
2AD 85B5 LDD R27,Z+13
2AE 01FD MOVW R30,R26
2AF D7E8 RCALL xicall
(0291)
(0292) pMsgItem->cDataLength -= 5;
2B0 01CB MOVW R24,R22
2B1 9601 ADIW R24,1
2B2 016C MOVW R12,R24
2B3 01FC MOVW R30,R24
2B4 8180 LDD R24,Z+0
2B5 5085 SUBI R24,5
2B6 8380 STD Z+0,R24
(0293) }
2B7 C005 RJMP 0x02BD
(0294) else
(0295) {
(0296) pMsgItem->cDataLength = pSFP->cFixLength - 4;
2B8 01FA MOVW R30,R20
2B9 8D82 LDD R24,Z+26
2BA 5084 SUBI R24,4
2BB 01FB MOVW R30,R22
2BC 8381 STD Z+1,R24
(0297) }
(0298)
(0299) //获取指令字
(0300) ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->cCMD));
2BD 019B MOVW R18,R22
2BE 0185 MOVW R16,R10
2BF 01C5 MOVW R24,R10
2C0 960C ADIW R24,0xC
2C1 016C MOVW R12,R24
2C2 01FC MOVW R30,R24
2C3 81A0 LDD R26,Z+0
2C4 81B1 LDD R27,Z+1
2C5 01FD MOVW R30,R26
2C6 D7D1 RCALL xicall
(0301)
(0302) for (n = 0;n < (pMsgItem->cDataLength);n++)
2C7 2422 CLR R2
2C8 822B STD Y+3,R2
2C9 C013 RJMP 0x02DD
(0303) {
(0304) //依次获取所有数据
(0305) ADT_GET_DATA_FROM_QUEUE((*pQueue),(pMsgItem->pData[n]));
2CA 01FB MOVW R30,R22
2CB 8022 LDD R2,Z+2
2CC 8033 LDD R3,Z+3
2CD 812B LDD R18,Y+3
2CE 2733 CLR R19
2CF 0D22 ADD R18,R2
2D0 1D33 ADC R19,R3
2D1 0185 MOVW R16,R10
2D2 01C5 MOVW R24,R10
2D3 960C ADIW R24,0xC
2D4 016C MOVW R12,R24
2D5 01FC MOVW R30,R24
2D6 81A0 LDD R26,Z+0
2D7 81B1 LDD R27,Z+1
2D8 01FD MOVW R30,R26
2D9 D7BE RCALL xicall
2DA 818B LDD R24,Y+3
2DB 5F8F SUBI R24,0xFF
2DC 838B STD Y+3,R24
2DD 01FB MOVW R30,R22
2DE 8021 LDD R2,Z+1
2DF 803B LDD R3,Y+3
2E0 1432 CP R3,R2
2E1 F340 BCS 0x02CA
(0306) }
(0307)
(0308) if (!MsgMapProcess(pSFP->pMsgMap,pMsgItem))
2E2 019F MOVW R18,R30
2E3 01FA MOVW R30,R20
2E4 8902 LDD R16,Z+18
2E5 8913 LDD R17,Z+19
2E6 DDB4 RCALL _MsgMapProcess
2E7 2EA0 MOV R10,R16
2E8 2300 TST R16
2E9 F459 BNE 0x02F5
(0309) {
(0310) //信息未被正确处理
(0311) //有待添加代码
(0312) cTempData = SFP_ERROR_CMD_ERROR;
2EA 2422 CLR R2
2EB 822C STD Y+4,R2
(0313) SPF_Send_MSG(pSFP,SFP_CMD_ERROR,&cTempData,1);
2EC E081 LDI R24,1
2ED 838A STD Y+2,R24
2EE 01CE MOVW R24,R28
2EF 9604 ADIW R24,4
2F0 8399 STD Y+1,R25
2F1 8388 STD Y+0,R24
2F2 EE2D LDI R18,0xED
2F3 018A MOVW R16,R20
2F4 D002 RCALL _SPF_Send_MSG
(0314) }
2F5 9625 ADIW R28,5
2F6 C798 RJMP pop_xgsetF03C
_SPF_Send_MSG:
Reg2 --> R20
Reg8 --> R22
n1 --> R12
cXORCheck0 --> R10
Length --> R14
pMSG --> Y,+14
cCMD --> R12
pSFP --> Y,+10
2F7 D71D RCALL push_arg4
2F8 D76A RCALL push_xgsetF0FC
2F9 2EC2 MOV R12,R18
2FA 88E8 LDD R14,Y+16
(0315) }
(0316)
(0317) /***********************************************************
(0318) * 函数说明:消息发送函数 *
(0319) * 输入: 串行数据帧检测结构指针,指令,消息,消息长度 *
(0320) * 输出: TRUE *
(0321) * 调用函数:无 *
(0322) ***********************************************************/
(0323) BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
(0324) uint8 cCMD,uint8 *pMSG,uint8 Length)
(0325) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -