hi3559 运行mtcnn例程错误 地址错误 CNN_Forward failed! not mmz address

海思SVP例程里面有mtcnn的例程
HiSVP_PC_V1.2.2.0/software/sample_simulator/detection/mtcnn/
在window环境ruyi studio能正常运行,但是在linux环境交叉编译后在海思平台上运行会报错。

首先是编译上面要增加如下选项:

SET ( CMAKE_CXX_FLAGS "-std=c++11 -mcpu=cortex-a7 -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-optimizations -Wl,-gc-sections -fopenmp ${CMAKE_CXX_FLAGS}" )
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DUSE_OPENCV -DHISI_CHIP")

HISI_CHIP要打开的,不然分配内存会调用malloc而不是HI_MPI_SYS_MmzAlloc,后者才能在海思nnie上运行

然后运行会出现如下错误

ERROR: MMAP ADDR: 0xb6f48000-0xb6f4a370
[File]:/data/facedet_nnie/detection/mtcnn/src/mtcnn_software.cpp, [mmz_userdev:get_mmbinfo_safe: Line]:25, [Error]: Error(0xa0338003): CNN_Forward failed!
[File]:/data/facedet_nnie/detection/mtcmmz_userdev:get_mmbinfo_safe: nn/src/mtcnn_software.cpp, [Line]:450, [Error] SvpSampleCnnDetectionForword failed
[Func]:HI_MPI_mmz_userdev:get_mmbinfo_safe: SYS_MmzFree [Line]:969 [Info]:System unmap mmz memory failed!
[Func]:HI_MPI_SYS_MmzFree [Line]:969 [mmz_userdev:mmz_userdev_release: Info]:System unmap mmz memory failed!
[Func]:HI_MPI_SYS_MmzFreemmz_userdev:mmz_userdev_release:  [Line]:969 [Info]:System unmap mmz memory failed!
[File]:/datammz_userdev:mmz_userdev_release: /facedet_nnie/detection/mtcnn/src/mtcnn_interface.cpp, [Line]:96, [Error]: mtcnn P-Net process fail.
SvpSampleCnnDetMtcnn end ...

出现错误后,通过如下命令查询详细错误信息:

/mnt/facedet_nnie # cat /dev/logmpp
<3>[(null)] [Func]:hifb_get_vram_size [Line]:8733 [Info]:<3>[(null)] vram_size(4050) if not align in 4, it will be set to 4052!
<3>[svp_nnie] [Func]:svp_nnie_check_blob_mem_info [Line]:724 [Info]:Error(0xa0338003),blob->phy_addr(0xffffffffb6f48000) with size(9072) is not mmz address!
<3>[svp_nnie] [Func]:svp_nnie_check_src_blob [Line]:897 [Info]:Error(0xa0338003), 0-th blob svp_nnie_check_blob_mem_info failed
<3>[svp_nnie] [Func]:svp_nnie_check_forward_param_kernel [Line]:1475 [Info]:Error(0xa0338003),info in src[] is illegal
<3>[svp_nnie] [Func]:svp_nnie_forward [Line]:1032 [Info]:Error(0xa0338003),Check forward param failed!

是地址块不属于mmz地址区间,地址非法。
跟踪这段地址来源,类似下面这样通过加打印定位这个非法地址的来源
在这里插入图片描述
最终原因是下面HI_MPI_SYS_MmzAlloc申请内存后,else的处理导致地址发生了变化。对比海思linux的sample fasterRCNN代码SAMPLE_COMM_SVP_MallocMem,屏蔽掉后面if else处理后,mtcnn例子就能在海思板子上跑起来了。

HI_S32 SvpSampleMalloc(HI_CHAR *pchMmb, HI_CHAR *pchZone, HI_U64 *pu64PhyAddr, HI_VOID **ppvVirAddr, HI_U32 u32Size)
{
    HI_S32 s32Ret = HI_SUCCESS;
    CHECK_EXP_RET(u32Size == 0, HI_ERR_SVP_NNIE_ILLEGAL_PARAM, "input u32Size(%d) err", u32Size);

#if ((defined __arm__) || (defined __aarch64__)) && defined HISI_CHIP
    s32Ret = HI_MPI_SYS_MmzAlloc(pu64PhyAddr, ppvVirAddr, pchMmb, pchZone, u32Size);
#else
    *ppvVirAddr = (HI_VOID *)malloc(u32Size);
#endif
/*    if (HI_NULL == *ppvVirAddr)
    {
        s32Ret = HI_FAILURE;
    }
    else
    {
        *pu64PhyAddr = (HI_U64)*ppvVirAddr;
        memset(*ppvVirAddr, 0, u32Size);
    }
*/
    return s32Ret;
}
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值