Other Parts Discussed in Thread: SYSBIOS
TI专家您好:
我在ti-processor-sdk-rtos-j721e-evm-08_06_01_03/vision_apps/apps/dl_demos下新建文件夹 my_disp_img,在my_disp_img目录下有四个文件如下:concerto.mak ,app_common.h , main_linux_arm.c main.c
最后我在vision_apps目录下完成编译,并在vision_apps/out/J7/A72/LINUX/relase/下生成了相应的可执行文件:my_disp_img.out,并将文件拷贝到SK-TDA4VM评估板上执行 ./my_disp_img.out 却提示节点核注册失败!!对此我比较疑惑,首先tivxDisplayNode这个核不是贵公司已经封装注册好的吗,我们不能直接从本地加载图片然后调用此显示核在屏幕上显示吗?
若没有在目标端注册的话,那么我在目标端需要怎么操作才能在arm设计端调用此tivxDisplayNode节点核呢?
期待您的回复!
best wish
Ling Wang
具体的打印日志信息、编译文件、源文件代码如下:
//----------拷贝到评估版上执行 ./my_disp_img.out --------------------------------------------------------------------------/
/********************************************************************************************************************************/
/******************************************日志信息****************************************************************************/
/******************************************************************************************************************************/
APP: Init ... !!!
MEM: Init ... !!!
MEM: Initialized DMA HEAP (fd=4) !!!
MEM: Init ... Done !!!
IPC: Init ... !!!
IPC: Init ... Done !!!
REMOTE_SERVICE: Init ... !!!
REMOTE_SERVICE: Init ... Done !!!
6773.589374 s: GTC Frequency = 200 MHz
APP: Init ... Done !!!
6773.589526 s: VX_ZONE_INIT:Enabled
6773.589537 s: VX_ZONE_ERROR:Enabled
6773.589582 s: VX_ZONE_WARNING:Enabled
6773.591535 s: VX_ZONE_INIT:[tivxInitLocal:130] Initialization Done !!!
6773.591698 s: VX_ZONE_INIT:[tivxHostInitLocal:93] Initialization Done for HOST !!!
disp_img: Init ...
disp_img: Init ... Done.
disp_img: Creating graph ...
disp_img: Creating graph ... Done.
disp_img: Verifying graph ...
6773.594860 s: VX_ZONE_ERROR:[ownContextSendCmd:799] Command ack message returned failure cmd_status: -7
6773.594878 s: VX_ZONE_ERROR:[ownContextSendCmd:835] tivxEventWait() failed.
6773.594889 s: VX_ZONE_ERROR:[ownNodeKernelInit:527] Target kernel, TIVX_CMD_NODE_CREATE failed for node DisplayNode
6773.594898 s: VX_ZONE_ERROR:[ownNodeKernelInit:528] Please be sure the target callbacks have been registered for this core
6773.594907 s: VX_ZONE_ERROR:[ownNodeKernelInit:529] If the target callbacks have been registered, please ensure no errors are occurring within the create callback of this kernel
6773.594948 s: VX_ZONE_ERROR:[ownGraphNodeKernelInit:583] kernel init for node 0, kernel com.ti.hwa.display ... failed !!!
6773.594960 s: VX_ZONE_ERROR:[vxVerifyGraph:2055] Node kernel init failed
6773.594969 s: VX_ZONE_ERROR:[vxVerifyGraph:2109] Graph verify failed
disp_img: ERROR: Verifying display graph ... Failed !!!
disp_img: Delete ...
disp_img: Delete ... Done.
6773.595359 s: VX_ZONE_WARNING:[vxReleaseContext:1055] Found a reference 0xffffb893aee8 of type 0000080f at external count 1, internal count 0, releasing it
6773.595370 s: VX_ZONE_WARNING:[vxReleaseContext:1057] Releasing reference (name=image_70) now as a part of garbage collection
6773.596335 s: VX_ZONE_WARNING:[vxReleaseContext:1055] Found a reference 0xffffb8901968 of type 00000816 at external count 1, internal count 0, releasing it
6773.596350 s: VX_ZONE_WARNING:[vxReleaseContext:1057] Releasing reference (name=DisplayParams) now as a part of garbage collection
disp_img: De-init ... Done.
6773.596420 s: VX_ZONE_INIT:[tivxHostDeInitLocal:107] De-Initialization Done for HOST !!!
6773.600966 s: VX_ZONE_INIT:[tivxDeInitLocal:193] De-Initialization Done !!!
APP: Deinit ... !!!
REMOTE_SERVICE: Deinit ... !!!
REMOTE_SERVICE: Deinit ... Done !!!
IPC: Deinit ... !!!
IPC: DeInit ... Done !!!
MEM: Deinit ... !!!
DDR_SHARED_MEM: Alloc's: 2 alloc's of 6220844 bytes
DDR_SHARED_MEM: Free's : 2 free's of 6220844 bytes
DDR_SHARED_MEM: Open's : 0 allocs of 0 bytes
DDR_SHARED_MEM: Total size: 536870912 bytes
MEM: Deinit ... Done !!!
APP: Deinit ... Done !!!
//**********************************************************编译文件和源文件如下************************************************************************、
/**************************************************************a文件: concerto.mak*******************************************************************/
ifeq ($(TARGET_CPU),$(filter $(TARGET_CPU), x86_64 A72))
include $(PRELUDE)
TARGET := my_disp_img
CSOURCES := main.c
ifeq ($(TARGET_CPU),A72)
ifeq ($(TARGET_OS),$(filter $(TARGET_OS), LINUX QNX))
TARGETTYPE := exe
CSOURCES += main_linux_arm.c
include $(VISION_APPS_PATH)/apps/concerto_a72_inc.mak
endif
endif
ifeq ($(TARGET_OS),SYSBIOS)
ifeq ($(TARGET_CPU),$(filter $(TARGET_CPU), A72))
TARGETTYPE := library
endif
endif
include $(FINALE)
endif
/**************************************************************b文件: app_common.c*******************************************************************/
#ifndef _APP_COMMON
#define _APP_COMMON
#include <TI/tivx.h>
#include <TI/tivx_task.h>
#include <tivx_utils_file_rd_wr.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <assert.h>
#include <sys/stat.h>
#include <float.h>
#include <math.h>
#define APP_DEBUG
#define APP_MAX_FILE_PATH (256u)
#define APP_ASSERT(x) assert((x))
#define APP_ASSERT_VALID_REF(ref) (APP_ASSERT(vxGetStatus((vx_reference)(ref))==VX_SUCCESS));
#define APP_MAX_TENSORS (4u)
#define APP_MAX_TENSOR_DIMS (4u)
#define APP_TIDL_MAX_PARAMS (16u)
#define ABS_FLT(a) ((a) > 0)?(a):(-(a))
#define MAX_IMG_WIDTH (2048)
#define MAX_IMG_HEIGHT (1024)
#define DISPLAY_WIDTH (1920)
#define DISPLAY_HEIGHT (1080)
#ifdef APP_DEBUG
#define APP_PRINTF(f_, ...) printf((f_), ##__VA_ARGS__)
#else
#define APP_PRINTF(f_, ...)
#endif
#endif
/**************************************************************c文件: main_linux_arm.c*******************************************************************/
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdint.h>
#include <TI/tivx.h>
#include <utils/app_init/include/app_init.h>
int app_disp_img_main();
int main()
{
int status = 0;
status = appInit();
if(status==0)
{
status = app_disp_img_main();
appDeInit();
}
return status;
}
/**************************************************************d文件: main.c*******************************************************************/
#include "app_common.h"
typedef struct {
/* config options */
char input_file_path[APP_MAX_FILE_PATH];
char input_file_list[APP_MAX_FILE_PATH];
/* Input image params */
tivx_utils_bmp_image_params_t imgParams;
vx_uint32 img_width;
vx_uint32 img_height;
vx_uint32 img_stride;
/* OpenVX references */
vx_context context;
vx_graph disp_graph;
vx_node disp_node;
vx_image disp_image;
vx_user_data_object disp_params_obj;
tivx_display_params_t disp_params;
vx_uint32 display_option;
vx_uint32 delay_in_msecs;
tivx_task task;
uint32_t stop_task;
uint32_t stop_task_done;
} AppObj;
AppObj gAppObj;
static vx_status app_init(AppObj *obj);
static void app_deinit(AppObj *obj);
static vx_status app_create_graph(AppObj *obj);
static vx_status app_verify_graph(AppObj *obj);
static vx_status app_run_graph(AppObj *obj);
static vx_status app_run_graph_interactive(AppObj *obj);
static void app_delete_graph(AppObj *obj);
int app_disp_img_main()
{
int status = 0;
AppObj *obj = &gAppObj;
status = app_init(obj);
if(status == VX_SUCCESS)
{
status = app_create_graph(obj);
}
if(status == VX_SUCCESS)
{
status = app_verify_graph(obj);
}
if(status == VX_SUCCESS)
{
status = app_run_graph_interactive(obj);
}
app_delete_graph(obj);
app_deinit(obj);
return status;
}
static int app_init(AppObj *obj)
{
//int status = 0;
APP_PRINTF("disp_img: Init ... \n");
obj->context = vxCreateContext();
APP_ASSERT_VALID_REF(obj->context);
obj->disp_image = vxCreateImage(obj->context, DISPLAY_WIDTH, DISPLAY_HEIGHT, VX_DF_IMAGE_RGB);
APP_ASSERT_VALID_REF(obj->disp_image)
memset(&obj->disp_params,0,sizeof(tivx_display_params_t));
obj->disp_params.opMode= TIVX_KERNEL_DISPLAY_BUFFER_COPY_MODE;
obj->disp_params.pipeId = 0;
obj->disp_params.outWidth= DISPLAY_WIDTH;
obj->disp_params.outHeight = DISPLAY_HEIGHT;
obj->disp_params.posX=(1920-DISPLAY_WIDTH)/2;
obj->disp_params.posY=(1080-DISPLAY_HEIGHT)/2;
obj->disp_params_obj = vxCreateUserDataObject(obj->context, "tivx_display_params_t", sizeof(tivx_display_params_t), &obj->disp_params);
APP_ASSERT_VALID_REF(obj->disp_params_obj)
obj->delay_in_msecs=1000;
tivxHwaLoadKernels(obj->context);
snprintf(obj->input_file_path,APP_MAX_FILE_PATH-1,"%s","/opt/vision_apps/test_data/psdkra/app_tidl");
snprintf(obj->input_file_path,APP_MAX_FILE_PATH-1,"%s","/opt/vision_apps/test_data/psdkra/app_tidl/names.txt");
APP_PRINTF("disp_img: Init ... Done.\n");
return 0;
}
static void app_deinit(AppObj *obj)
{
tivxHwaUnLoadKernels(obj->context);
vxReleaseContext(&obj->context);
APP_PRINTF("disp_img: De-init ... Done.\n");
}
static void app_delete_graph(AppObj *obj)
{
APP_PRINTF("disp_img: Delete ... \n");
vxReleaseNode(&obj->disp_node);
vxReleaseGraph(&obj->disp_graph);
APP_PRINTF("disp_img: Delete ... Done.\n");
}
static vx_status app_create_graph(AppObj *obj)
{
vx_status status = VX_SUCCESS;
APP_PRINTF("disp_img: Creating graph ... \n");
/* Create OpenVx Graph */
obj->disp_graph = vxCreateGraph(obj->context);
APP_ASSERT_VALID_REF(obj->disp_graph)
vxSetReferenceName((vx_reference)obj->disp_graph, "Display");
obj->disp_node = tivxDisplayNode(obj->disp_graph, obj->disp_params_obj, obj->disp_image);
APP_ASSERT_VALID_REF(obj->disp_node)
vxSetNodeTarget(obj->disp_node, VX_TARGET_STRING, TIVX_TARGET_DISPLAY1);
vxSetReferenceName((vx_reference)obj->disp_params_obj, "DisplayParams");
vxSetReferenceName((vx_reference)obj->disp_node, "DisplayNode");
APP_PRINTF("disp_img: Creating graph ... Done.\n");
return status;
}
static void app_run_task(void *app_var)
{
AppObj *obj = (AppObj *)app_var;
vx_status status = VX_SUCCESS;
//appPerfStatsCpuLoadResetAll();
while(!obj->stop_task)
{
status = app_run_graph(obj);
if(status == VX_FAILURE)
{
printf("Error processing graph!\n");
obj->stop_task = 1;
}
}
obj->stop_task_done = 1;
}
static int32_t app_run_task_create(AppObj *obj)
{
tivx_task_create_params_t params;
int32_t status;
tivxTaskSetDefaultCreateParams(¶ms);
params.task_main = app_run_task;
params.app_var = obj;
obj->stop_task_done = 0;
obj->stop_task = 0;
status = tivxTaskCreate(&obj->task, ¶ms);
return status;
}
static void app_run_task_delete(AppObj *obj)
{
while(obj->stop_task_done==0)
{
tivxTaskWaitMsecs(100);
}
tivxTaskDelete(&obj->task);
}
static char menu[] = {
"\n"
"\n ================================="
"\n Demo : Display the images from file"
"\n ================================="
"\n"
"\n"
"\n"
"\n x: Exit"
"\n"
"\n Enter Choice: "
};
static vx_status app_run_graph_interactive(AppObj *obj)
{
vx_status status = VX_SUCCESS;
uint32_t done = 0;
char ch;
//FILE *fp;
//app_perf_point_t *perf_arr[1];
status = app_run_task_create(obj);
if(status != VX_SUCCESS)
{
printf("disp_img: ERROR: Unable to create task\n");
}
else
{
while((!done) && (status == VX_SUCCESS))
{
printf(menu);
ch = getchar();
printf("\n");
if(ch=='x')
{
obj->stop_task=1;
done=1;
break;
}
}
app_run_task_delete(obj);
}
return status;
}
static vx_status app_verify_graph(AppObj *obj)
{
vx_status status = VX_SUCCESS;
APP_PRINTF("disp_img: Verifying graph ... \n");
status = vxVerifyGraph(obj->disp_graph);
if(status != VX_SUCCESS)
{
printf("disp_img: ERROR: Verifying display graph ... Failed !!!\n");
return status;
}
APP_PRINTF("disp_img: Verifying display graph ... Done.\n");
/* wait a while for prints to flush */
tivxTaskWaitMsecs(100);
return status;
}
static vx_status app_run_graph_for_one_frame(AppObj *obj, char *curFileName, vx_uint32 counter)
{
vx_status status = VX_SUCCESS;
vx_char input_file_name[APP_MAX_FILE_PATH];
void *base_ptr=NULL;
vx_uint32 plane=0;
vx_rectangle_t rect;
vx_imagepatch_addressing_t addr;
vx_map_id map_id;
rect.start_x = 0;
rect.start_y = 0;
rect.end_x = DISPLAY_WIDTH;
rect.end_y = DISPLAY_HEIGHT;
status = vxMapImagePatch(obj->disp_image,
&rect,
plane,
&map_id,
&addr,
&base_ptr,
VX_READ_AND_WRITE,
VX_MEMORY_TYPE_HOST,
0);
if(status==VX_SUCCESS)
{
APP_PRINTF("Mapping successful!\n");
vx_uint32 x,y;
vx_uint8 pixel=0;
//2d addressing access
for(y=0;y<addr.dim_y;y+=addr.step_y)
{
for(x=0;x<addr.dim_x;x+=addr.step_x)
{
vx_uint8 *ptr2=vxFormatImagePatchAddress2d(base_ptr,x,y,&addr);
*ptr2=pixel;
*(ptr2+1)=pixel;
*(ptr2+2)=pixel;
}
}
status=vxUnmapImagePatch(obj->disp_image, map_id);
}
else
{
APP_PRINTF("Mapping failed! \n");
}
snprintf(input_file_name,APP_MAX_FILE_PATH-1,"%s/%s",obj->input_file_path,curFileName);
APP_PRINTF("disp_img:Reading input file %s... \n",curFileName);
status=tivx_utils_load_vximage_from_bmpfile(obj->disp_image,input_file_name,(vx_bool)vx_false_e);
APP_PRINTF("disp_img:Reading input file Done!\n");
if(status==VX_SUCCESS)
{
status=vxProcessGraph(obj->disp_graph);
}
APP_PRINTF("disp_img:Running display graph...Done.\n");
return status;
}
static vx_status app_run_graph(AppObj *obj)
{
vx_status status = VX_SUCCESS;
vx_char curFileName[APP_MAX_FILE_PATH];
uint64_t cur_time;
uint64_t max_frames = INT64_MAX;
vx_uint32 counter = 0;
FILE* test_case_file;
test_case_file = fopen(obj->input_file_list,"r");
if(test_case_file==NULL)
{
printf("Open file Error");
status=VX_FAILURE;
}
if(status==VX_SUCCESS)
{
while (fgets(curFileName, sizeof(curFileName), test_case_file) && (counter < max_frames))
{
curFileName[strlen(curFileName) - 1] = 0;
cur_time = tivxPlatformGetTimeInUsecs();
APP_PRINTF("Input file:%s...\n",curFileName);
if(status == VX_SUCCESS)
{
status = app_run_graph_for_one_frame(obj, curFileName, counter++);
}
APP_PRINTF("Display Input file %s...Done!\n",curFileName);
cur_time = tivxPlatformGetTimeInUsecs() - cur_time;
/* convert to msecs */
cur_time = cur_time/1000;
if(cur_time < obj->delay_in_msecs)
{
tivxTaskWaitMsecs(obj->delay_in_msecs - cur_time);
}
/* user asked to stop processing */
if(obj->stop_task || (status != VX_SUCCESS))
{
break;
}
}
fclose(test_case_file);
}
return status;
}