二维码开源库ZBar-MDK STM32F429移植

前两篇文章已经实现ZBar在Windows平台下的编译和使用,本文将介绍如何把ZBar移植到STM32F429,IDE使用MDK。

1. MDK工程设置

(1)不勾选Use MicroLIB ,使用ISO C。
如MDK 帮助文档关于MicroLIB的介绍,故在硬件资源允许的情况还是优先使用ISO C。

(2)勾选C99 Mode,因为ZBar源码是基于C99的

(3)不勾选Use Memory Layout From Target Dialog,使用自定义Scatter File

2.工程目录结构

3. ZBar源码修改地方

由于MDK使用的编译器不是GCC,故不能支持一些特殊GCC语法和相应的C库函数。
(1) error.c和error.h文件中strdup函数报错。
处理方法:屏蔽该函数相关代码或者自己实现strdup函数
(2) 屏蔽img_scanner.c文件中的

.....
//#include <unistd.h>
//#include <time.h> /* clock_gettime */
//#include <sys/time.h> /* gettimeofday */
....
// struct timeval abstime;
// gettimeofday(&abstime, NULL);
// iscn->time = (abstime.tv_sec * 1000) + ((abstime.tv_usec / 500) + 1) / 2;
.....

(3) GCC默认void*为char*,MDK的编译器对void指针的加减操作当作错误处理
处理方法:把void指针强制转换为char指针

4. 系统存储空间分配

对于STM32来说ZBar对Heap消耗较大,经测试需要2M左右的Heap,具体ZBar对RAM的要求暂时没深究。
Scatter file 如下

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
    ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
    *.o (RESET, +First)
    *(InRoot$$Sections)
    .ANY (+RO)
    }

    RW_IRAM_DATA 0x20000000 0x00030000 {  ; RW data
    .ANY (+RW +ZI)
    }

    ARM_LIB_STACK 0x20030000 EMPTY -(0x20030000 - ImageLimit(RW_IRAM_DATA))  ; Stack region growing down
    { }

    RW_ERAM 0xD0000000 0x00800000 { ;Extern SDRAM
    main.o(+RW +ZI)
    }

    ARM_LIB_HEAP +0 EMPTY  (0xD0800000 - ImageLimit(RW_ERAM)) ; Heap region growing up
    { }
}

5. 修改默认的启动文件startup_stm32f429_439xx.s

(1) Stack和Heap已经在Scatter文件中指定,故屏蔽startup_stm32f429_439xx.s中Stack和Heap的相关代码。

;Stack_Size      EQU     0x00000400

                ;AREA    STACK, NOINIT, READWRITE, ALIGN=3
;Stack_Mem       SPACE   Stack_Size
;__initial_sp

;; <h> Heap Configuration
;;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;; </h>

;Heap_Size       EQU     0x00000200

                ;AREA    HEAP, NOINIT, READWRITE, ALIGN=3
;__heap_base
;Heap_Mem        SPACE   Heap_Size
;__heap_limit

......

                 ;IF      :DEF:__MICROLIB

                 ;EXPORT  __initial_sp
                 ;EXPORT  __heap_base
                 ;EXPORT  __heap_limit

                 ;ELSE

                 ;IMPORT  __use_two_region_memory
                 ;EXPORT  __user_initial_stackheap

;__user_initial_stackheap

                 ;LDR     R0, =  Heap_Mem
                 ;LDR     R1, =(Stack_Mem + Stack_Size)
                 ;LDR     R2, = (Heap_Mem +  Heap_Size)
                 ;LDR     R3, = Stack_Mem
                 ;BX      LR

                 ;ALIGN

                 ;ENDIF

(2) 把Scatter文件指定的Stack基地址赋给向量表的首地址

.....
                IMPORT  |Image$$ARM_LIB_STACK$$Base|
__Vectors       DCD     |Image$$ARM_LIB_STACK$$Base|;__initial_sp               ; Top of Stack
.....

(3) 因为Heap分配在外部SDRAM中,故在进入__main前需初始化SDRAM

....
        IMPORT  SystemInit
        IMPORT  SDRAM_Init
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =SDRAM_Init
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP
....

6.测试代码

  之前Windows平台下的测试例程是直接读取PNG格式的二维码,在STM32F429平台下没有移植文件系统和PNG解码库,为了简单起见,直接把待

测试的二维码图片转换为二值化数组,然后把该该数组传给ZBar。

#include "type_define.h"
#include "usart.h"
#include "sdram.h"
 #include "zbar.h"
#include "image.h"
//280X280的二维码图片灰度值数组
const uint8_t image_data_buf[] = {
.......
};
int Zbar_Test(void* raw, int width, int height)
{
      zbar_image_scanner_t *scanner = NULL;
    /* create a reader */
    scanner = zbar_image_scanner_create();

    /* configure the reader */
    zbar_image_scanner_set_config(scanner, 0, ZBAR_CFG_ENABLE, 1);

    /* obtain image data */
    //int width = 0, height = 0;
    //void *raw = NULL;
    //get_data("barcode.png", &width, &height, &raw);

    /* wrap image data */
    zbar_image_t *image = zbar_image_create();
    zbar_image_set_format(image, *(int*)"Y800");
    zbar_image_set_size(image, width, height);
    zbar_image_set_data(image, raw, width * height, zbar_image_free_data);

    /* scan the image for barcodes */
    int n = zbar_scan_image(scanner, image);
    printf("n = %d\r\n", n);
    /* extract results */
    const zbar_symbol_t *symbol = zbar_image_first_symbol(image);
    for(; symbol; symbol = zbar_symbol_next(symbol)) {
        /* do something useful with results */
        zbar_symbol_type_t typ = zbar_symbol_get_type(symbol);
        const char *data = zbar_symbol_get_data(symbol);
        printf("decoded %s symbol \"%s\"\r\n",
               zbar_get_symbol_name(typ), data);
        printf("len = %d\r\n",strlen(data));
        for(int k=0; k<strlen(data); k++)
        {
            printf("%X ", (uint8_t)data[k]);
        }
    }

    /* clean up */
    zbar_image_destroy(image);
    zbar_image_scanner_destroy(scanner);

    return(0);
}      

int main(void)
{
    Usart_Init();
    printf("Hello CJS\r\n ");
    Zbar_Test((void* )image_data_buf,280,280);
    while(1)
    { 

    }
  return 0;
}

7.运行结果

编译下载到STM32F429后,运行结果如下

到此,ZBar已经能正常在STM32F429上运行了,但有点小问题,如上图,会检测到decoded I2/5 symbol "",原因未知。

原文地址:https://www.cnblogs.com/greyorbit/p/8456814.html

时间: 2024-10-08 21:30:06

二维码开源库ZBar-MDK STM32F429移植的相关文章

二维码开源库zbar、zxing使用心得

首先说明我的测试场景是“识别打印在纸上的二维码”,在扫描结果中寻找二维码并进行识别,而不是直接让摄像头对着二维码扫描. zbar和zxing用的都是自己从github上clone的c++源码/接口编译出来的dll,都是默认参数 再说结论:测了大概几千张图片,两个库的准确率差不多(由于图片场景的多样性,确切的准确率数字也没有什么意义),但是zbar的速度要快很多,大概是zxing的4-5倍.其实两个库的准确率都不太如人意,稍微模糊一点就无法识别,甚至有一些不模糊的图像也识别不出.相比之下,微信的识

C++二维码相关库编译

一.瞎想 坐在地铁上闲来无聊,突然想到了二维码,顺手就百度了下相关的资料,目前C++二维码相关的库不多,也就zbar(开源中国上下了半天也没下载下来).zxing,不过这两个库据说都是解析二维码的,不能生成二维码,这个是对于C++而言,如果你是搞C#或者java的,那么恭喜你,你可以直接使用zxing库来完成生成和解析二维码,具体参看 C++生成二维码总结,这篇文章主要是总结了下当前二维码相关的第三方库,个人觉着不错.QZXing是基于qt将zxing进行了封装 zxing实现二维码生成和解析,

Android二维码开源项目zxing用例简化和生成二维码、条形码

上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的测试程序:CaptureActivity比较复杂,我只要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自不必说了. 自带的例子,目录结构如下: 修改后的程序目录结构,去掉了很多功能,如果分享.设置等. 先上效果图          扫描ZXing生成的条形码和二维码结果 扫描界面 扫描商品的条码 整个程序只修改了以下两个类,其它都是直接从原来的Demo中复制出来的 生成二维码的代码 /** * 生成二维

个性二维码开源专题 目录

目录 个性二维码开源专题<前序> 个性二维码开源专题<介绍篇> 个性二维码开源专题<基础篇> 个性二维码开源专题<替换元素点> 个性二维码开源专题<替换定位点> 个性二维码开源专题<液化/圆角/效果> 个性二维码开源专题<前背景> 个性二维码开源专题<后背景> 个性二维码开源专题<套入模版> . . . 个性二维码开源专题 目录,布布扣,bubuko.com

个性二维码开源专题&lt;基础篇&gt;

二维码原理介绍: 二维码为什么是黑白相间的?黑色表示二进制的"1",白色表示二进制的"0" "我们之所以对二维码进行扫描能读出那么多信息,就是因为这些信息被编入了二维码之中."黄海平说,"制作二维码输入的信息可以分成三类,文本信息,比如名片信息:字符信息,比如网址.电话号码:还有图片信息,甚至还可以包括简短的视频."数据信息是怎么被编入的呢?信息输入后,首先要选择一种信息编码的码制.现在常见的二维码都是以QR码作为编码的码制.

个性二维码开源专题&lt;替换定位点&gt;

基础方法: ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // Forebrush: // 填充色 // // rect: // 区域 // // en_fillshape: // 填充形状枚举 // // fillshpape: // 填充形状参数 // // Backbrush: // 背景色 // // isOutside: // 是否外修改 public

个性二维码开源专题&lt;液化/圆角/效果&gt;

基础方法: ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // Forebrush: // 填充色 // // rect: // 区域 // // en_fillshape: // 填充形状枚举 // // fillshpape: // 填充形状参数 // // Backbrush: // 背景色 // // isOutside: // 是否外修改 public

DM二维码识别库DMDECODER的使用--MFC例程

DM码和QR码是当今比较主流的二维码,其中QR码容量大,容量密度为16kb,DM码容量要小一点,可在仅仅25mm²的面积上编码30个数字,但是DM码的容错率更高,所以实际的工业生产中经常使用DM码作为产品的标签. DMDECODER是一款比较好用的DM码解析软件,包含有一个DLL和一个lib,使用这个库也比较容易我们先看组成 使用该库第一步是导入库路径和库函数如下 //导入dll #define DLL_EXPORT __declspec(dllexport) extern "C" D

个性二维码开源专题&lt;介绍篇&gt;

由C#编写的个性二维码底层,已应用到 码晒客/疯狂创意二维码等项目上,并获得多项软件著作专利. 疯狂创意二维码 疯狂创意二维码是可用于生成风格独特的个性化二维码生成器,用户可以将目标信息输入到二维码生成器中,生成相应的个性二维码,然后输出为相应图片格式并保存.输入信息可以是:数字.网址.文字.微信.微博以及名片信息等,用户可以将想要生成二维码的信息批量导入,进行自动化批量生成导出处理. 码晒客 码晒客,由元创信息科技倾力打造,中国首款二维码个性制作神器,史上最能晒的二维码制作软件.该软件具备自动