📄 model.lst
字号:
(0002) * 函数库说明:串行通信数据帧处理函数函数库 *
(0003) * 版本: v1.00 *
(0004) * 作者: 王卓然 *
(0005) * 创建日期: 2007年4月6日 *
(0006) * -------------------------------------------------------- *
(0007) * [支 持 库] *
(0008) * 支持库名称:LIB_Config.h *
(0009) * 需要版本: ----- *
(0010) * 支持库说明:库函数配置声明库 *
(0011) * *
(0012) * 支持库名称:RD_MacroAndConst.h *
(0013) * 需要版本: v0.01 &abv *
(0014) * 支持库说明:系统常用宏定义库 *
(0015) * *
(0016) * 支持库名称:RD_UseSerialFrame_PROC.h *
(0017) * 需要版本: ----- *
(0018) * 支持库名称:串行通信数据帧处理函数声明库 *
(0019) * -------------------------------------------------------- *
(0020) * [版本更新] *
(0021) * 修改: *
(0022) * 修改日期: *
(0023) * 版本: *
(0024) * -------------------------------------------------------- *
(0025) * [版本历史] *
(0026) * -------------------------------------------------------- *
(0027) * [使用说明] *
(0028) ***********************************************************/
(0029)
(0030) /********************
(0031) * 头 文 件 配 置 区 *
(0032) ********************/
(0033) # include "RD_MacroAndConst.h"
(0034) # include "RD_ADT_QUEUE.h"
(0035) # include "RD_ADT_MSGMap.h"
(0036) # include "RD_UseSerialFrame_PROC.h"
(0037) # include "RD_UseBits.h"
(0038)
(0039) /********************
(0040) * 系 统 宏 定 义 *
(0041) ********************/
(0042)
(0043) /*------------------*
(0044) * 常 数 宏 定 义 *
(0045) *------------------*/
(0046) #ifndef SFP_CMD_ERROR
(0047) # define SFP_CMD_ERROR 0xED
(0048) #endif
(0049) #ifndef SFP_ERROR_CMD_ERROR
(0050) # define SFP_ERROR_CMD_ERROR 0x00
(0051) #endif
(0052) #ifndef SFP_ERROR_XOR
(0053) # define SFP_ERROR_XOR 0x01
(0054) #endif
(0055)
(0056)
(0057) /*------------------*
(0058) * 动 作 宏 定 义 *
(0059) *------------------*/
(0060) # define SFP_ACTION_FLAG SET_BIT8_FORMAT(cTempActionFlag)
(0061) # define SFP_STOP_ALL_ACTION cTempActionFlag = NULL;
(0062) # define SFP_WAIT_FOR_FRAME_HEAD SFP_ACTION_FLAG.BIT0
(0063) # define SFP_WAIT_FOR_FRAME_SIZE SFP_ACTION_FLAG.BIT1
(0064) # define SFP_WAIT_FOR_ALL_DATA SFP_ACTION_FLAG.BIT2
(0065)
(0066)
(0067) /********************
(0068) * 用户变量类型定义 *
(0069) ********************/
(0070)
(0071) /********************
(0072) * 结构体定义区 *
(0073) ********************/
(0074)
(0075) /********************
(0076) * 模块函数声明区 *
(0077) ********************/
(0078) static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP);
(0079)
(0080) /********************
(0081) * 全局函数声明区 *
(0082) ********************/
(0083) void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP);
(0084) BOOL SFP_NULL_Output_Data_Function(uint8 cData);
(0085) BOOL SFP_NULL_Input_Data_Function(uint8 *pData);
(0086) BOOL SFP_NULL_Peek_Data_Function(uint8 *pData);
(0087) BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
(0088) uint8 cCMD,uint8 *pMSG,uint8 Length);
(0089) /********************
(0090) * 模块变量声明区 *
(0091) ********************/
(0092)
(0093) /********************
(0094) * 全局变量声明区 *
(0095) ********************/
(0096)
(0097) /***********************************************************
(0098) * 函数说明:数据输出空函数 *
(0099) * 输入: 数据 *
(0100) * 输出: FALSE *
(0101) * 调用函数:无 *
(0102) ***********************************************************/
(0103) BOOL SFP_NULL_Output_Data_Function(uint8 cData)
(0104) {
(0105) uint8 *p = &cData;
19E 01CE MOVW R24,R28
19F 9602 ADIW R24,2
1A0 015C MOVW R10,R24
(0106)
(0107) return FALSE;
1A1 2700 CLR R16
1A2 90B9 LD R11,Y+
1A3 90A9 LD R10,Y+
1A4 9622 ADIW R28,2
1A5 9508 RET
(0108) }
(0109)
(0110) /***********************************************************
(0111) * 函数说明:数据输入空函数 *
(0112) * 输入: 指针 *
(0113) * 输出: FALSE *
(0114) * 调用函数:无 *
(0115) ***********************************************************/
(0116) BOOL SFP_NULL_Input_Data_Function(uint8 *pData)
(0117) {
(0118) (*pData) = NULL;
_SFP_NULL_Input_Data_Function:
pData --> R16
1A6 2422 CLR R2
1A7 01F8 MOVW R30,R16
1A8 8220 STD Z+0,R2
(0119)
(0120) return FALSE;
1A9 2700 CLR R16
1AA 9508 RET
(0121) }
(0122)
(0123) /***********************************************************
(0124) * 函数说明:数据察看空函数 *
(0125) * 输入: 指针 *
(0126) * 输出: FALSE *
(0127) * 调用函数:无 *
(0128) ***********************************************************/
(0129) BOOL SFP_NULL_Peek_Data_Function(uint8 *pData)
(0130) {
(0131) (*pData) = NULL;
_SFP_NULL_Peek_Data_Function:
pData --> R16
1AB 2422 CLR R2
1AC 01F8 MOVW R30,R16
1AD 8220 STD Z+0,R2
(0132)
(0133) return FALSE;
1AE 2700 CLR R16
1AF 9508 RET
_Serial_Frame_Process:
cTempData --> Y,+4
pQueue --> R22
cTempActionFlag --> Y,+3
pSFP --> R20
1B0 D8C7 RCALL push_xgsetF00C
1B1 01A8 MOVW R20,R16
1B2 9725 SBIW R28,5
(0134) }
(0135)
(0136)
(0137) /***********************************************************
(0138) * 函数说明:串行通讯数据帧处理函数 *
(0139) * 输入: 要处理的数据帧结构指针 *
(0140) * 输出: 无 *
(0141) * 调用函数:SFP_Check_Frames() *
(0142) ***********************************************************/
(0143) void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP)
(0144) {
(0145)
(0146) uint8 cTempActionFlag = pSFP->cActionFlag;
1B3 01FA MOVW R30,R20
1B4 A022 LDD R2,Z+34
1B5 822B STD Y+3,R2
(0147) uint8 cTempData = 0;
1B6 2422 CLR R2
1B7 822C STD Y+4,R2
(0148) ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
1B8 01BF MOVW R22,R30
(0149)
(0150)
(0151) if (!(*(pSFP->InputDataFunc))(&cTempData)) //利用函数指针调用函数
1B9 018E MOVW R16,R28
1BA 5F0C SUBI R16,0xFC
1BB 4F1F SBCI R17,0xFF
1BC 8DA4 LDD R26,Z+28
1BD 8DB5 LDD R27,Z+29
1BE 01FD MOVW R30,R26
1BF D8D8 RCALL xicall
1C0 2300 TST R16
1C1 F409 BNE 0x01C3
(0152) {
(0153) return ;
1C2 C0CA RJMP 0x028D
(0154) }
(0155)
(0156) if (cTempActionFlag == NULL)
1C3 802B LDD R2,Y+3
1C4 2022 TST R2
1C5 F439 BNE 0x01CD
(0157) {
(0158) pSFP->cXORCheck = 0;
1C6 2422 CLR R2
1C7 01FA MOVW R30,R20
1C8 A223 STD Z+35,R2
(0159) pSFP->cFrameSize = 0;
1C9 A224 STD Z+36,R2
(0160) SFP_WAIT_FOR_FRAME_HEAD = TRUE;
1CA 818B LDD R24,Y+3
1CB 6081 ORI R24,1
1CC 838B STD Y+3,R24
(0161) }
(0162)
(0163) if (SFP_WAIT_FOR_FRAME_HEAD)
1CD 01FE MOVW R30,R28
1CE 8183 LDD R24,Z+3
1CF 7081 ANDI R24,1
1D0 F409 BNE 0x01D2
1D1 C024 RJMP 0x01F6
(0164) {
(0165) if (cTempData == pSFP->cHeadByte)
1D2 01FA MOVW R30,R20
1D3 8C20 LDD R2,Z+24
1D4 803C LDD R3,Y+4
1D5 1432 CP R3,R2
1D6 F009 BEQ 0x01D8
1D7 C0B5 RJMP 0x028D
(0166) {
(0167) ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);
1D8 2D23 MOV R18,R3
1D9 018B MOVW R16,R22
1DA 01CB MOVW R24,R22
1DB 960A ADIW R24,0xA
1DC 01FC MOVW R30,R24
1DD 81A0 LDD R26,Z+0
1DE 81B1 LDD R27,Z+1
1DF 01FD MOVW R30,R26
1E0 D8B7 RCALL xicall
(0168)
(0169)
(0170) if (!(pSFP->cFixLength))
1E1 01FA MOVW R30,R20
1E2 8C22 LDD R2,Z+26
1E3 2022 TST R2
1E4 F421 BNE 0x01E9
(0171) {
(0172) //变长数据帧
(0173) SFP_WAIT_FOR_FRAME_SIZE = TRUE;
1E5 818B LDD R24,Y+3
1E6 6082 ORI R24,2
1E7 838B STD Y+3,R24
(0174) }
1E8 C006 RJMP 0x01EF
(0175) else
(0176) {
(0177) //固定长度的数据帧
(0178) SFP_WAIT_FOR_ALL_DATA = TRUE;
1E9 818B LDD R24,Y+3
1EA 6084 ORI R24,4
1EB 838B STD Y+3,R24
(0179) pSFP->cFrameSize = pSFP->cFixLength;
1EC 01FA MOVW R30,R20
1ED 8C22 LDD R2,Z+26
1EE A224 STD Z+36,R2
(0180) }
(0181)
(0182) SFP_WAIT_FOR_FRAME_HEAD = FALSE;
1EF 818B LDD R24,Y+3
1F0 7F8E ANDI R24,0xFE
1F1 838B STD Y+3,R24
(0183) pSFP->cActionFlag = cTempActionFlag;
1F2 2E28 MOV R2,R24
1F3 01FA MOVW R30,R20
1F4 A222 STD Z+34,R2
(0184)
(0185) }
(0186)
(0187) return ;
1F5 C097 RJMP 0x028D
(0188) }
(0189)
(0190) if (SFP_WAIT_FOR_FRAME_SIZE)
1F6 01FE MOVW R30,R28
1F7 8183 LDD R24,Z+3
1F8 9586 LSR R24
1F9 7081 ANDI R24,1
1FA F409 BNE 0x01FC
1FB C02E RJMP 0x022A
(0191) {
(0192)
(0193) if (cTempData > (pQueue->nSize))
1FC 01FB MOVW R30,R22
1FD 8022 LDD R2,Z+2
1FE 8033 LDD R3,Z+3
1FF 804C LDD R4,Y+4
200 2455 CLR R5
201 1424 CP R2,R4
202 0435 CPC R3,R5
203 F450 BCC 0x020E
(0194) {
(0195) //错误的数据帧长度
(0196)
(0197) ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
204 2422 CLR R2
205 2433 CLR R3
206 8235 STD Z+5,R3
207 8224 STD Z+4,R2
208 8237 STD Z+7,R3
209 8226 STD Z+6,R2
20A 8631 STD Z+9,R3
20B 8620 STD Z+8,R2
(0198)
(0199) SFP_STOP_ALL_ACTION
20C 822B STD Y+3,R2
(0200) }
20D C018 RJMP 0x0226
(0201) else
(0202) {
(0203) //有效的数据帧长度
(0204) pSFP->cFrameSize = cTempData; //更新数据帧长度信息
20E 802C LDD R2,Y+4
20F 01FA MOVW R30,R20
210 A224 STD Z+36,R2
(0205) pSFP->cXORCheck ^= cTempData;
211 01CF MOVW R24,R30
212 9683 ADIW R24,0x23
213 01FC MOVW R30,R24
214 8030 LDD R3,Z+0
215 2432 EOR R3,R2
216 8230 STD Z+0,R3
(0206)
(0207) ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData); //将该信息添加到缓冲区
217 2D22 MOV R18,R2
218 018B MOVW R16,R22
219 01CB MOVW R24,R22
21A 960A ADIW R24,0xA
21B 015C MOVW R10,R24
21C 01FC MOVW R30,R24
21D 81A0 LDD R26,Z+0
21E 81B1 LDD R27,Z+1
21F 01FD MOVW R30,R26
220 D877 RCALL xicall
(0208)
(0209)
(0210) SFP_WAIT_FOR_ALL_DATA = TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -