📄 rd_adt_queue.s
字号:
.module RD_ADT_QUEUE.c
.area text(rom, con, rel)
.dbfile E:\单片机\ROOBCO~1\全向定位系统\坐标转换模块\相对定位模块应用版\Relative_Locate_Module\RD_ADT_QUEUE.c
.dbfunc e ADT_Queue_Add_To_Buffer _ADT_Queue_Add_To_Buffer fc
.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
; cflags0 -> R10
; pBuffer -> R14,R15
; nCount0 -> R20,R21
; nHead0 -> y+0
; nTail0 -> R22,R23
; nSize0 -> R12,R13
; cData -> R18
; pQueue -> R16,R17
.even
_ADT_Queue_Add_To_Buffer::
rcall push_xgsetF0FC
sbiw R28,2
.dbline -1
.dbline 79
; /***********************************************************
; * 函数库说明:抽象数据类型(ADT)队列函数库 *
; * 版本: v1.01 *
; * 作者: 王卓然 *
; * 创建日期: 2007年3月23日 *
; * -------------------------------------------------------- *
; * [支 持 库] *
; * 支持库名称:RD_MacroAndConst.h *
; * 需要版本: v0.01 &abv *
; * 支持库说明:系统常用宏定义库 *
; * *
; * 支持库名称:RD_ADT_QUEUE.h *
; * 需要版本: ----- *
; * 支持库说明:抽象数据类型(ADT)队列声明库 *
; * -------------------------------------------------------- *
; * [版本更新] *
; * 修改: 王卓然 *
; * 修改日期: 2007年4月17日 *
; * 版本: v1.01 *
; * -------------------------------------------------------- *
; * [版本历史] *
; * v1.00 该版本提供了基本的抽象数据类型队列的结构定 *
; * 义,以及默认的环形队列处理函数。 *
; * v1.01 增加了队列空判断函数,和队列首数据预览函数 *
; * -------------------------------------------------------- *
; * [使用说明] *
; ***********************************************************/
;
; /********************
; * 头 文 件 配 置 区 *
; ********************/
; # include "RD_MacroAndConst.h"
; # include "RD_ADT_QUEUE.h"
;
; /********************
; * 系 统 宏 定 义 *
; ********************/
;
; /*------------------*
; * 常 数 宏 定 义 *
; *------------------*/
;
; /*------------------*
; * 动 作 宏 定 义 *
; *------------------*/
;
; /********************
; * 结构体定义区 *
; ********************/
;
; /********************
; * 模块函数声明区 *
; ********************/
;
; /********************
; * 全局函数声明区 *
; ********************/
; BOOL ADT_Queue_Add_To_Buffer(ADT_QUEUE *pQueue,uint8 cData);
; BOOL ADT_Queue_Get_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData);
; BOOL ADT_Queue_Check_Empty(ADT_QUEUE *pQueue);
; BOOL ADT_Queue_Peek_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData);
;
; /********************
; * 模块变量声明区 *
; ********************/
;
; /********************
; * 全局变量声明区 *
; ********************/
; # include "PF_Config.h"
;
; /***********************************************************
; * 函数说明:抽象数据类型队列,系统默认队列缓冲添加函数 *
; * 输入: 要添加到缓冲区的数据 *
; * 输出: 添加是否成功 *
; * 调用函数:无 *
; ***********************************************************/
; BOOL ADT_Queue_Add_To_Buffer(ADT_QUEUE *pQueue,uint8 cData)
; {
.dbline 87
; uint8 *pBuffer;
; uint nSize;
; uint nTail;
; uint nHead;
; uint nCount;
;
; //PORTG ^= BIT(PG3);
; SAFE_CODE_PERFORMANCE //原子操作
.dbline 87
in R10,0x3f
.dbline 87
cli
.dbline 87
movw R30,R16
ldd R14,z+0
ldd R15,z+1
.dbline 87
ldd R12,z+2
ldd R13,z+3
.dbline 87
tst R14
brne X0
tst R15
breq L4
X0:
tst R12
brne L2
tst R13
brne L2
X1:
L4:
.dbline 87
.dbline 87
sei
.dbline 87
clr R16
rjmp L1
L2:
.dbline 87
movw R30,R16
ldd R22,z+6
ldd R23,z+7
.dbline 87
ldd R2,z+4
ldd R3,z+5
std y+1,R3
std y+0,R2
.dbline 87
ldd R20,z+8
ldd R21,z+9
.dbline 87
movw R0,R2
cp R22,R2
cpc R23,R3
brne L5
X2:
cp R20,R12
cpc R21,R13
brne L5
X3:
.dbline 87
.dbline 87
sei
.dbline 87
clr R16
rjmp L1
L5:
.dbline 87
movw R30,R22
add R30,R14
adc R31,R15
std z+0,R18
.dbline 87
subi R22,255 ; offset = 1
sbci R23,255
.dbline 87
subi R20,255 ; offset = 1
sbci R21,255
.dbline 87
cp R22,R12
cpc R23,R13
brne L7
X4:
.dbline 87
.dbline 87
clr R22
clr R23
.dbline 87
L7:
.dbline 87
movw R30,R16
std z+7,R23
std z+6,R22
.dbline 87
std z+9,R21
std z+8,R20
.dbline 87
.dbline 87
out 0x3f,R10
.dbline 87
.dbline 120
; (
; pBuffer = pQueue->pBuffer;
; nSize = pQueue->nSize;
;
; if ((pBuffer == NULL) || (!nSize))
; {
; SEI();
; return FALSE; //缓冲区未分配空间
; }
; nTail = pQueue->nTail;
; nHead = pQueue->nHead;
; nCount = pQueue->nCount;
;
;
; if ((nTail == nHead) && (nCount == nSize)) //缓冲区已满
; {
; SEI();
; return FALSE;
; }
;
; pBuffer[nTail] = cData;
; nTail++;
; nCount++;
; if (nTail == nSize)
; {
; nTail = 0;
; }
;
; pQueue->nTail = nTail;
; pQueue->nCount = nCount;
; )
;
; return TRUE;
ldi R16,1
.dbline -2
L1:
.dbline 0 ; func end
adiw R28,2
rjmp pop_xgsetF0FC
.dbsym r cflags0 10 c
.dbsym r pBuffer 14 pc
.dbsym r nCount0 20 i
.dbsym l nHead0 0 i
.dbsym r nTail0 22 i
.dbsym r nSize0 12 i
.dbsym r cData 18 c
.dbsym r pQueue 16 pS[AbstructDataTypeQueue]
.dbend
.dbfunc e ADT_Queue_Get_From_Buffer _ADT_Queue_Get_From_Buffer fc
; cflags0 -> R10
; pBuffer -> R14,R15
; nHead1 -> R22,R23
; nCount0 -> R20,R21
; nHead0 -> R22,R23
; nTail0 -> y+0
; nSize0 -> R12,R13
; pData -> R18,R19
; pQueue -> R16,R17
.even
_ADT_Queue_Get_From_Buffer::
rcall push_xgsetF0FC
sbiw R28,2
.dbline -1
.dbline 130
; }
;
; /***********************************************************
; * 函数说明:抽象数据类型队列,系统默认队列缓冲区读取函数 *
; * 输入: 存放读取变量的空间指针 *
; * 输出: 队列是否为空 *
; * 调用函数:无 *
; ***********************************************************/
; BOOL ADT_Queue_Get_From_Buffer(ADT_QUEUE *pQueue,uint8 *pData)
; {
.dbline 137
; uint8 *pBuffer;
; uint nSize;
; uint nTail;
; uint nHead;
; uint nCount;
; //PORTG ^= BIT(PG3);
; SAFE_CODE_PERFORMANCE //原子操作
.dbline 137
in R10,0x3f
.dbline 137
cli
.dbline 137
movw R30,R16
ldd R14,z+0
ldd R15,z+1
.dbline 137
ldd R12,z+2
ldd R13,z+3
.dbline 137
tst R14
brne X5
tst R15
breq L12
X5:
tst R12
brne L10
tst R13
brne L10
X6:
L12:
.dbline 137
.dbline 137
sei
.dbline 137
clr R16
rjmp L9
L10:
.dbline 137
movw R30,R16
ldd R2,z+6
ldd R3,z+7
std y+1,R3
std y+0,R2
.dbline 137
ldd R22,z+4
ldd R23,z+5
.dbline 137
ldd R20,z+8
ldd R21,z+9
.dbline 137
movw R0,R2
cp R2,R22
cpc R3,R23
brne L13
X7:
cpi R20,0
cpc R20,R21
brne L13
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -