2972|0

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

omapl138共享内存,数据传输问题 [复制链接]

我有关于omapl138共享内存,数据传输问题,请教。
1.
it can't write immediately to shared ram.
code list delow:
static bool server_upp_data_transfer(Server *server) {
if(server->ad_started == false) return true;
    while (ListMP_empty(server->list_free))  /* wait */
        Task_sleep(10000);
    DataNode *node = (DataNode *)ListMP_getTail(server->list_free); /* get free node */
    int *data = (int *)SharedRegion_getPtr(node->SR_buffer);
    server->transposeParA.WindowAddress     = (unsigned int *)data;  /* set taget */
    server->transposeParA.LineCount   = node->buffer_height;
    server->transposeParA.ByteCount   = node->buffer_pitch;
    server->transposeParA.LineOffsetAddress = node->buffer_pitch;
    upp_error_count = 0;
    upp_dmai_int_cut = 0;
    /* fill in data */
    uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
    /* wait */
    while (upp_dmai_int_cut < 1 && upp_error_count == 0);
    if (upp_error_count != 0) {
        LOG_ERROR("data mismatch in buffers");
        LOG_ERROR("upp_error_count=%d",upp_error_count);
    }
    /* make data node in busy list */
    ListMP_putHead(server->list_busy, (ListMP_Elem *)node);
    return true;
}
......................................................
2.
我的程序是:
            dsp:通过dma方式“uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA)”从upp_A口读入数据48kB数据,存在共享内存中(起始地址0xc200-0000,共20块,块大小16KB,);
            arm:从共享内存中读取数据,写入disk。
           问题:共享内存块中出现的数据,与我从upp口送入的数据不一致,且数量有缺少。
           不知什么原因?烦请帮忙分析一下。
          代码如下:
         1)、arm申请共享内存块:

    /* heap for malloc list node */
    IHeap_Handle heap_node = (IHeap_Handle)SharedRegion_getHeap(SYS_CFG_SR_ID_LIST_HEAP);
    /* heap for malloc buffer for upp data */
    IHeap_Handle heap_data = (IHeap_Handle)SharedRegion_getHeap(SYS_CFG_SR_ID_UPP_HEAP);
    /* create data nodes */
    DataNode *nodes[SYS_CFG_LIST_NODES];
    int i;
    for (i = 0; i < SYS_CFG_LIST_NODES; i++) {
        DataNode *node = (DataNode *)Memory_alloc(heap_node, sizeof(DataNode), 0, NULL);
        UInt32* data = (UInt32 *)Memory_alloc(heap_data, SR_BUFFER_SIZE, 0, NULL);
        node->SR_buffer = SharedRegion_getSRPtr(data, SYS_CFG_SR_ID_UPP_HEAP);
        node->size = SR_BUFFER_SIZE;
        node->buffer_pitch = BUFFER_PITCH;
        node->buffer_height = BUFFER_HEIGHT;
        nodes = node;
    }
    /* create free list */
    ListMP_Params params_list;
    ListMP_Params_init(¶ms_list);
    params_list.name = SYS_CFG_LIST_FREE;
    params_list.regionId = SYS_CFG_SR_ID_LIST_HEAP;
    ListMP_Handle list_free = ListMP_create(¶ms_list);
    for (i = 0; i < SYS_CFG_LIST_NODES; i++)   /* init free list */
  ListMP_putHead(list_free, (ListMP_Elem *)nodes);
    /* create busy list */
    params_list.name = SYS_CFG_LIST_BUSY;
    ListMP_Handle list_busy = ListMP_create(¶ms_list);

2)、arm等待数据块有效,并写入disk:

  /* get upp data from busy list and save them to file */
    while (! quit) {
        while (ListMP_empty(list_busy) && ! quit)  // wait data
            usleep(1000);
        if (quit)
            continue;
        /* get data node */
        DataNode *node = (DataNode *)ListMP_getTail(list_busy);
        /* get upp data */
        uint16_t *data = (uint16_t *)SharedRegion_getPtr(node->SR_buffer);
        LOG_DEBUG("data[0]=%x", data[0]);
        /* save upp data */
        file_saver_save(file_saver, (void *)data, node->size);
        /* make free node in free list again */
        ListMP_putHead(list_free, (ListMP_Elem *)node);
    }
    3)、dsp用dma方式从upp读入数据,放入共享内存:
static bool server_upp_data_transfer(Server *server) {
if(server->ad_started == false) return true;
    while (ListMP_empty(server->list_free))  /* wait */
        Task_sleep(10000);
    DataNode *node = (DataNode *)ListMP_getTail(server->list_free); /* get free node */
    int *data = (int *)SharedRegion_getPtr(node->SR_buffer);
    server->transposeParA.WindowAddress     = (unsigned int *)data;  /* set taget */
    server->transposeParA.LineCount   = node->buffer_height;
    server->transposeParA.ByteCount   = node->buffer_pitch;
    server->transposeParA.LineOffsetAddress = node->buffer_pitch;
    upp_error_count = 0;
    upp_dmai_int_cut = 0;
    /* fill in data */
    uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
    /* wait */
    while (upp_dmai_int_cut < 1 && upp_error_count == 0);
    if (upp_error_count != 0) {
        LOG_ERROR("data mismatch in buffers");
        LOG_ERROR("upp_error_count=%d",upp_error_count);
    }
    /* make data node in busy list */
    ListMP_putHead(server->list_busy, (ListMP_Elem *)node);
    return true;
}
.....................................
3.
我从upp口重复发数据48kB给dsp,从arm端检查共享内存中的数据,第一次发送的数据没有,第二次发送的数据,只有第一块(16KB/一块;正确时应当收到3块)。
不知什么原因?


点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表