⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 savemem.c

📁 在vxWorks环境下, 将嵌入式系统的内存倒到HOST的源代码, 便于分析比较
💻 C
字号:
/*****************************************************************************
 * 版权所有(C) 2006, ZTE Corp. WiMAX
 *----------------------------------------------------------------------------
 * 模 块 名 : BSP
 * 文件名称 : savemem.c
 * 文件标识 : {[N/A]}
 * 内容摘要 : 本文件用于测试之目的, 在于将单板上内存中的数据保存到后台HOST
 * 注意事项 : 独立性较强, 包含路径都在系统目录下, 配置数据在头部
 * 作    者 : 田瑞忠
 * 创建日期 : 2006-3-14
 * 当前版本 : Ver1.0
 *----------------------------------------------------------------------------
 * 变更记录 :
 *
 * $记录1
 * 变 更 单: $0000000(N/A)
 * 责 任 人: 田瑞忠
 * 修改日戳: 2006-3-14
 * 变更说明: 创建文件
 *
 *----------------------------------------------------------------------------
 */

/*
#define OK              0
#define ERROR           -1
#define NULL            (void *)0
#define TRUE            0xffffffff
#define FTP_COMPLETE    2
*/

#include "vxWorks.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include "ioLib.h"
#include "ftpLib.h"

static char ftpServerName[80] = "";
static char ftpUserName[40] = "";
static char ftpUserPwd[40] = "";

extern char *sysBootLine;

#define FTP_SERVER      ftpServerName
#define FTP_USER        ftpUserName
#define FTP_PWD         ftpUserPwd
#define MSG_LOW         printf
#define SUCCESS         0
#define FAILURE         0xffffffff

ULONG getDwordData(void *p)    {   return (ULONG)(*(ULONG *)p);     }
ULONG getWordData(void *p)     {   return (ULONG)(*(USHORT *)p);    }
ULONG getByteData(void *p)     {   return (ULONG)(*(UCHAR *)p);     }  
ULONG getNoneData(void *p)     {   return 0;                        }

static ULONG (*pGetDataFun[5])(void *) = {
    getNoneData,
    getByteData,
    getWordData,
    getNoneData,
    getDwordData,
};

/*****************************************************************************
 *  函数名称   : initCheck(*)
 *  功能描述   : 初始化检查, 用于得到启动行参数中宿主机名用FTP用户名密码
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : 无
 *  输出参数   : 无
 *  返 回 值   : 无
 *  其它说明   : 无
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-10-24 16:27, 创建函数,
 *----------------------------------------------------------------------------
 */
static void initCheck(void)
{
    static int initialized = 0;
    
    int     iTemp;
    char    *p;

    if (initialized)    return;
    
    p = strstr(sysBootLine, "h=") + 2;
    for (iTemp = 0; iTemp < 79 && p[iTemp] != ' '; iTemp++)
        ftpServerName[iTemp] = p[iTemp];
    ftpServerName[iTemp] = 0;

    p = strstr(sysBootLine, "u=") + 2;
    for (iTemp = 0; iTemp < 39 && p[iTemp] != ' '; iTemp++)
        ftpUserName[iTemp] = p[iTemp];
    ftpUserName[iTemp] = 0;

    p = strstr(sysBootLine, "pw=") + 3;
    for (iTemp = 0; iTemp < 39 && p[iTemp] != ' '; iTemp++)
        ftpUserPwd[iTemp] = p[iTemp];
    ftpUserPwd[iTemp] = 0;

    printf("FTP server: %s, User %s, Pwd %s.\n", ftpServerName, ftpUserName, ftpUserPwd);
                
    initialized = 1;
} /* initCheck() */

/*****************************************************************************
 *  函数名称   : GetFileFromHost(*)
 *  功能描述   : 从宿主机上下载文件
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : pcFile_Name- 要下载的文件名
                 pucBuf     - 下载文件存储位置
                 dwBufSize  - 缓存区空间大小
 *  输出参数   : pucBuf     - 下载的文件
 *  返 回 值   : 文件的字节数
 *  其它说明   : 无
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-3-14 09:35, 创建函数,
 *----------------------------------------------------------------------------
 */
ULONG GetFileFromHost(char *pcFile_Name, UCHAR *pucBuf, ULONG dwBufSize)
{
    int         iFd = 0;
    int         iFtpCtrFd = 0;
    int         iReadCount = 1;
    int         iBufLen = (int)dwBufSize;
    UCHAR        *pucRead = NULL;

    initCheck();

    /*------------------------------------------------------------------------
     * 打开 FTP 设备进行文件传输 */
    if (ERROR == ftpXfer(FTP_SERVER, FTP_USER, FTP_PWD, "",
        "RETR %s", "", pcFile_Name, &iFtpCtrFd, &iFd))
    {
        MSG_LOW("Fail to get source file %s.\n",
            (ULONG)pcFile_Name, 0, 0, 0, 0, 0);
        return FAILURE;
    } /* if (ERROR == ftpXfer(...)) */

    /*------------------------------------------------------------------------
     * 循环读取版本数据 */
    for (pucRead = pucBuf; iBufLen > 0 && iReadCount > 0; )
    {
        iReadCount = read(iFd, (char *)pucRead, iBufLen);
        iBufLen -= iReadCount;
        pucRead += iReadCount;
    } /* for (pucRead = pucVerData; iReadCount > 0; ...) */

    /*------------------------------------------------------------------------
     * 如果读取失败, 给出出错提示, 释放申请的缓存后返回 */
    if (ERROR == iReadCount)
    {
        MSG_LOW("Fail to read source file %s.\n",
            (ULONG)pcFile_Name, 0, 0, 0, 0, 0);
        return FAILURE;
    } /* if (ERROR == iReadCount) */

    close(iFd);

    /*------------------------------------------------------------------------
     * 通过 FTP 传输读取版本, 要关闭 FTP 设备 */
    if (0 != iFtpCtrFd)
    {
        /*--------------------------------------------------------------------
         * 以前曾有使用 ftpReplyGet() 函数以获取 FTP 传输结果是否到文件尾
         * 但该系统函数执行非常耗时(约0.3秒), 且非必不可少的步骤, 在此省略
         * 田瑞忠 @2005-10-08 16:58
         *--------------------------------------------------------------------
         * 退出 FTP 连接 */
        if (FTP_COMPLETE !=
            ftpCommand(iFtpCtrFd, "QUIT", 0, 0, 0, 0, 0, 0))
        {
            MSG_LOW("Quit FTP error!\n", 0, 0, 0, 0, 0, 0);
        } /* if (FTP_COMPLETE != ftpCommand(...)) */

        close(iFtpCtrFd);
    } /* if (0 != iFtpCtrFd) */

    return (pucRead - pucBuf);
} /* GetFileFromHost() */

/*****************************************************************************
 *  函数名称   : PutToHostFile(*)
 *  功能描述   : 将数据保存到宿主机文件
 *  读全局变量 : 无
 *  写全局变量 : 无
 *  输入参数   : pcFile_Name- 要保存的文件名
                 pucBuf     - 数据存储位置
                 dwBufSize  - 数据大小
                 dwMode     - 保存的模式: 0, 二进制文件(默认)
                                          1, 单字节HEX文本
                                          2, 双字节HEX文本
                                          4, 四字节HEX文本
                                          其它, 非法
 *  输出参数   : 无
 *  返 回 值   : 文件的字节数
 *  其它说明   : 无
 *----------------------------------------------------------------------------
 * 历史记录(变更单, 责任人@修改日期, 操作说明)
 *  $0000000(N/A), 田瑞忠@2006-3-14 09:36, 创建函数,
 *----------------------------------------------------------------------------
 */
ULONG PutToHostFile(char *pcFile_Name, 
                     UCHAR *pucBuf, 
                     ULONG dwBufSize, 
                     ULONG dwMode)
{
    int         iFd = 0;
    int         iFtpCtrFd = 0;
    ULONG      dwWriteCount;
    char        *strFileName = pcFile_Name;

    initCheck();

    /*------------------------------------------------------------------------
     * 文件名更正 */
    if (0 != dwMode)
    {
        strFileName = (char *)malloc(strlen(pcFile_Name) + 4);
        
        /*--------------------------------------------------------------------
         * 成功申请内存, 则拷贝文件名到新的缓存 */
        if (NULL != strFileName)
        {
            strcpy(strFileName, pcFile_Name);
            /*----------------------------------------------------------------
             * 是合法的文件名, 则将扩展类型名变更为".c" */
            if (NULL != strchr(strFileName, '.'))
            {
                strchr(strFileName, '.')[0] = '\0';
                strcat(strFileName, ".c");
            } /* 修改文件扩展名 */
        } /* 保存文件名 */
        else
        {
            strFileName = pcFile_Name;
        } /* 使用原来的文件名 */
    } /* 文件名更正 */

    /*------------------------------------------------------------------------
     * 打开 FTP 设备进行文件传输 */
    if (ERROR == ftpXfer(FTP_SERVER, FTP_USER, FTP_PWD, "",
        "STOR %s", "", strFileName, &iFtpCtrFd, &iFd))
    {
        MSG_LOW("Fail to create dest file %s.\n",
            (ULONG)strFileName, 0, 0, 0, 0, 0);
        /* 释放文件名内存空间 */
        if (pcFile_Name != strFileName)
        {
            free(strFileName);
        } /* 释放文件名内存空间 */
        return FAILURE;
    } /* if (ERROR == ftpXfer(...)) */

    /*------------------------------------------------------------------------
     * 发送内存数据 */
    if (0 == dwMode)
    {
        dwWriteCount = (ULONG)write(iFd, (char *)pucBuf, dwBufSize);
    } /* if (0 == dwMode) */
    else
    {
        UCHAR    *strWrite = NULL;

        /*--------------------------------------------------------------------
         * 申请保存字符串的内存 */
        if (NULL == (strWrite =(UCHAR *)malloc(2048)))
        {
            dwWriteCount = 0;
            MSG_LOW("Fail to get temp memory for write dest file %s.\n",
                (ULONG)strFileName, 0, 0, 0, 0, 0);
        } /* 未未成功申请内存 */
        else /* 将数据转换为HEX字符串后再存为文件 */
        {
            int  iCount = 0;
            int  iSprnC = 0;
            
            iSprnC += sprintf((char *)strWrite + iSprnC, "/* %s data array: */"
                "\nunsigned char Verdata[] = {\n    ", strFileName);
                
            /*----------------------------------------------------------------
             * 参数正确性更正 */
            if (5 <= dwMode)
            {
                dwMode = 1;
            } /* 参数正确性更正 */
            
            /*----------------------------------------------------------------
             * 逐单元打印到缓存中并存入文件 */
            for (iCount = 0; iCount < dwBufSize; iCount += dwMode)
            {
                iSprnC += sprintf((char *)strWrite + iSprnC, "0x%0*x, ", 
                    dwMode * 2, pGetDataFun[dwMode](pucBuf + iCount));
                /* 每打印16个字节, 换一行(最后一个字节不换行) */
                if (((16 - dwMode) == (iCount % 16)) && 
                    (iCount < dwBufSize - 1))
                {
                    iSprnC += sprintf((char *)strWrite + iSprnC, "\n    ");
                } /* 回车换行 */
                /* 如果数据足够多(多保留点内存), 则将它写入文件 */
                if (iSprnC > 1960)
                {
                    dwWriteCount = (ULONG)write(iFd, (char *)strWrite, iSprnC);
                    /* 如果发生写入错误则退出 */
                    if (dwWriteCount != iSprnC)
                    {
                        break;
                    } /* 异常退出 */
                    iSprnC = 0;
                } /* 写入到文件之中 */
            } /* 逐单元打印到缓存中并存入文件 */
            
            iSprnC += sprintf((char *)strWrite + iSprnC, "\n};\n"
                "unsigned long   VerSize = %ld;", iCount);
            dwWriteCount = (ULONG)write(iFd, (char *)strWrite, iSprnC);
    
            free(strWrite);
            
            /*----------------------------------------------------------------
             * 校正是否写完全 */
            if (dwWriteCount != iSprnC)
            {
                dwWriteCount = 0;
            } /* 没写完全, 出错 */
            else
            {
                dwWriteCount = iCount;
            } /* 写完全, 则将写入长度改为数据字节数 */
        } /* if (NULL != (strWrite = malloc(2048))) */
        
    } /* if (0 != dwMode) */
    
    /*------------------------------------------------------------------------
     * 如果发送失败, 给出出错提示后返回 */
    if (dwBufSize != dwWriteCount)
    {
        MSG_LOW("Fail to write dest file %s.\n",
            (ULONG)strFileName, 0, 0, 0, 0, 0);
        /* 释放文件名内存空间 */
        if (pcFile_Name != strFileName)
        {
            free(strFileName);
        } /* 释放文件名内存空间 */
        return FAILURE;
    } /* if (dwBufSize != dwWriteCount) */

    close(iFd);

    /*------------------------------------------------------------------------
     * 通过 FTP 传输读取版本, 要关闭 FTP 设备 */
    if (0 != iFtpCtrFd)
    {
        /*--------------------------------------------------------------------
         * 等待传输真正结束, 期望到文件尾 */
        if (FTP_COMPLETE != ftpReplyGet(iFtpCtrFd, TRUE))
        {
            MSG_LOW("Transfer file error!\n", 0, 0, 0, 0, 0, 0);
        } /* 等待传输真正结束 */
                
        /*--------------------------------------------------------------------
         * 退出 FTP 连接 */
        if (FTP_COMPLETE !=
            ftpCommand(iFtpCtrFd, "QUIT", 0, 0, 0, 0, 0, 0))
        {
            MSG_LOW("Quit FTP error!\n", 0, 0, 0, 0, 0, 0);
        } /* if (FTP_COMPLETE != ftpCommand(...)) */

        close(iFtpCtrFd);
    } /* if (0 != iFtpCtrFd) */

    /*------------------------------------------------------------------------
     * 释放文件名内存空间 */
    if (pcFile_Name != strFileName)
    {
        free(strFileName);
    } /* 释放文件名内存空间 */

    return dwWriteCount;
} /* PutToHostFile() */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -