📄 rd_useserialframe_proc.s
字号:
.module RD_UseSerialFrame_PROC.c
.area text(rom, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块应用版\Relative_Locate_Module\RD_UseSerialFrame_PROC.c
.dbfunc e SFP_NULL_Output_Data_Function _SFP_NULL_Output_Data_Function fc
; p -> R10,R11
; cData -> y+2
.even
_SFP_NULL_Output_Data_Function::
st -y,r17
st -y,r16
st -y,R10
st -y,R11
.dbline -1
.dbline 104
; /***********************************************************
; * 函数库说明:串行通信数据帧处理函数函数库 *
; * 版本: v1.00 *
; * 作者: 王卓然 *
; * 创建日期: 2007年4月6日 *
; * -------------------------------------------------------- *
; * [支 持 库] *
; * 支持库名称:LIB_Config.h *
; * 需要版本: ----- *
; * 支持库说明:库函数配置声明库 *
; * *
; * 支持库名称:RD_MacroAndConst.h *
; * 需要版本: v0.01 &abv *
; * 支持库说明:系统常用宏定义库 *
; * *
; * 支持库名称:RD_UseSerialFrame_PROC.h *
; * 需要版本: ----- *
; * 支持库名称:串行通信数据帧处理函数声明库 *
; * -------------------------------------------------------- *
; * [版本更新] *
; * 修改: *
; * 修改日期: *
; * 版本: *
; * -------------------------------------------------------- *
; * [版本历史] *
; * -------------------------------------------------------- *
; * [使用说明] *
; ***********************************************************/
;
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "RD_MacroAndConst.h"
; # include "RD_ADT_QUEUE.h"
; # include "RD_ADT_MSGMap.h"
; # include "RD_UseSerialFrame_PROC.h"
; # include "RD_UseBits.h"
;
; /********************
; * 系 统 宏 定 义 *
; ********************/
;
; /*------------------*
; * 常 数 宏 定 义 *
; *------------------*/
; #ifndef SFP_CMD_ERROR
; # define SFP_CMD_ERROR 0xED
; #endif
; #ifndef SFP_ERROR_CMD_ERROR
; # define SFP_ERROR_CMD_ERROR 0x00
; #endif
; #ifndef SFP_ERROR_XOR
; # define SFP_ERROR_XOR 0x01
; #endif
;
;
; /*------------------*
; * 动 作 宏 定 义 *
; *------------------*/
; # define SFP_ACTION_FLAG SET_BIT8_FORMAT(cTempActionFlag)
; # define SFP_STOP_ALL_ACTION cTempActionFlag = NULL;
; # define SFP_WAIT_FOR_FRAME_HEAD SFP_ACTION_FLAG.BIT0
; # define SFP_WAIT_FOR_FRAME_SIZE SFP_ACTION_FLAG.BIT1
; # define SFP_WAIT_FOR_ALL_DATA SFP_ACTION_FLAG.BIT2
;
;
; /********************
; * 用户变量类型定义 *
; ********************/
;
; /********************
; * 结构体定义区 *
; ********************/
;
; /********************
; * 模块函数声明区 *
; ********************/
; static void SFP_Check_Frames(SERIAL_FRAME_PROCESS *pSFP);
;
; /********************
; * 全局函数声明区 *
; ********************/
; void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP);
; BOOL SFP_NULL_Output_Data_Function(uint8 cData);
; BOOL SFP_NULL_Input_Data_Function(uint8 *pData);
; BOOL SFP_NULL_Peek_Data_Function(uint8 *pData);
; BOOL SPF_Send_MSG(SERIAL_FRAME_PROCESS *pSFP,
; uint8 cCMD,uint8 *pMSG,uint8 Length);
; /********************
; * 模块变量声明区 *
; ********************/
;
; /********************
; * 全局变量声明区 *
; ********************/
;
; /***********************************************************
; * 函数说明:数据输出空函数 *
; * 输入: 数据 *
; * 输出: FALSE *
; * 调用函数:无 *
; ***********************************************************/
; BOOL SFP_NULL_Output_Data_Function(uint8 cData)
; {
.dbline 105
; uint8 *p = &cData;
movw R24,R28
adiw R24,2
movw R10,R24
.dbline 107
;
; return FALSE;
clr R16
.dbline -2
L1:
.dbline 0 ; func end
ld R11,y+
ld R10,y+
adiw R28,2
ret
.dbsym r p 10 pc
.dbsym l cData 2 c
.dbend
.dbfunc e SFP_NULL_Input_Data_Function _SFP_NULL_Input_Data_Function fc
; pData -> R16,R17
.even
_SFP_NULL_Input_Data_Function::
.dbline -1
.dbline 117
; }
;
; /***********************************************************
; * 函数说明:数据输入空函数 *
; * 输入: 指针 *
; * 输出: FALSE *
; * 调用函数:无 *
; ***********************************************************/
; BOOL SFP_NULL_Input_Data_Function(uint8 *pData)
; {
.dbline 118
; (*pData) = NULL;
clr R2
movw R30,R16
std z+0,R2
.dbline 120
;
; return FALSE;
clr R16
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbsym r pData 16 pc
.dbend
.dbfunc e SFP_NULL_Peek_Data_Function _SFP_NULL_Peek_Data_Function fc
; pData -> R16,R17
.even
_SFP_NULL_Peek_Data_Function::
.dbline -1
.dbline 130
; }
;
; /***********************************************************
; * 函数说明:数据察看空函数 *
; * 输入: 指针 *
; * 输出: FALSE *
; * 调用函数:无 *
; ***********************************************************/
; BOOL SFP_NULL_Peek_Data_Function(uint8 *pData)
; {
.dbline 131
; (*pData) = NULL;
clr R2
movw R30,R16
std z+0,R2
.dbline 133
;
; return FALSE;
clr R16
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbsym r pData 16 pc
.dbend
.dbfunc e Serial_Frame_Process _Serial_Frame_Process fV
.dbstruct 0 18 AbstructDataTypeQueue
.dbfield 0 pBuffer pc
.dbfield 2 nSize i
.dbfield 4 nHead i
.dbfield 6 nTail i
.dbfield 8 nCount i
.dbfield 10 fnAddToBuffer pfc
.dbfield 12 fnGetFromBuffer pfc
.dbfield 14 fnCheckEmpty pfc
.dbfield 16 fnPeekFromBuffer pfc
.dbend
.dbstruct 0 3 MsgMapItem
.dbfield 0 cCMD c
.dbfield 1 pMsgFunc pfc
.dbend
.dbstruct 0 3 MsgMap
.dbfield 0 cItemCount c
.dbfield 1 pMsgItems pS[MsgMapItem]
.dbend
.dbstruct 0 4 MsgItem
.dbfield 0 cCMD c
.dbfield 1 cDataLength c
.dbfield 2 pData pc
.dbend
.dbstruct 0 37 SerialFrameProcess
.dbfield 0 FrameBuffer S[AbstructDataTypeQueue]
.dbfield 18 pMsgMap pS[MsgMap]
.dbfield 20 MsgItem S[MsgItem]
.dbfield 24 cHeadByte c
.dbfield 25 cEndByte c
.dbfield 26 cFixLength c
.dbfield 27 cAddress c
.dbfield 28 InputDataFunc pfc
.dbfield 30 OutputDataFunc pfc
.dbfield 32 PeekDataFunc pfc
.dbfield 34 cActionFlag c
.dbfield 35 cXORCheck c
.dbfield 36 cFrameSize c
.dbend
; cTempData -> y+4
; pQueue -> R22,R23
; cTempActionFlag -> y+3
; pSFP -> R20,R21
.even
_Serial_Frame_Process::
rcall push_xgsetF00C
movw R20,R16
sbiw R28,5
.dbline -1
.dbline 144
; }
;
;
; /***********************************************************
; * 函数说明:串行通讯数据帧处理函数 *
; * 输入: 要处理的数据帧结构指针 *
; * 输出: 无 *
; * 调用函数:SFP_Check_Frames() *
; ***********************************************************/
; void Serial_Frame_Process(SERIAL_FRAME_PROCESS *pSFP)
; {
.dbline 146
;
; uint8 cTempActionFlag = pSFP->cActionFlag;
movw R30,R20
ldd R2,z+34
std y+3,R2
.dbline 147
; uint8 cTempData = 0;
clr R2
std y+4,R2
.dbline 148
; ADT_QUEUE *pQueue = &(pSFP->FrameBuffer);
movw R22,R30
.dbline 151
;
;
; if (!(*(pSFP->InputDataFunc))(&cTempData)) //利用函数指针调用函数
movw R16,R28
subi R16,252 ; offset = 4
sbci R17,255
ldd R26,z+28
ldd R27,z+29
movw R30,R26
rcall xicall
tst R16
brne L5
X0:
.dbline 152
; {
.dbline 153
; return ;
rjmp L4
L5:
.dbline 156
; }
;
; if (cTempActionFlag == NULL)
ldd R2,y+3
tst R2
brne L7
X1:
.dbline 157
; {
.dbline 158
; pSFP->cXORCheck = 0;
clr R2
movw R30,R20
std z+35,R2
.dbline 159
; pSFP->cFrameSize = 0;
std z+36,R2
.dbline 160
; SFP_WAIT_FOR_FRAME_HEAD = TRUE;
ldd R24,y+3
ori R24,1
std y+3,R24
.dbline 161
; }
L7:
.dbline 163
;
; if (SFP_WAIT_FOR_FRAME_HEAD)
movw R30,R28
ldd R24,z+3
andi R24,1
brne X13
rjmp L9
X13:
X2:
.dbline 164
; {
.dbline 165
; if (cTempData == pSFP->cHeadByte)
movw R30,R20
ldd R2,z+24
ldd R3,y+4
cp R3,R2
breq X14
rjmp L4
X14:
X3:
.dbline 166
; {
.dbline 167
; ADT_ADD_DATA_TO_QUEUE((*pQueue),cTempData);
mov R18,R3
movw R16,R22
movw R24,R22
adiw R24,10
movw R30,R24
ldd R26,z+0
ldd R27,z+1
movw R30,R26
rcall xicall
.dbline 170
;
;
; if (!(pSFP->cFixLength))
movw R30,R20
ldd R2,z+26
tst R2
brne L13
X4:
.dbline 171
; {
.dbline 173
; //变长数据帧
; SFP_WAIT_FOR_FRAME_SIZE = TRUE;
ldd R24,y+3
ori R24,2
std y+3,R24
.dbline 174
; }
rjmp L14
L13:
.dbline 176
; else
; {
.dbline 178
; //固定长度的数据帧
; SFP_WAIT_FOR_ALL_DATA = TRUE;
ldd R24,y+3
ori R24,4
std y+3,R24
.dbline 179
; pSFP->cFrameSize = pSFP->cFixLength;
movw R30,R20
ldd R2,z+26
std z+36,R2
.dbline 180
; }
L14:
.dbline 182
;
; SFP_WAIT_FOR_FRAME_HEAD = FALSE;
ldd R24,y+3
andi R24,254
std y+3,R24
.dbline 183
; pSFP->cActionFlag = cTempActionFlag;
mov R2,R24
movw R30,R20
std z+34,R2
.dbline 185
;
; }
.dbline 187
;
; return ;
rjmp L4
L9:
.dbline 190
; }
;
; if (SFP_WAIT_FOR_FRAME_SIZE)
movw R30,R28
ldd R24,z+3
lsr R24
andi R24,1
brne X15
rjmp L15
X15:
X5:
.dbline 191
; {
.dbline 193
;
; if (cTempData > (pQueue->nSize))
movw R30,R22
ldd R2,z+2
ldd R3,z+3
ldd R4,y+4
clr R5
cp R2,R4
cpc R3,R5
brsh L17
X6:
.dbline 194
; {
.dbline 197
; //错误的数据帧长度
;
; ADT_QUEUE_LET_EMPTY((*pQueue)) //清空队列
.dbline 197
clr R2
clr R3
std z+5,R3
std z+4,R2
.dbline 197
std z+7,R3
std z+6,R2
.dbline 197
std z+9,R3
std z+8,R2
.dbline 197
.dbline 199
;
; SFP_STOP_ALL_ACTION
std y+3,R2
.dbline 200
; }
rjmp L18
L17:
.dbline 202
; else
; {
.dbline 204
; //有效的数据帧长度
; pSFP->cFrameSize = cTempData; //更新数据帧长度信息
ldd R2,y+4
movw R30,R20
std z+36,R2
.dbline 205
; pSFP->cXORCheck ^= cTempData;
movw R24,R30
adiw R24,35
movw R30,R24
ldd R3,z+0
eor R3,R2
std z+0,R3
.dbline 207
;
; 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 210
;
;
; SFP_WAIT_FOR_ALL_DATA = TRUE;
ldd R24,y+3
ori R24,4
std y+3,R24
.dbline 211
; SFP_WAIT_FOR_FRAME_SIZE = FALSE;
andi R24,253
std y+3,R24
.dbline 212
; }
L18:
.dbline 214
;
; pSFP->cActionFlag = cTempActionFlag;
ldd R2,y+3
movw R30,R20
std z+34,R2
.dbline 215
; return ;
rjmp L4
L15:
.dbline 218
; }
;
; if (SFP_WAIT_FOR_ALL_DATA)
movw R30,R28
ldd R24,z+3
lsr R24
lsr R24
andi R24,1
brne X16
rjmp L19
X16:
X7:
.dbline 219
; {
.dbline 220
; 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
brsh L21
X8:
.dbline 221
; {
.dbline 222
; pSFP->cXORCheck ^= cTempData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -