智能车制作

标题: K60进入默认中断问题【野火鹰眼摄像头】 [打印本页]

作者: 厚朴    时间: 2013-3-27 18:24
标题: K60进入默认中断问题【野火鹰眼摄像头】
问题发过一遍,再描述一次,希望有同学能帮忙讨论一下。
http://www.znczz.com/thread-121072-1-1.html这是上次发的;
我是用的野火鹰眼摄像头采集的图像,也是用的野火库。
程序是这样的:
main()
{
      初始化;
     while(1)
{
      采集;
      一字节(8像素点)拆分成8字节,每字节一个像点,并发送;
}
}
问题是这样的,
如果程序不在while(1)里循环,而只采集并拆解一次,图像很正常可以在上位机显示。但如果放在while(1)里循环,程序循环运行6000多次就会停到  imgtemp     =   *(img_bin_buff++) ;(拆分里的一句)这句,在往下运行一步就进入默认中断,但中断号串口发不出来。 我觉得是指针地址读取时出了问题,但想不通为什么可以运行6000多次才进入默认中断,而不是第一次就进入。我看论坛里也有类似的情况,http://www.znczz.com/forum.php?mod=viewthread&tid=116190&reltid=106327&pre_pos=8&ext=CB
http://www.znczz.com/forum.php?mod=viewthread&tid=103895&reltid=106327&pre_pos=1&ext=
http://www.znczz.com/forum.php?mod=viewthread&tid=115464就不一一列举了,我看了他们的帖子觉得我的情况和他们的又不一样,所以请大家给指点一下,谢谢大家!

作者: 野火    时间: 2013-3-27 23:34
我觉得是内存越界了。img_bin_buff 的值是多少?可以通过调试器看的。
运行6000多次才进入默认中断,应该是超出了ram的地址范围,导致硬件上访
作者: 野火    时间: 2013-3-27 23:39
解压图像,可以用这个代码:

//压缩二值化图像解压(空间 换 时间 解压)
void img_extract(u8 * dst,u8 * src,u32 srclen)
{
        u8 colour[2]={255,0};        //0 和 1 分别对应的颜色
                                                        //注:野火的摄像头 0 表示 白色,1表示 黑色
        u8 tmpsrc;
        while(srclen --)
        {
                tmpsrc = *src++;
                *dst++ = colour[ (tmpsrc >> 7 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 6 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 5 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 4 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 3 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 2 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 1 ) & 0x01 ];
                *dst++ = colour[ (tmpsrc >> 0 ) & 0x01 ];
        }
}

调用时:
u8  nrf_buff[CAMERA_SIZE + MAX_ONCE_TX_NUM];     //预多
u8 *img_bin_buff = (u8 *)(((u8 *)&nrf_buff) + COM_LEN);  //二值化图像的buf指针,由于开头有 COM_LEN 个字节是留给校验,所以需要加 COM_LEN

u8         img_buf[CAMERA_W*CAMERA_H];                                        //非压缩的二值化图像

img_extract(img_buf , img_bin_buff, CAMERA_SIZE);
作者: 厚朴    时间: 2013-3-28 18:30
野火 发表于 2013-3-27 23:39
解压图像,可以用这个代码:

//压缩二值化图像解压(空间 换 时间 解压)

谢谢火哥,嗯,很有可能是你说的内存越界问题,这个中断太诡异了,printf也发不出调试信息。不过问题还是解决了。我又定义了一个数组,将img_bin_buff指向这个数组,最后拆分这个数组元素,就不进入中断了。慢慢研究下这个问题。

作者: 沙冰炒菜    时间: 2013-3-29 17:02
厚朴 发表于 2013-3-28 18:30
谢谢火哥,嗯,很有可能是你说的内存越界问题,这个中断太诡异了,printf也发不出调试信息。不过问题还是 ...

大哥,我用的也是野火鹰眼,怎么把指针里面的图像数据提取成二维数组,以便在上位机看啊。能分享一下你的代码吗

作者: 厚朴    时间: 2013-3-29 17:15
沙冰炒菜 发表于 2013-3-29 17:02
大哥,我用的也是野火鹰眼,怎么把指针里面的图像数据提取成二维数组,以便在上位机看啊。能分享一下你的 ...

上面火哥贴出的代码就可以,或者自己写个嵌套循环,把一个字节移位8次就行了。注意就是火哥数组img_bin_buff给NRF校验留了地址空间,上位机发的时候最好去掉,也就是把数组定义成[CAMERA_H*CAMERA_W]大小。

作者: 沙冰炒菜    时间: 2013-3-29 17:24
厚朴 发表于 2013-3-29 17:15
上面火哥贴出的代码就可以,或者自己写个嵌套循环,把一个字节移位8次就行了。注意就是火哥数组img_bin_b ...

火哥的这个真心看不懂。。大哥求指导530311266@qq.com[qq]530311266[/qq]

作者: 厚朴    时间: 2013-3-29 18:15
沙冰炒菜 发表于 2013-3-29 17:24
火哥的这个真心看不懂。。大哥求指导

指针你会吧?
作者: 沙冰炒菜    时间: 2013-3-29 18:22
厚朴 发表于 2013-3-29 18:15
指针你会吧?

就是指针问题,说是能当数组用,可是一维数组咋整成二维的呢。大哥给我一份你的代码吧

作者: 寒窗乍暖    时间: 2013-3-30 01:10
野火 发表于 2013-3-27 23:34
我觉得是内存越界了。img_bin_buff 的值是多少?可以通过调试器看的。
运行6000多次才进入默认中断,应该是 ...

火哥,我也遇到了类似的问题,请教过一位老师,他指点说是摄像头的帧数不要设置那么高,留下7S的时间来进行图像处理是不太够用的,我原来的程序跑的挺好但是加上LPT计数之后一上电复位单片机就要卡死一段时间,在while循环中我进行了解压图像、取中心测速以及相关功能,会不会是你所说的那种情况?
作者: 厚朴    时间: 2013-3-30 11:16
沙冰炒菜 发表于 2013-3-29 18:22
就是指针问题,说是能当数组用,可是一维数组咋整成二维的呢。大哥给我一份你的代码吧

for(total=0;total<size;total++)
    {
        imgtemp     =  nrf_buff[total];
        bitindex    = 0;  
    for(bitindex=0;bitindex<=7;bitindex++)
        {
          //  uart_putchar(UART0,bitindex);
            if( imgtemp & (0x01<<bitindex) )
            {
               // uart_putchar(UART0,0);
                img_buff[h][i*8+bitindex]=0;
            }
            else
            {     
                img_buff[h][i*8+bitindex]=1;
            //  uart_putchar(UART0,1);
            }
            //    uart_putchar(UART0,img_buf);


        }
      i++;

    if(i*8==CAMERA_W) {h++;i=0;}
    else   h=h;



作者: 野火    时间: 2013-4-2 21:51
寒窗乍暖 发表于 2013-3-30 01:10
火哥,我也遇到了类似的问题,请教过一位老师,他指点说是摄像头的帧数不要设置那么高,留下7S的时间来进 ...

你好,lptmr ,我们原先的例程用来做延时,所以你再用来 lptmr 计数,就会出问题,解决方法是替换成其他延时函数


作者: 野火    时间: 2013-4-2 21:57
沙冰炒菜 发表于 2013-3-29 17:02
大哥,我用的也是野火鹰眼,怎么把指针里面的图像数据提取成二维数组,以便在上位机看啊。能分享一下你的 ...

假设已经有一个 一维数组: u8 img[H*W];
先切换成二维数组来用,可以:u8 (pimg*)[H][W] = (  u8 (*) [H][W] )img;

pimg  是一个 指向二维数组的指针,你可以把它 当作 数组来用(是当作而已)


这个是C语言问题,如果你看不懂语法的话,百度 二维数组指针 查找相关的资料。对初学者而已,指针是一个比较难的知识点,但项目开发很常用的。


作者: 沙冰炒菜    时间: 2013-4-2 22:02
野火 发表于 2013-4-2 21:57
假设已经有一个 一维数组: u8 img[H*W];
先切换成二维数组来用,可以:u8 (pimg*)[H][W] = (  u8 (*) ...

恩,谢谢野火大大指导。我再试试
作者: oscarpanpan    时间: 2013-4-22 01:03
同求代码1743479982@qq.com




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2