heiheiOo

heiheiOo

0个粉丝

11

问答

0

专栏

0

资料

heiheiOo  发布于  2016-07-18 20:22:52
采纳率 0%
11个问答
4449

如何访问IVE任务结果IVE_IMAGE_S中的数据值?

 
Desimg的VirAddr和PhyAddr由HI_MPI_SYS_MmzAlloc_Cached()获得,

s32Ret = HI_MPI_IVE_Sub(IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);

现在是,两个Srcimg的数值可以 *(Srcimg2.pu8VirAddr[0]+i)访问,但是计算之后得到的Desimg,若尝试这样访问其数据都是提示Segmentation fault。

请问一下这是什么原因?要访问IVE任务结果Desimg中的数据该怎么做?
我来回答
回答12个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-19 08:43:51
认可0
Desimg的虚拟地址是正确的吗?

IVE算子在计算时是不需要虚拟地址的, 所以即使送进去的Desimg中的虚拟地址是非法的IVE也没有问题
但是应用程序只能访问虚拟地址就会出错了

heiheiOo

0个粉丝

11

问答

0

专栏

0

资料

heiheiOo 2016-07-19 14:45:58
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34232&ptid=11996]zhuangweiye 发表于 2016-7-19 08:43[/url]
Desimg的虚拟地址是正确的吗?

IVE算子在计算时是不需要虚拟地址的, 所以即使送进去的Desimg中的虚拟地址 ...[/quote]

感谢感谢!

然后现在读写源数据应该是没问题了,就是IVE计算出来之后的结果不知道要怎么去访问,现在的现象也比较奇怪,详情如下:
1.        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Srcimg.u32PhyAddr[0], (HI_VOID**)&Srcimg.pu8VirAddr[0], "User", HI_NULL, Srcimg.u16Stride[0] * Srcimg.u16Height);

        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Srcimg2.u32PhyAddr[0], (HI_VOID**)&Srcimg2.pu8VirAddr[0], "User1", HI_NULL, Srcimg2.u16Stride[0] * Srcimg2.u16Height);

        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Desimg.u32PhyAddr[0], (HI_VOID**)&Desimg.pu8VirAddr[0], "User2", HI_NULL, Desimg.u16Stride[0] * Desimg.u16Height);

创建了两个源图像,和一个目标图像,源图像的数据如下写入
FILE* fp = fopen(filename, "rb");
        int count = 0;
        while (1 == fscanf(fp, "%u", &temp))
        {
                *(Srcimg.pu8VirAddr[0]+ count) = temp;
                count++;
        }

运行减法算子s32Ret = HI_MPI_IVE_Sub(IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);
得到的Desimg无法使用*(Desimg.pu8VirAddr[0])访问,提示Segmentation fault;
计算后调用HI_MPI_SYS_MmzFlushCache(Desimg.u32PhyAddr[0], Desimg.pu8VirAddr[0], W*H);也是如此

2、注释掉减法算子s32Ret = HI_MPI_IVE_Sub(IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);  则可以使用 *(Desimg.pu8VirAddr[0])访问,且结果正确。

我猜测是IVE运算之后结果存在了一个无法访问的地方,对HI_MPI_SYS_MmzFlushCache()函数理解也不是很深,还望指导!

heiheiOo

0个粉丝

11

问答

0

专栏

0

资料

heiheiOo 2016-07-19 14:51:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34232&ptid=11996]zhuangweiye 发表于 2016-7-19 08:43[/url]
Desimg的虚拟地址是正确的吗?

IVE算子在计算时是不需要虚拟地址的, 所以即使送进去的Desimg中的虚拟地址 ...[/quote]

结果如下(不知道如何放图片就用文字了)

第一行是Srcimg1的任意三个像素,第二行是Srcimg2的对应三个像素,第三行是访问输出结果Desimg对应像素。
第一次:使用IVE算子,无法访问;
第二次:注释掉减法算子,能够访问且结果正确。
说明两次编译Desimg的内容没有被修改,减法生效了,只是不知道该如何访问。

/home/***/all # ./IVE_IMAGE_S_TEXT
173 46 50  76800
137 38 52  76800
Segmentation fault
/home/***/all # ./IVE_IMAGE_S_TEXT
173 46 50  76800
137 38 52  76800
36 8 2  76800

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-19 15:14:03
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34279&ptid=11996]heiheiOo 发表于 2016-7-19 14:51[/url]
结果如下(不知道如何放图片就用文字了)

第一行是Srcimg1的任意三个像素,第二行是Srcimg2的对应三个 ...[/quote]

IVE用过很多就这么访问也不会出错

这个我就不好猜了, 要么上代码看看?

heiheiOo

0个粉丝

11

问答

0

专栏

0

资料

heiheiOo 2016-07-19 15:20:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34282&ptid=11996]zhuangweiye 发表于 2016-7-19 15:14[/url]
IVE用过很多就这么访问也不会出错

这个我就不好猜了, 要么上代码看看?[/quote]

#include
#include
#include
#include

#include "hi_comm_ive.h"
#include "hi_comm_sys.h"
#include "mpi_sys.h"
#include "hi_type.h"
#include "hi_ive.h"

#define HI_VOID void
#define W 320
#define H 240

#define a 5963
#define b 65
#define c 89

int main()
{
        HI_S32 s32Ret = HI_SUCCESS;
        IVE_SRC_IMAGE_S Srcimg;
        Srcimg.enType = IVE_IMAGE_TYPE_U8C1;
        Srcimg.u16Stride[0] = W;
        Srcimg.u16Width = W;
        Srcimg.u16Height = H;

        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Srcimg.u32PhyAddr[0], (HI_VOID**)&Srcimg.pu8VirAddr[0], "User", HI_NULL, Srcimg.u16Stride[0] * Srcimg.u16Height);

        HI_U8* test;
        test = Srcimg.pu8VirAddr[0];
char* filename = "./1.txt";//地址,文件的路径
        unsigned char temp;
        FILE* fp = fopen(filename, "rb");
        int count = 0;
        while (1 == fscanf(fp, "%u", &temp))
       {
                *(test + count) = temp;
                count++;
        }
        printf("%u %u %u  %d\n", *(test+a), *(test + b), *(test + c), count);
        IVE_SRC_IMAGE_S Srcimg2;
        Srcimg2.enType = IVE_IMAGE_TYPE_U8C1;
        Srcimg2.u16Stride[0] = W;
        Srcimg2.u16Width = W;
        Srcimg2.u16Height = H;
        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Srcimg2.u32PhyAddr[0], (HI_VOID**)&Srcimg2.pu8VirAddr[0], "User1", HI_NULL, Srcimg2.u16Stride[0] * Srcimg2.u16Height);
        test = Srcimg2.pu8VirAddr[0];

        filename = "./2.txt";//地址,文件的路径
        FILE* fp2 = fopen(filename, "rb");
        count = 0;
        while (1 == fscanf(fp2, "%u", &temp))
        {
                *(test + count) = temp;
                count++;
        }
        printf("%u %u %u  %d\n", *(test + a), *(test + b), *(test + c), count);

        IVE_SRC_IMAGE_S Desimg;
        Desimg.enType = IVE_IMAGE_TYPE_U8C1;
        Desimg.u16Stride[0] = W;
        Desimg.u16Width = W;
        Desimg.u16Height = H;
        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Desimg.u32PhyAddr[0], (HI_VOID**)&Desimg.pu8VirAddr[0], "User2", HI_NULL, Desimg.u16Stride[0] * Desimg.u16Height);

        IVE_HANDLE IveHandle;
        IVE_SUB_MODE_E mode = IVE_SUB_MODE_ABS;
        IVE_SUB_CTRL_S control;
        control.enMode = mode;
        HI_BOOL bInstant = HI_FALSE;

        s32Ret = HI_MPI_IVE_Sub(IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);
        test = Desimg.pu8VirAddr[0];
        printf("%u %u %u  %d\n", *(test + a), *(test + b), *(test + c), count);
}

heiheiOo

0个粉丝

11

问答

0

专栏

0

资料

heiheiOo 2016-07-19 15:24:14
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34282&ptid=11996]zhuangweiye 发表于 2016-7-19 15:14[/url]
IVE用过很多就这么访问也不会出错

这个我就不好猜了, 要么上代码看看?[/quote]

[code]#include
#include
#include
#include

#include "hi_comm_ive.h"
#include "hi_comm_sys.h"
#include "mpi_sys.h"
#include "hi_type.h"
#include "hi_ive.h"

#define HI_VOID void
#define W 320
#define H 240

#define a 5963
#define b 65
#define c 89

int main()
{
        HI_S32 s32Ret = HI_SUCCESS;
        IVE_SRC_IMAGE_S Srcimg;
        Srcimg.enType = IVE_IMAGE_TYPE_U8C1;
        Srcimg.u16Stride[0] = W;
        Srcimg.u16Width = W;
        Srcimg.u16Height = H;

        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Srcimg.u32PhyAddr[0], (HI_VOID**)&Srcimg.pu8VirAddr[0], "User", HI_NULL, Srcimg.u16Stride[0] * Srcimg.u16Height);

        HI_U8* test;
        test = Srcimg.pu8VirAddr[0];
char* filename = "./1.txt";//地址,文件的路径
        unsigned char temp;
        FILE* fp = fopen(filename, "rb");
        int count = 0;
        while (1 == fscanf(fp, "%u", &temp))
       {
                *(test + count) = temp;
                count++;
        }
        printf("%u %u %u  %d\n", *(test+a), *(test + b), *(test + c), count);
        IVE_SRC_IMAGE_S Srcimg2;
        Srcimg2.enType = IVE_IMAGE_TYPE_U8C1;
        Srcimg2.u16Stride[0] = W;
        Srcimg2.u16Width = W;
        Srcimg2.u16Height = H;
        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Srcimg2.u32PhyAddr[0], (HI_VOID**)&Srcimg2.pu8VirAddr[0], "User1", HI_NULL, Srcimg2.u16Stride[0] * Srcimg2.u16Height);
        test = Srcimg2.pu8VirAddr[0];

        filename = "./2.txt";//地址,文件的路径
        FILE* fp2 = fopen(filename, "rb");
        count = 0;
        while (1 == fscanf(fp2, "%u", &temp))
        {
                *(test + count) = temp;
                count++;
        }
        printf("%u %u %u  %d\n", *(test + a), *(test + b), *(test + c), count);

        IVE_SRC_IMAGE_S Desimg;
        Desimg.enType = IVE_IMAGE_TYPE_U8C1;
        Desimg.u16Stride[0] = W;
        Desimg.u16Width = W;
        Desimg.u16Height = H;
        s32Ret = HI_MPI_SYS_MmzAlloc_Cached(&Desimg.u32PhyAddr[0], (HI_VOID**)&Desimg.pu8VirAddr[0], "User2", HI_NULL, Desimg.u16Stride[0] * Desimg.u16Height);

        IVE_HANDLE IveHandle;
        IVE_SUB_MODE_E mode = IVE_SUB_MODE_ABS;
        IVE_SUB_CTRL_S control;
        control.enMode = mode;
        HI_BOOL bInstant = HI_FALSE;

        s32Ret = HI_MPI_IVE_Sub(IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);
        test = Desimg.pu8VirAddr[0];
        printf("%u %u %u  %d\n", *(test + a), *(test + b), *(test + c), count);
}[/code]

还望您帮我看一下。调试的我都注释了就没贴上了了,
而且我发现是s32Ret = HI_MPI_IVE_Sub(IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);触发了Segmentation fault……惊呆了

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-19 15:33:44
认可0
HI_BOOL bInstant = HI_FALSE;

改成 HI_BOOL  bInstant = HI_TRUE; 试试

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-19 15:36:32
认可0
本帖最后由 zhuangweiye 于 2016-7-19 15:38 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34287&ptid=11996]zhuangweiye 发表于 2016-7-19 15:33[/url]
HI_BOOL bInstant = HI_FALSE;

改成 HI_BOOL  bInstant = HI_TRUE; 试试[/quote]

s32Ret = HI_MPI_IVE_Sub(IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);

这个调用出错了吧, 应该是

s32Ret = HI_MPI_IVE_Sub(&IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);

heiheiOo

0个粉丝

11

问答

0

专栏

0

资料

heiheiOo 2016-07-19 15:43:13
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34288&ptid=11996]zhuangweiye 发表于 2016-7-19 15:36[/url]
s32Ret = HI_MPI_IVE_Sub(IveHandle, &Srcimg, &Srcimg2, &Desimg, &control, bInstant);

这个调用 ...[/quote]

!!!天哪

要被自己蠢哭了:'(  编译不会报错一个不小心工作卡了一天:'(:'(

现在可以正常访问 了!感谢感谢!!!:'(:'(:'(

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-07-19 15:48:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34289&ptid=11996]heiheiOo 发表于 2016-7-19 15:43[/url]
!!!天哪

要被自己蠢哭了  编译不会报错一个不小心工作卡了一天
[/quote]

卡一天没关系

过了就好:lol

按理是该出warning的, 我一般编译warning一个也不放过, 必须全搞干净

heiheiOo

0个粉丝

11

问答

0

专栏

0

资料

heiheiOo 2016-07-19 16:14:28
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34290&ptid=11996]zhuangweiye 发表于 2016-7-19 15:48[/url]
卡一天没关系

过了就好
[/quote]

学习了……
应该编译的时候我没有 -wall 所以没什么warning……

上次是sample的makefile编译不了,参数层层传递也看不明白,自己写小程序尝试调用API函数,光编译的问题就卡了一天半,第一次正式接触linux真是举步维艰:'(

fy11

0个粉丝

0

问答

0

专栏

0

资料

fy11 2021-01-30 00:40:42
认可0

请问一下博主,你上面那个a,b,c定义的是干吗用的啊? 为什么需要和test相加啊?

或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区