STM32H5移植zbar记录

这篇具有很好参考价值的文章主要介绍了STM32H5移植zbar记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ZBar是一种流行的二维码扫描和解码工具,它在嵌入式系统中拥有广泛的应用。在嵌入式系统中,我们面临着有限的资源和更严格的性能要求,因此,选择适当的库来完成特定的任务非常重要。
ZBar适用于各种嵌入式平台,包括ARM、x86和MIPS等处理器架构。它可以轻松地整合到各种嵌入式系统中,如智能家居设备、智能手机、平板电脑、远程控制设备、工业控制器等。
ZBar使用C/C++编写,具有高度优化的算法,能够快速准确地读取各种二维码和条形码,包括QR码、Data Matrix码、PDF417码、EAN-13码等等。同时,ZBar还支持自定义解码器,开发者可以根据自己的需求配置扫描器以实现更好的解码效果。
ZBar还具有非常灵活的API,可用于C/C++、Python、Java、Ruby等语言,开发人员可以根据自己的需求灵活选择相应的API。此外,ZBar还支持多种操作系统和平台,包括Linux、Windows、Mac OS X等。
总之,ZBar是一种非常有用的嵌入式二维码和条形码扫描库,它提供了高效的解码算法、可定制的解码器和灵活的API,能够轻松地满足嵌入式设备的扫描和解码需求。

这里感谢之前大佬移植zbar库到stm32,具体链接如下:https://www.cnblogs.com/greyorbit/p/8456814.html

移植步骤也很简单,按照博文把对应文件和头文件路径加入到工程中,然后使用图片数组转成灰度数据,在调用zbar既可以识别。

不过移植后会有一个问题,不能重复调用识别二维码,很容易内存就崩了。为了解决这个问题,让这个zbar库可以真正的用起来,不得不找到问题所在。

这里直观的看就是内存问题,奈何如果从源码直接去查找malloc和free的匹配所需时间太大,只能动态调试查找原因,所以第一步,我移植了rt-thread系统,使用rt的内存管理api。

移植rt-thread很方便,现在stm32代码生成工具cubemx可以直接添加rt-thread库,所以移植rt-thread系统很快。具体如下图:STM32H5移植zbar记录

移植完rt-thread后,就需要把zbar库中用到的malloc、calloc、free等操作函数换成 rt-malloc、rt-calloc、rt-free等,直接用全局搜索和替换。

替换后打开rt的内存调试功能宏定义:在rtdebug.h文件中

STM32H5移植zbar记录

更改后既可以看到打印内存申请和释放日志,以下为日志打印内容

malloc size 156
allocate memory at 0x2001008c, size: 168
malloc size 296
allocate memory at 0x20010134, size: 308
malloc size 32
allocate memory at 0x20010268, size: 44
malloc size 48
allocate memory at 0x20010294, size: 60
malloc size 2856
allocate memory at 0x200102d0, size: 2868
malloc size 52
allocate memory at 0x20010e04, size: 64
allocate memory at 0x20010e04, size: 64
malloc size 16
allocate memory at 0x20010e44, size: 28
malloc size 20
allocate memory at 0x20011388, size: 32
malloc size 60
allocate memory at 0x200113a8, size: 72
release memory 0x20011388, size: 32
malloc size 140
allocate memory at 0x200113f0, size: 152
release memory 0x200113a8, size: 72
malloc size 300
allocate memory at 0x20011488, size: 312
release memory 0x200113f0, size: 152
malloc size 620
allocate memory at 0x200115c0, size: 632
release memory 0x20011488, size: 312
malloc size 1260
allocate memory at 0x20011838, size: 1272
release memory 0x200115c0, size: 632
malloc size 2540
allocate memory at 0x20011d30, size: 2552
release memory 0x20011838, size: 1272
malloc size 20
allocate memory at 0x20011388, size: 32
malloc size 60
allocate memory at 0x200113a8, size: 72
release memory 0x20011388, size: 32
malloc size 140
allocate memory at 0x200113f0, size: 152
release memory 0x200113a8, size: 72
malloc size 300
allocate memory at 0x20011488, size: 312
release memory 0x200113f0, size: 152
malloc size 620
allocate memory at 0x200115c0, size: 632
release memory 0x20011488, size: 312
malloc size 1260
allocate memory at 0x20011838, size: 1272
release memory 0x200115c0, size: 632
malloc size 2540
allocate memory at 0x20012728, size: 2552
release memory 0x20011838, size: 1272
malloc size 352
allocate memory at 0x20011388, size: 364
malloc size 352
allocate memory at 0x200114f4, size: 364
malloc size 88
allocate memory at 0x20011660, size: 100
release memory 0x20011660, size: 100
malloc size 440
allocate memory at 0x20011660, size: 452
malloc size 440
allocate memory at 0x20011824, size: 452
malloc size 110, but align to 112
allocate memory at 0x200119e8, size: 124
release memory 0x200119e8, size: 124
malloc size 5792
allocate memory at 0x20013120, size: 5804
malloc size 80
allocate memory at 0x200119e8, size: 92
malloc size 20
allocate memory at 0x20011a44, size: 32
malloc size 32
allocate memory at 0x20011a64, size: 44
malloc size 5, but align to 8
allocate memory at 0x20011a90, size: 24
malloc size 8
allocate memory at 0x20011aa8, size: 24
release memory 0x20011aa8, size: 24
release memory 0x20011a90, size: 24
release memory 0x20011a64, size: 44
release memory 0x20011a44, size: 32
release memory 0x20011824, size: 452
release memory 0x20011660, size: 452
release memory 0x200114f4, size: 364
release memory 0x20011388, size: 364
malloc size 57600
allocate memory at 0x200147cc, size: 57612
malloc size 960
allocate memory at 0x20011388, size: 972
release memory 0x20011388, size: 972
malloc size 3, but align to 4
allocate memory at 0x20011388, size: 24
malloc size 360
allocate memory at 0x200113a0, size: 372
release memory 0x200113a0, size: 372
malloc size 360
allocate memory at 0x200113a0, size: 372
release memory 0x200113a0, size: 372
malloc size 176
allocate memory at 0x200113a0, size: 188
release memory 0x200113a0, size: 188
malloc size 176
allocate memory at 0x200113a0, size: 188
release memory 0x200113a0, size: 188
malloc size 552
allocate memory at 0x200113a0, size: 564
malloc size 552
allocate memory at 0x200115d4, size: 564
release memory 0x200113a0, size: 564
release memory 0x200115d4, size: 564
malloc size 52
allocate memory at 0x200113a0, size: 64
allocate memory at 0x200113a0, size: 64
malloc size 116
allocate memory at 0x200113e0, size: 128
malloc size 32

allocate memory at 0x20011460, size: 44
malloc size 32
allocate memory at 0x2001148c, size: 44
release memory 0x20011460, size: 44
release memory 0x2001148c, size: 44
malloc size 116
allocate memory at 0x20011460, size: 128
malloc size 8
allocate memory at 0x200114e0, size: 24
malloc size 70, but align to 72
allocate memory at 0x200114f8, size: 84
release memory 0x200113e0, size: 128
release memory 0x200113a0, size: 64
release memory 0x200114e0, size: 24
release memory 0x20011460, size: 128
malloc size 12
allocate memory at 0x200113a0, size: 24
malloc size 15, but align to 16
allocate memory at 0x200113b8, size: 28
release memory 0x200114f8, size: 84
malloc size 48
allocate memory at 0x200113d4, size: 60
release memory 0x20011388, size: 24
malloc size 4
allocate memory at 0x20011388, size: 24
malloc size 1, but align to 4
allocate memory at 0x20011410, size: 24
malloc size 31, but align to 32
allocate memory at 0x20011428, size: 44
malloc size 52
allocate memory at 0x20011454, size: 64
allocate memory at 0x20011454, size: 64
malloc size 8
allocate memory at 0x20011494, size: 24
malloc size 16
allocate memory at 0x200114ac, size: 28
release memory 0x20011494, size: 24
malloc size 24
allocate memory at 0x200114c8, size: 36
release memory 0x200114ac, size: 28
malloc size 32
allocate memory at 0x20011494, size: 52
release memory 0x200114c8, size: 36
malloc size 16
allocate memory at 0x200114c8, size: 28
release memory 0x20011428, size: 44
release memory 0x20011410, size: 24
release memory 0x200113b8, size: 28
release memory 0x200113a0, size: 24
release memory 0x200113d4, size: 60
release memory 0x200147cc, size: 57612
release memory 0x200119e8, size: 92
release memory 0x20013120, size: 5804
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
release memory 0x20010e04, size: 64
release memory 0x20011494, size: 52
release memory 0x200114c8, size: 28
release memory 0x20011454, size: 64
release memory 0x20010e44, size: 28
release memory 0x20010294, size: 60
release memory 0x20010268, size: 44
release memory 0x20010134, size: 308
release memory 0x20011d30, size: 2552
release memory 0x20012728, size: 2552
release memory 0x200102d0, size: 2868
release memory 0x2001008c, size: 168
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;56

 通过对申请和释放的对应关系,我们可以分析得出问题所在,zbar库在图片识别后释放了img->data指针,而这个指针是在zbar调用外部申请的空间,是不需要zbar内部释放的,具体代码如下:

int main(void)
{
  /* USER CODE BEGIN 1 */
    uint8_t test[]="start test\n";
    uint16_t i,j;
    int qr_img_width = 240;
    
    uint16_t Color;
    uint16_t cnt = 0;
    
    unsigned char *pic_rgb = (unsigned char *)gImage_test;
    unsigned char *pic_hd = NULL;
	unsigned char *pic_data = NULL;
    
    void * ptr_start;

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  //HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  //SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_ETH_Init();
  MX_ICACHE_Init();
  MX_LPUART1_UART_Init();
  //MX_USART3_UART_Init();
  MX_UCPD1_Init();
  MX_USB_PCD_Init();
  /* USER CODE BEGIN 2 */

  pic_data = rt_malloc(qr_img_width*qr_img_width);
  if(pic_data == NULL)
  {
      printf("malloc error\n");
      return 0;
  }
  else
  {
      printf("pic_data:0x%x\n",pic_data);
  }
    //memset(pic_data,0,qr_img_width*qr_img_width);
     pic_hd = pic_data;
    for(i=0;i<qr_img_width;i++)
    {
        for(j=0;j<qr_img_width;j++)		//将RGB565图片转成灰度
        {

            Color = (*pic_rgb) | (*(pic_rgb+1)<<8);
            *pic_hd = (((Color&0xF800)>> 8)*77+((Color&0x7E0)>>3)*150+((Color&0x001F)<<3)*29)/256;
            pic_hd++;
            pic_rgb++;
            pic_rgb++;
         
        }
    }
  

  /* USER CODE END 2 */
  

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      
      
      if( Zbar_Test((void* )pic_data,qr_img_width,qr_img_width) == 0 )
      {
          printf("zbar failed \n");
          //rt_free(pic_data);
      }
      else
      {
          cnt ++;
          printf("zbar ok \n");
          //rt_free(pic_data);
      }
      printf("zbar count;%d\n",cnt);
      //list_thread();
      rt_thread_mdelay(5000);
      
  }
  rt_free(pic_data);
  /* USER CODE END 3 */
}

  即pic_data灰度图片数据是不需要zbar释放的,但是zbar库中做了释放操作,代码如下:

inline void zbar_image_rt_free_data (zbar_image_t *img)
{
    if(!img)
        return;
    if(img->src) {
        /* replace video image w/new copy */
        assert(img->refcnt); /* FIXME needs lock */
        zbar_image_t *newimg = zbar_image_create();
        memcpy(newimg, img, sizeof(zbar_image_t));
        /* recycle video image */
        newimg->cleanup(newimg);
        /* detach old image from src */
        img->cleanup = NULL;
        img->src = NULL;
        img->srcidx = -1;
    }
    else if(img->cleanup && img->data) {
        if(img->cleanup != zbar_image_rt_free_data) {
            /* using function address to detect this case is a bad idea;
             * windows link libraries add an extra layer of indirection...
             * this works around that problem (bug #2796277)
             */
            zbar_image_cleanup_handler_t *cleanup = img->cleanup;
            img->cleanup = zbar_image_rt_free_data;
            cleanup(img);
        }
//传入图片为外部指针,zbar内部不用free此指针
//        else
//            rt_free((void*)img->data);
    }
    img->data = NULL;
}

  这里把这一句屏蔽,则可以解决问题,经过我测试,现在已经连续运行上千次

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4290
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4291
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4292
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4293
n = 1

decoded QR-Code symbol "EEWorld STM32H5"
len = 15
45 45 57 6F 72 6C 64 20 53 54 4D 33 32 48 35 zbar ok 
zbar count;4294

 工程文件下载:http://bbs.eeworld.com.cn/thread-1244434-1-1.html

 文章来源地址https://www.toymoban.com/news/detail-458656.html

到了这里,关于STM32H5移植zbar记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32H5开发(4)----开发板介绍

    STM32H503RBTx_LQFP64是STM32H5系列微控制器的一款出色评估套件,它采用了先进的40nm工艺制造,为开发者提供了卓越的性能和能效。主频高达250MHz的Arm® Cortex®-M33内核使其处理能力非常强大,可以轻松应对各种复杂的计算和任务。 这个评估套件在存储方面同样表现优异,拥有128k

    2024年02月13日
    浏览(44)
  • STM32H5开发(3)----电源控制&RCC

    VDDA = 1.62 V ~3.6 V :ADC/DAC的外部供电电源 VDDIO2 = 1.08 V ~ 3.6 V : 9 I/Os (PA8, PA9, PA15, PB3:8)的外部供电电源(仅WLCSP25封装) VDD = 1.71 V ~ 3.6 V: GPIO,内部电压调制器,系统复位模块,电源管理以及内部时钟的外部供电电源 VBAT = 1.2 V ~ 3.6 V :无VDD时通过功率切换开关给RTC/内部32kHz振荡器

    2024年02月15日
    浏览(62)
  • STM32H5培训(二)性能提升与功耗优化

    本篇主要介绍STM32H5系列的性能提升和功耗优化方面的具体表现。H5系列相比于F4系列在性能和功能上有较大的升级,包括更强的内核、更高的主频、更快的flash访问速度、更丰富的通信接口和先进的安全功能。H5系列的推出是为了帮助客户实现更多的应用,完成更复杂更高要求

    2024年01月16日
    浏览(52)
  • (STM32H5系列)STM32H573RIT6、STM32H573RIV6、STM32H573ZIT6嵌入式微控制器基于Cortex®-M33内核

    工业(PLC、工业电机控制、泵和压缩机) 智能家居(空调、冰箱、冰柜、中央警报系统、洗衣机) 个人电子产品(键盘、智能手机、物联网标签、跟踪设备) 智能城市(工业通信、照明控制、数字电源) 医疗和保健(CPAP和呼吸器、透析机、药丸分配器、电动病床) 1、ST

    2024年02月09日
    浏览(43)
  • STM32H5开发(7)----LCD显示TOF检测数据

    “自主模式”(Autonomous mode)通常指的是设备或系统能够在没有外部输入的情况下独立完成任务。对于传感器,如VL53L5,自主模式可能意味着传感器可以独立、定期地进行测量,而不需要来自主控制器或主机的每一次单独指令。 最近在弄ST的课程,需要样片的可以加群申请:

    2024年01月17日
    浏览(89)
  • STM32H5开发(6)----SPI驱动TFT-LCD屏

    在嵌入式领域,TFT-LCD屏是最常用的显示解决方案之一,因为它们提供了丰富的颜色和高分辨率的图像显示能力。STM32H5作为ST的高性能微控制器系列,具备了强大的处理能力和多种通信接口,非常适合于驱动TFT-LCD显示屏,该液晶屏st7796或者ILI9488驱动芯片,这两个屏幕都是兼容

    2024年02月05日
    浏览(41)
  • EtherCAT主站源码 基于STM32F407和STM32H743两款芯片 通过移植开源SOME主站代码,使两款芯片具有EtherCAT主站功能,支持DC同步功能

    EtherCAT主站源码基于STM32F407和STM32H743两款芯片,通过移植开源SOME主站代码,使两款芯片具有EtherCAT主站功能,支持DC同步功能。可支持汇川IS620N、松下A5B/A6B、欧姆龙G5系列、埃斯顿ProNet、迈信EP3E、台达A2-E,伟创SD700这几款EtherCAT总线伺服。支持的这些驱动器可以混用,主站自动

    2024年02月04日
    浏览(49)
  • Keil环境下CANopenNode移植到STM32问题记录(一)---printf重定向问题

    在直接将CANopenSTM32的示例工程直接移植到Keil环境下。 如果移植工程未实现printf函数重定向,则要注释掉log_printf下面的printf函数,使日志打印失效 在未在选项中勾选使用微库的时候,程序会卡死。调试会发现是卡死在了BKAP 0xAB处,网上搜索会有很多说明,是因为使用了print

    2024年02月13日
    浏览(45)
  • STM32CUBEMX配置STM32H750时钟480M时失败

    STM32H750最高的时钟是支持480M的,但是在CUBEMX新建工程配置始终时,却无法设置为480M。 解决方案如下: 原因是电压级别设置的问题。STM32CUBEMX默认设置的事VOS3,是不能支持480M运行的。 在H750的参考手册中有相应的描述 必须设置为0时,系统的时钟才能达到最高的480MHz ‍ ‍

    2024年02月16日
    浏览(57)
  • STM32H7使用外部flash运行程序

    在淘宝上买了一块核心板,使用的STM32H7B0VBT6。 客服很尽责,帮助了我很多。 H7系列的功能很强大,但是H7B0他有个问题,只有128k的内部flash,这么强大的芯片只有这么小的flash,想搞个RTTreadOS都不行。无奈,智能选择使用外部flash,好在核心板上有两个W25Q64,一个SPI,一个QS

    2023年04月18日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包