网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: TI德州中文网 >> 技术文库 >> C5000文章 >> TMS320C54x >> 正文
  TMS320VC5416内存使用(CCS编程范例)           ★★★ 【字体:
TMS320VC5416内存使用(CCS编程范例)
作者:TIchines…    文章来源:本站原创    点击数:    更新时间:2006-12-1    

//////////////////////////////////////////////////////

#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; // 返回实际读取的字数
}

欢迎点击进入:"61IC中国电子在线"官方网站     文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    TMS320VC5416内部ROM中的BOO
    TMS320VC5416与TLC16C554的接
    TMS320VC5416扩展内存使用的
    TMS320VC5416内部ROM中的BOO
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    站长:TC 湘ICP备06016957号