首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 多线程加密文件(结合硬件算法引擎)如何实现。
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gongchaoxiong
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-20 15:55:37 楼主
    两组8311芯片,分别负责向FPGA的FIFO IN和FIFO OUT读写数据。
    结构图如下:
    PLX 8311 IN -------FIFO_IN-------SMS4算法引擎------FIFO_OUT----PLX 8311 OUT

    过程描述:
    PLX 8311 IN 通过DMA通道发送明文到FPGA的FIFO_IN队列中,当FIFO_IN队列中有128BITS数据的时候,SMS4硬件算法引擎就将数据取出加密,然后放到FIFO_OUT队列中。PLX 8311 OUT通过DMA通道将加密后的明文读出。
    参数说明:
    1、FPGA状态寄存器说明,如下表。

    8 7 6 5 4 3 2 1 0
    busy Empty_0 Full_0 AllmostEmpty_0 AllmostFull_0 Empty_1 Full_1 AllmostEmpty_1 AllmostFull_1
    Busy:SMS4算法引擎是否忙(1为忙)。
    Empty_0 :表示FPGA中的FIFO_IN是否为空(1为空)。
    AllmostEmpty_0:表示FIFO_IN是否为半空(1为半空,表示数据小于等于容量的一半)
    Full_0:表示FIFO_IN是否为满(1为满)
    AllmostFull_0:表示FIFO_IN是否为半满(1为半满,表示数据大于等于容量的一办)
    其他参数表示FIFO_OUT的状态,说明同FIFO_IN.。
    2、FIFO_IN和FIFO_OUT的容量为4KBYTES。
    功能要求:
    A线程:读FPGA的状态寄存器的值,检测FIFO_IN的状态,是否为空(或者半空)。
    如果为空(或者半空),则向FIFO_IN中写入数据。
    B线程:读FPGA的状态寄存器的值,检测FIFO_OUT的状态,是否为满(或者半满)。如果为满(或者半满),则从FIFO_OUT中读出数据。
    每次读写之前都要判断寄存器的状态,读写可以并行进行,比如在第一个4KBYTES数据全部加密完成之后,在B线程读数据的同时,A线程可以同时写数据。
    请问如何用多线程的思想实现上述功能?完成加密文件操作。使用VC++6.0实现。
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Virget
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-20 16:07:171楼 得分:0
    这个不难,但是一定要考虑共享数据段的实用权限。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fangzheng2008
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-13 14:42:262楼 得分:0

    //线程A
    DWORD ThreadA(WPARAM wParam,LPARAM lParam)
    {
        while(TRUE)
        {
            if(WaitForSingleObject(m_stopEvent,100)==WAIT_OBJECT_0) //m_stopEvent为停止事件
                break;
           
            int ret= WaitForSingleObject(m_WriteFIFOEvent,100);//m_WriteFIFOEvent为向FIFO_IN中写事件
            if(ret==WAIT_OBJECT_0)
            {
                WriteFIFO();  //向FIFO_IN中写数据函数       
            }
        }
        return 0;
    }


    //线程B
    DWORD ThreadB(WPARAM wParam,LPARAM lParam)
    {
        while(TRUE)
        {
            if(WaitForSingleObject(m_stopEvent,100)==WAIT_OBJECT_0) //m_stopEvent为停止事件
                break;
           
            int ret= WaitForSingleObject(m_ReadFIFOEvent,100);//m_ReadFIFOEvent为向FIFO_IN中读事件
              if(ret==WAIT_OBJECT_0)
            {
                ReadFIFO();  //向FIFO_IN中读数据函数       
            }
        }
        return 0;
    }

    //线程C  与状态寄存器作逻辑运算
    DWORD ThreadC(WPARAM wParam,LPARAM lParam)
    {
        while(TRUE)
        {
            if(WaitForSingleObject(m_stopEvent,100)==WAIT_OBJECT_0) //m_stopEvent为停止事件
                break;
           
            if(PSW & 0x010000000==0x010000000 || PSW & 0x000100000==0x000100000) //PSW是状态寄存器
                SetEvent(m_ReadFIFOEvent);
           
            if(PSW & 0x001000000==0x001000000 || PSW & 0x000010000==0x000010000)//PSW是状态寄存器
                SetEvent(m_WriteFIFOEvent);
        }
        return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fangzheng2008
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-10-13 14:44:313楼 得分:0
    线程C 修改如下

    //线程C  与状态寄存器作逻辑运算
    DWORD ThreadC(WPARAM wParam,LPARAM lParam)
    {
        while(TRUE)
        {
            if(WaitForSingleObject(m_stopEvent,100)==WAIT_OBJECT_0) //m_stopEvent为停止事件
                break;
           
            if(PSW & 0x010000000==0x010000000 || PSW & 0x000100000==0x000100000) //PSW是状态寄存器
                SetEvent(m_ReadFIFOEvent);
            else
              ResetEvent(m_ReadFIFOEvent);
           
            if(PSW & 0x001000000==0x001000000 || PSW & 0x000010000==0x000010000)//PSW是状态寄存器
                SetEvent(m_WriteFIFOEvent);
            else
              ResetEvent(m_WriteFIFOEvent);

        }
        return 0;
    }
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved