|
//////////////////////////////////////////////////////
#include "N1S16DSP.H"
////////////////////////////////////////////////////////////////////////////////////////// // // ============= // 内部RAM分配 // ============= // 1、总体分配 // 。00000-08000H 数据和程序区 // 。18000-1FFFFH 数据和程序区(通过DROM=1映射到数据区) // 。28000-2FFFFH 程序区(高端内存2, 本工程作为数据/报文缓冲使用) // 。38000-3FFFFH 程序区(高端内存3, 本工程作为数据/报文缓冲使用) // // 数据和程序区(00000-0FFFFH) // // ! 参考N1S16DSP.cmd文件 ! // // 2、设置区 (0xB000, 0x400 = 1kw) // stDspWordSetting: 0xB000, len = 1024kw >= sizeof(stDspWordSetting) // // 3、UDP和MAC调试缓冲 (0xB400, 0x400 = 1kw) // upUdpMacAdjustBuf: 0xB400, len = 1024kw >= sizeof(stUdpMacAdjustBuf) // // 4、uRxdNet和uTxdNet缓冲 (0xB800, 0x800 = 2kw) // uRxdNet: 0xB800, len = 0x400 >= sizeof(union NetCardUnionType) // uTxdNet: 0xBC00, len = 0x400 >= sizeof(union NetCardUnionType) // // 5、串口接收和发送临时缓冲(0xC000, 0x4000 = 16kw) // 。按32口计算, 16kw / 32 / 2 = 0x100, 256字/512字节 // // 。接收缓冲 // uiLowComRxd1: 0xC000, len = 0x100 // uiLowComRxd2: 0xC100, len = 0x100 // ...... // uiLowComRxd32: 0xDF00, len = 0x100 // // 。发送缓冲 // uiLowComTxd1: 0xE000, len = 0x100 // uiLowComTxd2: 0xE100, len = 0x100 // ...... // uiLowComTxd32: 0xFF00, len = 0x100 // // 6、网络重发缓冲 > 高端内存2;每帧 len = 768w = sizeof(union NetCardUnionType) = 0x300 // uExtRetransBuffer1: 0x28000, len = 0x4000, 16kw, 最多21帧, 应尽量把发送帧装满, 以节约缓冲 // uExtRetransBuffer2: 0x2C000, len = 0x4000, 16kw, 最多21帧, 应尽量把发送帧装满, 以节约缓冲 // // 若修正,必须调整 N1S16DSP.H中的 #define cnReSendBlock 21 // 重发缓冲区的个数 !!!!! // // 7、与89LV52通信接口缓冲 > 高端内存3 // uiDspStatus: 0x38000,len = 0x100,256w;DSP工作状态标识区 // uiC51Status: 0x38100,len = 0x100,256w;89LV52工作状态标识区 // uiDSP89LV52: 0x38200, len = 0x400, 1kw; DSP写向89LV52的命令/响应区 // ui89LV52DSP: 0x38600, len = 0x400, 1kw; 89LV52写向DSP的命令/响应区 // uiReUseTxdNet: 0x38A00, len = 768w = sizeof(union NetCardUnionType) = 0x300, 保存复用内存空间网络发送帧结构TxdNet // ui89LV52Buf: 0x39000, len = 0x1000, 4kw; 89LV52的命令/数据缓冲区(相当于扩展RAM) // // 8、剩余的高端内存3:0x3A000开始 // // ============= // 扩展RAM分配 // ============= // 1、8片IS61LV25616, 每片256K字(每片8段, 每段32K字), 共2M字; // // 2、串口缓冲(第1...8片, 共64段, 2M字) // 。每个串口占用1段, 为32K字 // // 。接收缓冲和发送缓冲交替存放,便于扩展存储容量 // uiExtComRxd1: uiChip = 1, uiSeg = 0 // uiExtComTxd1: uiChip = 1, uiSeg = 1 // uiExtComRxd2: uiChip = 1, uiSeg = 2 // uiExtComTxd2: uiChip = 1, uiSeg = 3 // uiExtComRxd3: uiChip = 1, uiSeg = 4 // uiExtComTxd3: uiChip = 1, uiSeg = 5 // uiExtComRxd4: uiChip = 1, uiSeg = 6 // uiExtComTxd4: uiChip = 1, uiSeg = 7 // // uiExtComRxd5: uiChip = 2, uiSeg = 0 // uiExtComTxd5: uiChip = 2, uiSeg = 1 // uiExtComRxd6: uiChip = 2, uiSeg = 2 // uiExtComTxd6: uiChip = 2, uiSeg = 3 // uiExtComRxd7: uiChip = 2, uiSeg = 4 // uiExtComTxd7: uiChip = 2, uiSeg = 5 // uiExtComRxd8: uiChip = 2, uiSeg = 6 // uiExtComTxd8: uiChip = 2, uiSeg = 7 // // uiExtComRxd9: uiChip = 3, uiSeg = 0 // uiExtComTxd9: uiChip = 3, uiSeg = 1 // uiExtComRxd10: uiChip = 3, uiSeg = 2 // uiExtComTxd10: uiChip = 3, uiSeg = 3 // uiExtComRxd11: uiChip = 3, uiSeg = 4 // uiExtComTxd11: uiChip = 3, uiSeg = 5 // uiExtComRxd12: uiChip = 3, uiSeg = 6 // uiExtComTxd12: uiChip = 3, uiSeg = 7 // // uiExtComRxd13: uiChip = 4, uiSeg = 0 // uiExtComTxd13: uiChip = 4, uiSeg = 1 // uiExtComRxd14: uiChip = 4, uiSeg = 2 // uiExtComTxd14: uiChip = 4, uiSeg = 3 // uiExtComRxd15: uiChip = 4, uiSeg = 4 // uiExtComTxd15: uiChip = 4, uiSeg = 5 // uiExtComRxd16: uiChip = 4, uiSeg = 6 // uiExtComTxd16: uiChip = 4, uiSeg = 7 // // uiExtComRxd17: uiChip = 5, uiSeg = 0 // uiExtComTxd17: uiChip = 5, uiSeg = 1 // uiExtComRxd18: uiChip = 5, uiSeg = 2 // uiExtComTxd18: uiChip = 5, uiSeg = 3 // uiExtComRxd19: uiChip = 5, uiSeg = 4 // uiExtComTxd19: uiChip = 5, uiSeg = 5 // uiExtComRxd20: uiChip = 5, uiSeg = 6 // uiExtComTxd20: uiChip = 5, uiSeg = 7 // // uiExtComRxd21: uiChip = 6, uiSeg = 0 // uiExtComTxd21: uiChip = 6, uiSeg = 1 // uiExtComRxd22: uiChip = 6, uiSeg = 2 // uiExtComTxd22: uiChip = 6, uiSeg = 3 // uiExtComRxd23: uiChip = 6, uiSeg = 4 // uiExtComTxd23: uiChip = 6, uiSeg = 5 // uiExtComRxd24: uiChip = 6, uiSeg = 6 // uiExtComTxd24: uiChip = 6, uiSeg = 7 // // uiExtComRxd25: uiChip = 7, uiSeg = 0 // uiExtComTxd25: uiChip = 7, uiSeg = 1 // uiExtComRxd26: uiChip = 7, uiSeg = 2 // uiExtComTxd26: uiChip = 7, uiSeg = 3 // uiExtComRxd27: uiChip = 7, uiSeg = 4 // uiExtComTxd27: uiChip = 7, uiSeg = 5 // uiExtComRxd28: uiChip = 7, uiSeg = 6 // uiExtComTxd28: uiChip = 7, uiSeg = 7 // // uiExtComRxd29: uiChip = 8, uiSeg = 0 // uiExtComTxd29: uiChip = 8, uiSeg = 1 // uiExtComRxd30: uiChip = 8, uiSeg = 2 // uiExtComTxd30: uiChip = 8, uiSeg = 3 // uiExtComRxd31: uiChip = 8, uiSeg = 4 // uiExtComTxd31: uiChip = 8, uiSeg = 5 // uiExtComRxd32: uiChip = 8, uiSeg = 6 // uiExtComTxd32: uiChip = 8, uiSeg = 7 // //////////////////////////////////////////////////////////////////////////////////////////
// 初始化位于Variable的RAM的缓冲指针 void vInitVariableRamBufferPointer() { UINT ui;
union NetCardUnionType *upRxdNet; // 接收帧结构指针 union NetCardUnionType *upTxdNet; // 发送帧结构指针 // 2、设置区 (0xB000, 0x400 = 1kw) // stDspWordSetting: 0xB000, len = 1024kw >= sizeof(stDspWordSetting) stDspWordSetting = (stDspWordSettingType *)0xB000; // (DSP可以使用的)设置定义
// 3、UDP和MAC调试缓冲 (0xB400, 0x400 = 1kw) // upUdpMacAdjustBuf: 0xB400, len = 1024kw >= sizeof(stUdpMacAdjustBuf) upUdpMacAdjustBuf = (stUdpMacAdjustBuf *)0xB400; // 调试用UDP和MAC缓冲
// 4、uRxdNet和uTxdNet缓冲 (0xB800, 0x800 = 2kw) // uRxdNet: 0xB800, len = 0x400 >= sizeof(union NetCardUnionType) // uTxdNet: 0xBC00, len = 0x400 >= sizeof(union NetCardUnionType)
// 接收帧结构指针 upRxdNet = (union NetCardUnionType *)0xB800; // 发送帧结构指针 upTxdNet = (union NetCardUnionType *)0xBC00;
upRxdWordsBuf = upRxdNet->words.uiWordBuf; // 接收缓冲字型指针(指向实际接收帧结构,在RamAccessC.C中vInitVariableRamBufferPointer()分配) upTxdWordsBuf = upTxdNet->words.uiWordBuf; // 发送缓冲字型指针(指向实际发送帧结构,在RamAccessC.C中vInitVariableRamBufferPointer()分配) upReUseTxdWordsBuf = upTxdWordsBuf + cnWordCountForLongAlign; // 复用实际发送帧结构,作为临时大容量缓冲;使用方法:将结构内容复制到高端内存 == 复用内存空间 ==> 将高端内存内容复制回原结构
stpRxdEtherFrame = &upRxdNet->stEtherFrame; stpRxdArpFrame = &upRxdNet->stArpFrame; stpRxdIcmpFrame = &upRxdNet->stIcmpFrame; stpRxdTcpFrame = &upRxdNet->stTcpFrame; stpRxdIpFrame = &upRxdNet->stIpFrame; stpRxdUdpFrame = &upRxdNet->stUdpFrame; stpRxdIpPacket = &upRxdNet->stIpPacket;
stpTxdEtherFrame = &upTxdNet->stEtherFrame; stpTxdArpFrame = &upTxdNet->stArpFrame; stpTxdIcmpFrame = &upTxdNet->stIcmpFrame; stpTxdTcpFrame = &upTxdNet->stTcpFrame; stpTxdIpFrame = &upTxdNet->stIpFrame; stpTxdUdpFrame = &upTxdNet->stUdpFrame; stpTxdIpPacket = &upTxdNet->stIpPacket;
// 清零缓冲 for (ui = 0; ui < cnWordSizeUnionNetCardType; ui ++) { upRxdWordsBuf[ui] = 5; upTxdWordsBuf[ui] = 5; }
// 5、串口接收和发送临时缓冲(0xC000, 0x4000 = 16kw) // 。按32口计算, 16kw / 32 / 2 = 0x100, 256字/512字节 // // 。接收缓冲 // uiLowComRxd1: 0xC000, len = 0x100 // uiLowComRxd2: 0xC100, len = 0x100 // ...... // uiLowComRxd32: 0xDF00, len = 0x100 // // 。发送缓冲 // uiLowComTxd1: 0xE000, len = 0x100 // uiLowComTxd2: 0xE100, len = 0x100 // ...... // uiLowComTxd32: 0xFF00, len = 0x100 // for (ui = 0; ui < cnMaxComThisType; ui ++) { uiLowComRxd[ui] = (UINT *)(0xC000 + cnComTmpRecvBufWordSize * ui); // 串口临时接收缓冲区指针 uiLowComTxd[ui] = (UINT *)(0xE000 + cnComTmpSendBufWordSize * ui); // 串口临时发送缓冲区指针 } }
UINT uiWriteExtRamAddr[3]; // 公共的写入当前存储数据的地址:顺序为片地址、段地址、偏移地址 UINT uiReadExtRamAddr[3]; // 公共的读取当前存储数据的地址:顺序为片地址、段地址、偏移地址
// ============= // 扩展RAM空间 // ============= // 1、8片IS61LV25616, 每片256K字, 共2M字; // 2、片地址由A19-A22四个高位地址决定, 范围1-8; // 3、段地址由900H口地址决定, 范围0-7; // 4、偏移量由A0-A14共15个地址决定, 范围8000H-FFFFH(实际使用时为0000H-7FFFH);
// 将缓冲uiBuffer中的数据写入扩展RAM, 长度为uiLen, 片选uiChip, 段地址uiSeg, 偏移地址uiOffset void vWriteExtRam(UINT uiChip, UINT uiSeg, UINT uiOffset, UINT uiBuffer, UINT uiLen) { if (uiChip < 1 || uiChip > 8) return; // 错误的片选:范围1-8 if (uiSeg > 7) return; // 错误的段地址:范围0-7 if (uiOffset >= 0x8000) return; // 错误的偏移量:0000H-7FFFH if (uiLen < 1 || uiLen > 0x8000) return; // 错误的长度:0001H-8000H
if ((ULNG)uiOffset + (ULNG)uiLen > (ULNG)0x8000) // 如果超过本段储存空间, 忽略超出部分 uiLen = (UINT)0x8000 - uiOffset;
uiWriteExtRamAddr[0] = uiChip; // 片选 uiWriteExtRamAddr[1] = uiSeg; // 段地址 uiWriteExtRamAddr[2] = uiOffset | 0x8000; // 偏移地址
vWriteExtRamByGP(uiBuffer, uiLen); // 通过uiWriteExtRamAddr[]指定地址, 将缓冲uiBuffer中的数据写入扩展RAM, 长度为uiLen }
// 从扩展RAM中读取数据到缓冲uiBuffer, 长度为uiLen, 片选uiChip, 段地址uiSeg, 偏移地址uiOffset void vReadExtRam(UINT uiChip, UINT uiSeg, UINT uiOffset, UINT uiBuffer, UINT uiLen) { if (uiChip < 1 || uiChip > 8) return; // 错误的片选:范围1-8 if (uiSeg > 7) return; // 错误的段地址:范围0-7 if (uiOffset >= 0x8000) return; // 错误的偏移量:0000H-7FFFH if (uiLen < 1 || uiLen > 0x8000) return; // 错误的长度:0001H-8000H if ((ULNG)uiOffset + (ULNG)uiLen > (ULNG)0x8000) // 如果超过本段储存空间, 忽略超出部分 uiLen = (UINT)0x8000 - uiOffset;
uiReadExtRamAddr[0] = uiChip; // 片选 uiReadExtRamAddr[1] = uiSeg; // 段地址 uiReadExtRamAddr[2] = uiOffset | 0x8000; // 偏移地址
vReadExtRamByGP(uiBuffer, uiLen); // 通过uiReadExtRamAddr[]指定地址, 从扩展RAM中读取数据到缓冲uiBuffer, 长度为uiLen } /* // 将缓冲uiBuffer中的数据写入扩展RAM, 长度为uiLen, 片选uiChip, 段地址uiSeg, 偏移地址uiOffset void vWriteExtRamRptb(UINT uiChip, UINT uiSeg, UINT uiOffset, UINT uiBuffer, UINT uiLen) { if (uiChip < 1 || uiChip > 8) return; // 错误的片选:范围1-8 if (uiSeg > 7) return; // 错误的段地址:范围0-7 if (uiOffset >= 0x8000) return; // 错误的偏移量:0000H-7FFFH if (uiLen < 1 || uiLen > 0x8000) return; // 错误的长度:0001H-8000H
if ((ULNG)uiOffset + (ULNG)uiLen > (ULNG)0x8000) // 如果超过本段储存空间, 忽略超出部分 uiLen = (UINT)0x8000 - uiOffset;
uiWriteExtRamAddr[0] = uiChip; // 片选 uiWriteExtRamAddr[1] = uiSeg; // 段地址 uiWriteExtRamAddr[2] = uiOffset | 0x8000; // 偏移地址
vWriteExtRamRptbByGP(uiBuffer, uiLen); // 通过uiWriteExtRamAddr[]指定地址, 将缓冲uiBuffer中的数据写入扩展RAM, 长度为uiLen }
// 从扩展RAM中读取数据到缓冲uiBuffer, 长度为uiLen, 片选uiChip, 段地址uiSeg, 偏移地址uiOffset void vReadExtRamRptb(UINT uiChip, UINT uiSeg, UINT uiOffset, UINT uiBuffer, UINT uiLen) { if (uiChip < 1 || uiChip > 8) return; // 错误的片选:范围1-8 if (uiSeg > 7) return; // 错误的段地址:范围0-7 if (uiOffset >= 0x8000) return; // 错误的偏移量:0000H-7FFFH if (uiLen < 1 || uiLen > 0x8000) return; // 错误的长度:0001H-8000H if ((ULNG)uiOffset + (ULNG)uiLen > (ULNG)0x8000) // 如果超过本段储存空间, 忽略超出部分 uiLen = (UINT)0x8000 - uiOffset;
uiReadExtRamAddr[0] = uiChip; // 片选 uiReadExtRamAddr[1] = uiSeg; // 段地址 uiReadExtRamAddr[2] = uiOffset | 0x8000; // 偏移地址
vReadExtRamRptbByGP(uiBuffer, uiLen); // 通过uiReadExtRamAddr[]指定地址, 从扩展RAM中读取数据到缓冲uiBuffer, 长度为uiLen } */
// ============= // 扩展RAM分配 // ============= // 1、8片IS61LV25616, 每片256K字(每片8段, 每段32K字), 共2M字; // // 2、串口缓冲(第1...8片, 共64段, 2M字) // 。每个串口占用1段, 为32K字 // // 。接收缓冲和发送缓冲交替存放,便于扩展存储容量 // uiExtComRxd1: uiChip = 1, uiSeg = 0 // uiExtComTxd1: uiChip = 1, uiSeg = 1 // uiExtComRxd2: uiChip = 1, uiSeg = 2 // uiExtComTxd2: uiChip = 1, uiSeg = 3 // uiExtComRxd3: uiChip = 1, uiSeg = 4 // uiExtComTxd3: uiChip = 1, uiSeg = 5 // uiExtComRxd4: uiChip = 1, uiSeg = 6 // uiExtComTxd4: uiChip = 1, uiSeg = 7 // // uiExtComRxd5: uiChip = 2, uiSeg = 0 // uiExtComTxd5: uiChip = 2, uiSeg = 1 // uiExtComRxd6: uiChip = 2, uiSeg = 2 // uiExtComTxd6: uiChip = 2, uiSeg = 3 // uiExtComRxd7: uiChip = 2, uiSeg = 4 // uiExtComTxd7: uiChip = 2, uiSeg = 5 // uiExtComRxd8: uiChip = 2, uiSeg = 6 // uiExtComTxd8: uiChip = 2, uiSeg = 7 // // uiExtComRxd9: uiChip = 3, uiSeg = 0 // uiExtComTxd9: uiChip = 3, uiSeg = 1 // uiExtComRxd10: uiChip = 3, uiSeg = 2 // uiExtComTxd10: uiChip = 3, uiSeg = 3 // uiExtComRxd11: uiChip = 3, uiSeg = 4 // uiExtComTxd11: uiChip = 3, uiSeg = 5 // uiExtComRxd12: uiChip = 3, uiSeg = 6 // uiExtComTxd12: uiChip = 3, uiSeg = 7 // // uiExtComRxd13: uiChip = 4, uiSeg = 0 // uiExtComTxd13: uiChip = 4, uiSeg = 1 // uiExtComRxd14: uiChip = 4, uiSeg = 2 // uiExtComTxd14: uiChip = 4, uiSeg = 3 // uiExtComRxd15: uiChip = 4, uiSeg = 4 // uiExtComTxd15: uiChip = 4, uiSeg = 5 // uiExtComRxd16: uiChip = 4, uiSeg = 6 // uiExtComTxd16: uiChip = 4, uiSeg = 7 // // uiExtComRxd17: uiChip = 5, uiSeg = 0 // uiExtComTxd17: uiChip = 5, uiSeg = 1 // uiExtComRxd18: uiChip = 5, uiSeg = 2 // uiExtComTxd18: uiChip = 5, uiSeg = 3 // uiExtComRxd19: uiChip = 5, uiSeg = 4 // uiExtComTxd19: uiChip = 5, uiSeg = 5 // uiExtComRxd20: uiChip = 5, uiSeg = 6 // uiExtComTxd20: uiChip = 5, uiSeg = 7 // // uiExtComRxd21: uiChip = 6, uiSeg = 0 // uiExtComTxd21: uiChip = 6, uiSeg = 1 // uiExtComRxd22: uiChip = 6, uiSeg = 2 // uiExtComTxd22: uiChip = 6, uiSeg = 3 // uiExtComRxd23: uiChip = 6, uiSeg = 4 // uiExtComTxd23: uiChip = 6, uiSeg = 5 // uiExtComRxd24: uiChip = 6, uiSeg = 6 // uiExtComTxd24: uiChip = 6, uiSeg = 7 // // uiExtComRxd25: uiChip = 7, uiSeg = 0 // uiExtComTxd25: uiChip = 7, uiSeg = 1 // uiExtComRxd26: uiChip = 7, uiSeg = 2 // uiExtComTxd26: uiChip = 7, uiSeg = 3 // uiExtComRxd27: uiChip = 7, uiSeg = 4 // uiExtComTxd27: uiChip = 7, uiSeg = 5 // uiExtComRxd28: uiChip = 7, uiSeg = 6 // uiExtComTxd28: uiChip = 7, uiSeg = 7 // // uiExtComRxd29: uiChip = 8, uiSeg = 0 // uiExtComTxd29: uiChip = 8, uiSeg = 1 // uiExtComRxd30: uiChip = 8, uiSeg = 2 // uiExtComTxd30: uiChip = 8, uiSeg = 3 // uiExtComRxd31: uiChip = 8, uiSeg = 4 // uiExtComTxd31: uiChip = 8, uiSeg = 5 // uiExtComRxd32: uiChip = 8, uiSeg = 6 // uiExtComTxd32: uiChip = 8, uiSeg = 7
// 从实际串口接收缓冲中读取数据到指定的低端RAM缓冲; // 返回实际转移的字数;读取长度为0、实际缓冲内容为空、数据长度大于32K字,返回0; UINT uiReadDataExtComRxd(UINT uiComNo, UINT *uiBuffer, UINT uiLen) // 需要发给网络的数据 { UINT uiChip, uiSeg, uiTotalWords, uiFirstRead, uiActualReadWords; // 外部程序完成 // vCloseComInterrupt(uiComNo); // 关闭当前串口的中断 // uiChip = uiComNo / 4 + 1; // uiComNo从cnCom1到cnCom32 uiChip = (uiComNo >> 2) + 1; // uiComNo从cnCom1到cnCom32 // uiSeg = 2 * (uiComNo % 4); // 0、2、4、6 uiSeg = ((uiComNo % 4) << 1); // 0、2、4、6
// // 从扩展RAM中读取数据到缓冲uiBuffer, 长度为uiLen, 片选uiChip, 段地址uiSeg, 偏移地址uiOffset // void vReadExtRam(UINT uiChip, UINT uiSeg, UINT uiOffset, UINT uiBuffer, UINT uiLen)
// 指定的长度为0、实际缓冲内容为空、数据长度大于32K字 if (uiLen == 0 || uiComRealRecvWordUse[uiComNo] == uiComRealRecvWordPtr[uiComNo] || uiLen > 0x8000) { if (uiComRealRecvWordPtr[uiComNo]) { uiComRealRecvWordUse[uiComNo] = 0; uiComRealRecvWordPtr[uiComNo] = 0; } uiActualReadWords = 0; // 无数据、数据长度错误 } else if (uiComRealRecvWordUse[uiComNo] < uiComRealRecvWordPtr[uiComNo]) // 当使用指针小于接收指针时(无环回数据) { uiTotalWords = uiComRealRecvWordPtr[uiComNo] - uiComRealRecvWordUse[uiComNo]; // 计算有效数据 if (uiTotalWords >= uiLen) // 数据够长,一次性读取所有内容 { vReadExtRam(uiChip, uiSeg, uiComRealRecvWordUse[uiComNo], (UINT)uiBuffer, uiLen); uiComRealRecvWordUse[uiComNo] = uiComRealRecvWordUse[uiComNo] + uiLen; uiActualReadWords = uiLen; // 实际转移的数据长度 } else // 数据不足,仅读取有效的内容 { vReadExtRam(uiChip, uiSeg, uiComRealRecvWordUse[uiComNo], (UINT)uiBuffer, uiTotalWords); uiComRealRecvWordUse[uiComNo] = uiComRealRecvWordUse[uiComNo] + uiTotalWords; uiActualReadWords = uiTotalWords; // 实际转移的数据长度 } } else // 当使用指针大于接收指针时(有环回数据) { uiFirstRead = cnComRealRecvBufWordSize - uiComRealRecvWordUse[uiComNo]; // 首次(可以)读取的字数 uiTotalWords = uiFirstRead + uiComRealRecvWordPtr[uiComNo]; // 计算有效数据
if (uiLen <= uiFirstRead) // 需要的长度小于等于首次(可以)读取的字数,一次性读取所有内容 { vReadExtRam(uiChip, uiSeg, uiComRealRecvWordUse[uiComNo], (UINT)uiBuffer, uiLen); uiComRealRecvWordUse[uiComNo] = uiComRealRecvWordUse[uiComNo] + uiLen; uiActualReadWords = uiLen; // 实际转移的数据长度 } else // 需要的长度数据发生环回,分次读取 { if (uiTotalWords >= uiLen) // 数据够长,分次读取所有内容 { vReadExtRam(uiChip, uiSeg, uiComRealRecvWordUse[uiComNo], (UINT)uiBuffer, uiFirstRead); uiComRealRecvWordUse[uiComNo] = 0; vReadExtRam(uiChip, uiSeg, 0, (UINT)uiBuffer + uiFirstRead, uiLen - uiFirstRead); uiComRealRecvWordUse[uiComNo] = uiLen - uiFirstRead; uiActualReadWords = uiLen; // 实际转移的数据长度 } else // 数据不足,仅读取有效的内容 { vReadExtRam(uiChip, uiSeg, uiComRealRecvWordUse[uiComNo], (UINT)uiBuffer, uiFirstRead); uiComRealRecvWordUse[uiComNo] = 0; vReadExtRam(uiChip, uiSeg, 0, (UINT)uiBuffer + uiFirstRead, uiTotalWords - uiFirstRead); uiComRealRecvWordUse[uiComNo] = uiTotalWords - uiFirstRead; uiActualReadWords = uiTotalWords; // 实际转移的数据长度 } } }
// 外部程序完成 // vOpenComInterrupt(uiComNo); // 打开当前串口的中断 return uiActualReadWords; // 返回实际读取的字数 }
// 从实际串口发送缓冲中读取数据到指定的低端RAM缓冲; // 返回实际转移的字数;读取长度为0、实际缓冲内容为空、数据长度大于32K字,返回0; UINT uiReadDataExtComTxd(UINT uiComNo, UINT *uiBuffer, UINT uiLen) // 需要发给串口的数据 { UINT uiChip, uiSeg, uiTotalWords, uiFirstRead, uiActualReadWords;
// 外部程序完成 // vCloseComInterrupt(uiComNo); // 关闭指定串口的中断
// uiChip = uiComNo / 4 + 1; // uiComNo从cnCom1到cnCom32 uiChip = (uiComNo >> 2) + 1; // uiComNo从cnCom1到cnCom32 // uiSeg = 2 * (uiComNo % 4) + 1; // 1、3、5、7 uiSeg = ((uiComNo % 4) << 1) + 1; // 0、2、4、6
// // 从扩展RAM中读取数据到缓冲uiBuffer, 长度为uiLen, 片选uiChip, 段地址uiSeg, 偏移地址uiOffset // void vReadExtRam(UINT uiChip, UINT uiSeg, UINT uiOffset, UINT uiBuffer, UINT uiLen) // 指定的长度为0、实际缓冲内容为空、数据长度大于32K字 if (uiLen == 0 || uiComRealSendWordUse[uiComNo] == uiComRealSendWordPtr[uiComNo] || uiLen > 0x8000) { // if (uiComRealSendWordPtr[uiComNo]) ?????????????? { uiComRealSendWordUse[uiComNo] = 0; uiComRealSendWordPtr[uiComNo] = 0; } uiActualReadWords = 0; // 无数据、数据长度错误 } else if (uiComRealSendWordUse[uiComNo] < uiComRealSendWordPtr[uiComNo]) // 当使用指针小于接收指针时(无环回数据) { uiTotalWords = uiComRealSendWordPtr[uiComNo] - uiComRealSendWordUse[uiComNo]; // 计算有效数据 if (uiTotalWords >= uiLen) // 数据够长,一次性读取所有内容 { vReadExtRam(uiChip, uiSeg, uiComRealSendWordUse[uiComNo], (UINT)uiBuffer, uiLen); uiComRealSendWordUse[uiComNo] = uiComRealSendWordUse[uiComNo] + uiLen; uiActualReadWords = uiLen; // 实际转移的数据长度 } else // 数据不足,仅读取有效的内容 { vReadExtRam(uiChip, uiSeg, uiComRealSendWordUse[uiComNo], (UINT)uiBuffer, uiTotalWords); uiComRealSendWordUse[uiComNo] = uiComRealSendWordUse[uiComNo] + uiTotalWords; uiActualReadWords = uiTotalWords; // 实际转移的数据长度 } } else // 当使用指针大于接收指针时(有环回数据) { uiFirstRead = cnComRealSendBufWordSize - uiComRealSendWordUse[uiComNo]; // 首次(可以)读取的字数 uiTotalWords = uiFirstRead + uiComRealSendWordPtr[uiComNo]; // 计算有效数据
if (uiLen <= uiFirstRead) // 需要的长度小于等于首次(可以)读取的字数,一次性读取所有内容 { vReadExtRam(uiChip, uiSeg, uiComRealSendWordUse[uiComNo], (UINT)uiBuffer, uiLen); uiComRealSendWordUse[uiComNo] = uiComRealSendWordUse[uiComNo] + uiLen; uiActualReadWords = uiLen; // 实际转移的数据长度 } else // 需要的长度数据发生环回,分次读取 { // 读取缓冲尾部的数据,首次(可以)读取的字数 vReadExtRam(uiChip, uiSeg, uiComRealSendWordUse[uiComNo], (UINT)uiBuffer, uiFirstRead); uiComRealSendWordUse[uiComNo] = 0; // 然后读取缓冲开始的数据 if (uiTotalWords >= uiLen) // 数据够长,分次读取所有内容 { vReadExtRam(uiChip, uiSeg, 0, (UINT)uiBuffer + uiFirstRead, uiLen - uiFirstRead); uiComRealSendWordUse[uiComNo] = uiLen - uiFirstRead; uiActualReadWords = uiLen; // 实际转移的数据长度 } else // 数据不足,仅读取有效的内容 { vReadExtRam(uiChip, uiSeg, 0, (UINT)uiBuffer + uiFirstRead, uiTotalWords - uiFirstRead); uiComRealSendWordUse[uiComNo] = uiTotalWords - uiFirstRead; uiActualReadWords = uiTotalWords; // 实际转移的数据长度 } } } // 外部程序完成 // vOpenComInterrupt(uiComNo); // 打开指定串口的中断 return uiActualReadWords; // 返回实际读取的字数 }
// 将低端RAM缓冲中的数据写入实际串口接收缓冲; // 返回实际转移的字数;写入长度为0、大于32K字,返回0; // 写入的长度大于剩余空间时,旧数据将被覆盖 UINT uiWriteDataExtComRxd(UINT uiComNo, UINT *uiBuffer, UINT uiLen) // 准备发给网络的数据 { UINT uiChip, uiSeg, uiLeftWords, uiActualWriteWords; // 外部程序完成 // vCloseComInterrupt(uiComNo); // 关闭当前串口的中断
// uiChip = uiComNo / 4 + 1; // uiComNo从cnCom1到cnCom32 uiChip = (uiComNo >> 2) + 1; // uiComNo从cnCom1到cnCom32 // uiSeg = 2 * (uiComNo % 4); // 0、2、4、6 uiSeg = ((uiComNo % 4) << 1); // 0、2、4、6 // // 将缓冲uiBuffer中的数据写入扩展RAM, 长度为uiLen, 片选uiChip, 段地址uiSeg, 偏移地址uiOffset // void vWriteExtRam(UINT uiChip, UINT uiSeg, UINT uiOffset, UINT uiBuffer, UINT uiLen)
// 指定的长度为0、数据长度大于32K字 if (uiLen == 0 || uiLen > 0x8000) uiActualWriteWords = 0; // 无数据、数据长度错误 else { uiLeftWords = cnComRealRecvBufWordSize - uiComRealRecvWordPtr[uiComNo]; // 计算剩余数据空间(正方向)
if (uiLen <= uiLeftWords) // (正方向)剩余空间大于需要的空间,一次写入 { vWriteExtRam(uiChip, uiSeg, uiComRealRecvWordPtr[uiComNo], (UINT)uiBuffer, uiLen); uiComRealRecvWordPtr[uiComNo] += uiLen; } else // (正方向)剩余空间小于需要的空间,分两次写入; 循环覆盖 { vWriteExtRam(uiChip, uiSeg, uiComRealRecvWordPtr[uiComNo], (UINT)uiBuffer, uiLeftWords); vWriteExtRam(uiChip, uiSeg, 0, (UINT)uiBuffer + uiLeftWords, uiLen - uiLeftWords); uiComRealRecvWordPtr[uiComNo] = uiLen - uiLeftWords; }
uiActualWriteWords = uiLen; // 实际转移的数据长度 }
// 外部程序完成 // vOpenComInterrupt(uiComNo); // 打开当前串口的中断 return uiActualWriteWords; // 返回实际读取的字数 }
// 将低端RAM缓冲中的数据写入实际串口发送缓冲; // 返回实际转移的字数;写入长度为0、大于32K字,返回0; // 写入的长度大于剩余空间时,旧数据将被覆盖 UINT uiWriteDataExtComTxd(UINT uiComNo, UINT *uiBuffer, UINT uiLen) // 准备发给串口的数据 { UINT uiChip, uiSeg, uiLeftWords, uiActualWriteWords; // 外部程序完成 // vCloseComInterrupt(uiComNo); // 关闭当前串口的中断 // uiChip = uiComNo / 4 + 1; // uiComNo从cnCom1到cnCom32 uiChip = (uiComNo >> 2) + 1; // uiComNo从cnCom1到cnCom32 // uiSeg = 2 * (uiComNo % 4) + 1; // 1、3、5、7 uiSeg = ((uiComNo % 4) << 1) + 1; // 0、2、4、6 // // 将缓冲uiBuffer中的数据写入扩展RAM, 长度为uiLen, 片选uiChip, 段地址uiSeg, 偏移地址uiOffset // void vWriteExtRam(UINT uiChip, UINT uiSeg, UINT uiOffset, UINT uiBuffer, UINT uiLen) // 指定的长度为0、数据长度大于32K字 if (uiLen == 0 || uiLen > 0x8000) uiActualWriteWords = 0; // 无数据、数据长度错误 else { uiLeftWords = cnComRealSendBufWordSize - uiComRealSendWordPtr[uiComNo]; // 计算剩余数据空间(正方向)
if (uiLen <= uiLeftWords) // (正方向)剩余空间大于需要的空间,一次写入 { vWriteExtRam(uiChip, uiSeg, uiComRealSendWordPtr[uiComNo], (UINT)uiBuffer, uiLen); uiComRealSendWordPtr[uiComNo] += uiLen; } else // (正方向)剩余空间小于需要的空间,分两次写入; 循环覆盖 { vWriteExtRam(uiChip, uiSeg, uiComRealSendWordPtr[uiComNo], (UINT)uiBuffer, uiLeftWords); vWriteExtRam(uiChip, uiSeg, 0, (UINT)uiBuffer + uiLeftWords, uiLen - uiLeftWords); uiComRealSendWordPtr[uiComNo] = uiLen - uiLeftWords; }
uiActualWriteWords = uiLen; // 实际转移的数据长度 } // 外部程序完成 // vOpenComInterrupt(uiComNo); // 打开当前串口的中断 return uiActualWriteWords; // 返回实际读取的字数 }
|