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.
/* heap for malloc list node */
IHeap_Handle heap_node = (IHeap_Handle)SharedRegion_getHeap(SYS_CFG_SR_ID_LIST_HEAP);
IHeap_Handle heap_data = (IHeap_Handle)SharedRegion_getHeap(SYS_CFG_SR_ID_UPP_HEAP);
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);
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;
}
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[i]);
params_list.name = SYS_CFG_LIST_BUSY;
ListMP_Handle list_busy = ListMP_create(¶ms_list);
2)、arm等待数据块有效,并写入disk:
while (! quit) {
while (ListMP_empty(list_busy) && ! quit) // wait data
usleep(1000);
continue;
DataNode *node = (DataNode *)ListMP_getTail(list_busy);
uint16_t *data = (uint16_t *)SharedRegion_getPtr(node->SR_buffer);
LOG_DEBUG("data[0]=%x", data[0]);
file_saver_save(file_saver, (void *)data, node->size);
ListMP_putHead(list_free, (ListMP_Elem *)node);
}
if(server->ad_started == false) return true;
while (ListMP_empty(server->list_free)) /* wait */
Task_sleep(10000);
int *data = (int *)SharedRegion_getPtr(node->SR_buffer);
server->transposeParA.LineCount = node->buffer_height;
server->transposeParA.ByteCount = node->buffer_pitch;
server->transposeParA.LineOffsetAddress = node->buffer_pitch;
upp_dmai_int_cut = 0;
uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
while (upp_dmai_int_cut < 1 && upp_error_count == 0);
LOG_ERROR("data mismatch in buffers");
LOG_ERROR("upp_error_count=%d",upp_error_count);
}
ListMP_putHead(server->list_busy, (ListMP_Elem *)node);
}
不知什么原因?