hiNewer

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer  发布于  2016-07-26 21:08:28
采纳率 0%
38个问答
5653

【已解决】Hi3531A相关MPP的使用

 
本帖最后由 goodman 于 2016-8-10 08:54 编辑

       今天想用mpp中的sample_ive_gmm.c样例中的接口SAMPLE_COMM_IVE_CreateImage( )创建图片保存的内存,摄像头采集图片,然后进行中值了滤波,编译调试没问题但是已下载就提示错误:段错误!

HI_S32 SAMPLE_COMM_IVE_CreateImage_1(IVE_IMAGE_S *pstImg,IVE_IMAGE_TYPE_E enType,HI_U16 u16Width,HI_U16 u16Height)

{

        HI_U32 u32Size = 0;
        HI_S32 s32Ret;
        if (NULL == pstImg)
        {
                SAMPLE_PRT("pstImg is null\n");
                return HI_FAILURE;
        }
        pstImg->enType = enType;
        pstImg->u16Width = u16Width;
        pstImg->u16Height = u16Height;
        pstImg->u16Stride[0] = SAMPLE_COMM_IVE_CalcStride(pstImg->u16Width,IVE_ALIGN);      
        switch(enType)
        {
        case IVE_IMAGE_TYPE_U8C1:
        case IVE_IMAGE_TYPE_S8C1:
                {
                        u32Size = pstImg->u16Stride[0] * pstImg->u16Height+pstImg->u16Stride[0] * pstImg->u16Height/2;
                        s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size);
                        if(s32Ret != HI_SUCCESS)
                        {
                                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret);
                                return s32Ret;
                        }
                }
                break;
        case IVE_IMAGE_TYPE_YUV420SP:
                {
                        u32Size = pstImg->u16Stride[0] * pstImg->u16Height * 3 / 2;
                        s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size);
                        if(s32Ret != HI_SUCCESS)
                        {
                                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret);
                                return s32Ret;
                        }
                        pstImg->u16Stride[1] = pstImg->u16Stride[0];
                        pstImg->u32PhyAddr[1] = pstImg->u32PhyAddr[0] + pstImg->u16Stride[0] * pstImg->u16Height;
                        pstImg->pu8VirAddr[1] = pstImg->pu8VirAddr[0] + pstImg->u16Stride[0] * pstImg->u16Height;
                }
                break;
        case IVE_IMAGE_TYPE_YUV422SP:
                {
                        u32Size = pstImg->u16Stride[0] * pstImg->u16Height * 2;
                        s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size);
                        if(s32Ret != HI_SUCCESS)
                        {
                                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret);
                                return s32Ret;
                        }
                        pstImg->u16Stride[1] = pstImg->u16Stride[0];
                        pstImg->u32PhyAddr[1] = pstImg->u32PhyAddr[0] + pstImg->u16Stride[0] * pstImg->u16Height;
                        pstImg->pu8VirAddr[1] = pstImg->pu8VirAddr[0] + pstImg->u16Stride[0] * pstImg->u16Height;
                }
                break;
        case IVE_IMAGE_TYPE_YUV420P:
                break;
        case IVE_IMAGE_TYPE_YUV422P:
                break;
        case IVE_IMAGE_TYPE_S8C2_PACKAGE:
                break;
        case IVE_IMAGE_TYPE_S8C2_PLANAR:
                break;
        case IVE_IMAGE_TYPE_S16C1:
        case IVE_IMAGE_TYPE_U16C1:
                {
                        u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U16);
                        s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size);
                        if(s32Ret != HI_SUCCESS)
                        {
                                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret);

                                return s32Ret;

                        }

                }

                break;

        case IVE_IMAGE_TYPE_U8C3_PACKAGE:

                {

                        u32Size = pstImg->u16Stride[0] * pstImg->u16Height * 3;

                        s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size);
                        if(s32Ret != HI_SUCCESS)
                        {
                                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret);
                                return s32Ret;
                        }
                        pstImg->pu8VirAddr[1] = pstImg->pu8VirAddr[0] +1;
                        pstImg->pu8VirAddr[2] = pstImg->pu8VirAddr[1] + 1;                       
                        pstImg->u32PhyAddr[1] = pstImg->u32PhyAddr[0] + 1;
                        pstImg->u32PhyAddr[2] = pstImg->u32PhyAddr[1] + 1;
                        pstImg->u16Stride[1] = pstImg->u16Stride[0];
                        pstImg->u16Stride[2] = pstImg->u16Stride[0];
                }
                break;
        case IVE_IMAGE_TYPE_U8C3_PLANAR:
                break;
        case IVE_IMAGE_TYPE_S32C1:
        case IVE_IMAGE_TYPE_U32C1:
                {
                        u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U32);
                        s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size);
                        if(s32Ret != HI_SUCCESS)
                        {
                                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret);
                                return s32Ret;
                        }
                }
                break;
        case IVE_IMAGE_TYPE_S64C1:
        case IVE_IMAGE_TYPE_U64C1:
                {
                        u32Size = pstImg->u16Stride[0] * pstImg->u16Height * sizeof(HI_U64);
                        s32Ret = HI_MPI_SYS_MmzAlloc(&pstImg->u32PhyAddr[0], (void**)&pstImg->pu8VirAddr[0], NULL, HI_NULL, u32Size);
                        if(s32Ret != HI_SUCCESS)
                        {
                                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret);                                return s32Ret;
                        }
                }
                break;
        default:
                break;
        }
        return HI_SUCCESS;
}
static HI_S32 SAMPLE_IVE_Image_Init(SAMPLE_IVE_Image_S *pstGmm,HI_U16 u16Width,HI_U16 u16Height)
{
    HI_S32 s32Ret = HI_SUCCESS;
        memset(pstGmm,0,sizeof(SAMPLE_IVE_Image_S));

        s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstGmm->stSrc),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height);
        SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!= s32Ret, MD_INIT_FAIL, "SAMPLE_COMM_IVE_CreateImage fail\n");
       
        s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstGmm->stDst),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height);
        SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!= s32Ret, MD_INIT_FAIL, "SAMPLE_COMM_IVE_CreateImage fail\n");
       
   
MD_INIT_FAIL:
   
    if(HI_SUCCESS != s32Ret)
        {
        SAMPLE_IVE_Image_Uninit(pstGmm);
        }
        return s32Ret;      
}
s32Ret = HI_MPI_IVE_DMA(&IveHandle, &stSrcdata, &stDstdata, &stDmaCtrl, bInstant);
        SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret, s32Ret, "HI_MPI_IVE_DMA fail,Error(%#x)\n",s32Ret);
       
       
        s32Ret = HI_MPI_IVE_OrdStatFilter(&IveHandle,&pstGmm->stSrc,&pstGmm->stDst,&midFilterCtrl,bInstant);
        SAMPLE_CHECK_EXPR_RET(HI_SUCCESS != s32Ret, s32Ret, "HI_MPI_IVE_OrdStatFilter fail,Error(%#x)\n",s32Ret);
我来回答
回答18个
时间排序
认可量排序

goodman

4个粉丝

30

问答

18

专栏

17

资料

goodman 2016-07-26 21:20:57
认可0
加上-g 然后用gdb跑一下就知道了,这个是你自己写的程序有问题,非法指针或者数组越界独有可能引起段错误

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-07-27 09:38:30
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34862&ptid=12095]goodman 发表于 2016-7-26 21:20[/url]
加上-g 然后用gdb跑一下就知道了,这个是你自己写的程序有问题,非法指针或者数组越界独有可能引起段错误[/quote]

谢谢您的指导,还没用过gdb,开发海思的板子能直接在ubunt上用apt-get install gdb安装gdb吗,好多看到好多资料说需要下载安装包,解压再配置成ARM-linux形式,不知道应该选择哪一种安装形式,再次请您指导。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-27 10:00:06
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34875&ptid=12095]hiNewer 发表于 2016-7-27 09:38[/url]
谢谢您的指导,还没用过gdb,开发海思的板子能直接在ubunt上用apt-get install gdb安装gdb吗,好多看到好 ...[/quote]

简单点, 在每个函数入口出口加句打印, 然后编译跑,先大致确定是在哪个函数出问题的

然后在这个函数里面多加点打印, 大致确定是哪行代码的问题

如果自己看不出来,可以把log和代码放上来, 大家帮你看看

这个方法对于单线程的程序还是很有用的

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-07-27 10:10:22
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34879&ptid=12095]zhuangweiye 发表于 2016-7-27 10:00[/url]
简单点, 在每个函数入口出口加句打印, 然后编译跑,先大致确定是在哪个函数出问题的

然后在这个函数里 ...[/quote]

编译没有提示有错误,但是一下载就报段错误,可以大致确定调用SAMPLE_COMM_IVE_CreateImage()时出了问题,因为用其他函数替换掉,再下载就不会报段错误,但是这个函数后面编程一定要用到。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-27 11:21:19
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34883&ptid=12095]hiNewer 发表于 2016-7-27 10:10[/url]
编译没有提示有错误,但是一下载就报段错误,可以大致确定调用SAMPLE_COMM_IVE_CreateImage()时出了问题 ...[/quote]

楼主上面给出的代码是
HI_S32 SAMPLE_COMM_IVE_CreateImage_1(IVE_IMAGE_S *pstImg,IVE_IMAGE_TYPE_E enType,HI_U16 u16Width,HI_U16 u16Height)
然后说错误在
SAMPLE_COMM_IVE_CreateImage()

先不说贴的代码是否正确, 那么错误在SAMPLE_COMM_IVE_CreateImage()中的哪里附近呢?
必然出现的错误还不好查吗?

要有必要的耐心和细心

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-07-27 11:36:30
认可0
本帖最后由 hiNewer 于 2016-8-2 20:45 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34892&ptid=12095]zhuangweiye 发表于 2016-7-27 11:21[/url]
楼主上面给出的代码是
HI_S32 SAMPLE_COMM_IVE_CreateImage_1(IVE_IMAGE_S *pstImg,IVE_IMAGE_TYPE_E  ...[/quote]

我能加你qq好友吗:(,,谢谢了,感觉越说越糊涂。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-27 11:46:20
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34901&ptid=12095]hiNewer 发表于 2016-7-27 11:36[/url]
我能加你qq好友吗,我的QQ号是924810742,谢谢了,感觉越说越糊涂。[/quote]

抱歉
QQ已经不用很多年了

每行代码后面加一句打印, 然后把输出log和代码(出问题附近的)先贴出来, 这个很困难吗?

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-07-27 11:55:41
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34903&ptid=12095]zhuangweiye 发表于 2016-7-27 11:46[/url]
抱歉
QQ已经不用很多年了

[/quote]

关键是编译没有问题,每个函数后面都会是标准的错误输出信息,比如:
SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!= s32Ret, MD_INIT_FAIL, "SAMPLE_COMM_IVE_CreateImage fail\n");
if(s32Ret != HI_SUCCESS)
                        {
                                SAMPLE_PRT("Mmz Alloc fail,Error(%#x)\n",s32Ret);
                                return s32Ret;
                        }
但是编译不报错,只是一些警告,但是一下载就会出现上面的段错误报错。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-27 12:17:39
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34904&ptid=12095]hiNewer 发表于 2016-7-27 11:55[/url]
关键是编译没有问题,每个函数后面都会是标准的错误输出信息,比如:
SAMPLE_CHECK_EXPR_GOTO(HI_SUCCES ...[/quote]

拜托

如果是函数返回错误码, 你的做法没有问题

现在是段错误, 要知道运行到哪里了, 所以要加打印, 你现在的代码对于返回正确的情况是没有打印

别人也就不知道运行到哪里出现错误了

所以要你加打印

xzxzhao2013

0个粉丝

0

问答

0

专栏

0

资料

xzxzhao2013 2016-07-27 12:35:33
认可0


我喜欢啊,请继续 支持你

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-07-27 14:13:07
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34906&ptid=12095]zhuangweiye 发表于 2016-7-27 12:17[/url]
拜托

如果是函数返回错误码, 你的做法没有问题
[/quote]

程序就在这了,编译没错,依然下载报错,你说的对段错误的打印真心不懂,这里附上完成程序,可以编译但不能下载,因为那个SAMPLE_COMM_IVE_CreateImage()在其他文件里,为了验证直接贴到这里改为SAMPLE_COMM_IVE_CreateImage_1().

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-27 14:40:43
认可0
本帖最后由 zhuangweiye 于 2016-7-27 14:41 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34942&ptid=12095]hiNewer 发表于 2016-7-27 14:13[/url]
程序就在这了,编译没错,依然下载报错,你说的对段错误的打印真心不懂,这里附上完成程序,可以编译但不 ...[/quote]

看来我小学语文没学好

举例子
楼主的代码, 绿色的部分就是希望楼主加上的打印,然后运行log放上来

static HI_S32 SAMPLE_IVE_Image_Init(SAMPLE_IVE_Image_S *pstGmm,HI_U16 u16Width,HI_U16 u16Height)
{
        printf("Enter SAMPLE_IVE_Image_Init() ... \n");
     HI_S32 s32Ret = HI_SUCCESS;
         memset(pstGmm,0,sizeof(SAMPLE_IVE_Image_S));

         s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstGmm->stSrc),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height);
         SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!= s32Ret, MD_INIT_FAIL, "SAMPLE_COMM_IVE_CreateImage fail\n");
          printf("After SAMPLE_COMM_IVE_CreateImage() 1 ... \n");
      
         s32Ret = SAMPLE_COMM_IVE_CreateImage(&(pstGmm->stDst),IVE_IMAGE_TYPE_U8C1,u16Width,u16Height);
         SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!= s32Ret, MD_INIT_FAIL, "SAMPLE_COMM_IVE_CreateImage fail\n");
           printf("After SAMPLE_COMM_IVE_CreateImage() 2... \n");
        
     
MD_INIT_FAIL:
     
     if(HI_SUCCESS != s32Ret)
         {
         SAMPLE_IVE_Image_Uninit(pstGmm);
         }

        printf("Leave  SAMPLE_IVE_Image_Init() ... \n");
         return s32Ret;      
}

heiheiOo

0个粉丝

11

问答

0

专栏

0

资料

heiheiOo 2016-07-27 15:07:58
认可0
你可以把代码注释掉,从上往下不断增加代码编译运行,看是从哪句出现了问题

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-07-27 15:54:42
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34946&ptid=12095]zhuangweiye 发表于 2016-7-27 14:40[/url]
看来我小学语文没学好

举例子
[/quote]

终于明白您的意思了,已经查找到错误了在哪了,真的辛苦您的。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-27 15:58:02
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34949&ptid=12095]hiNewer 发表于 2016-7-27 15:54[/url]
终于明白您的意思了,已经查找到错误了在哪了,真的辛苦您的。[/quote]

找到问题就好

一头汗呀

呆呆

0个粉丝

0

问答

0

专栏

0

资料

呆呆 2016-08-01 18:57:35
认可0
学习了,学习了

呆呆

0个粉丝

0

问答

0

专栏

0

资料

呆呆 2016-08-10 02:03:17
认可0
怎么找到错误的?

hiNewer

0个粉丝

38

问答

0

专栏

0

资料

hiNewer 2016-08-12 15:31:15
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=35817&ptid=12095]呆呆 发表于 2016-8-10 02:03[/url]
怎么找到错误的?[/quote]

指针问题,还有就是变量声明有时间需要放在初始化之后。
在函数调用中实参的变量加不加&,需要仔细考虑。如果传递之前已经是指针类型,一般在实参中,就不要加&,
主要还是C语言的语法错误。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区