2017-04-25 6 views
0

Yocto Project를 사용하여 최소 라즈베리 파이 제로 이미지를 만들려고합니다. 나는 C에 익숙하지 않지만 컴파일 과정에서 'ws2811.c'를 컴파일하는 동안 왜 오류없이 raspbian OS가있는 다른 raspberry pi 2에 (전체 라이브러리)를 성공적으로 빌드 할 수 있는지 궁금합니다. 모든 힌트와 도움에 감사드립니다!Yocto Raspberry Pi - 설치 중 오류가 발생했습니다. rpi_ws281x 라이브러리

저장소 :

내 레시피 (저장소) 위치 'SCons는'루트에 구축을 위해 노력 붙어 있었다
https://github.com/jgarff/rpi_ws281x 

:

| DEBUG: Executing python function externalsrc_compile_prefunc 
| NOTE: python-ws2812: compiling from external source tree /home/astor/Documents/poky/rpi-build/workspace/sources/python-ws2812 
| DEBUG: Python function externalsrc_compile_prefunc finished 
| DEBUG: Executing shell function do_compile 
| scons: Reading SConscript files ... 
| scons: done reading SConscript files. 
| scons: Building targets ... 
| CC  ws2811.o 
| ws2811.c: In function 'setup_pwm': 
| ws2811.c:289:23: error: cast from pointer to integer of different size [-Werror=pointer-to-int-cast] 
|  dma_cb->dest_ad = (uint32_t)&((pwm_t *)PWM_PERIPH_PHYS)->fif1; 
|      ^
| cc1: all warnings being treated as errors 
| scons: *** [ws2811.o] Error 1 
| scons: building terminated because of errors. 
| WARNING: /home/astor/Documents/poky/rpi-build/tmp/work/arm1176jzfshf-vfp-poky-linux-gnueabi/python-ws2812/1.0+git999-r0/temp/run.do_compile.11838:1 exit 2 from 'scons' 
| ERROR: Function failed: do_compile (log file is located at /home/astor/Documents/poky/rpi-build/tmp/work/arm1176jzfshf-vfp-poky-linux-gnueabi/python-ws2812/1.0+git999-r0/temp/log.do_compile.11838) 

:

sudo scons 

Bitbake 레시피 작업 출력을 컴파일 그리고 내 제조법처럼 보이는이 방법 :

LICENSE = "BSD" 
LIC_FILES_CHKSUM = "file://LICENSE;md5=9dcf340793a1d73c5211edc8238767dc" 

SRC_URI = "git://github.com/richardghirst/rpi_ws281x.git;protocol=https" 

PV = "1.0+git${SRCPV}" 
SRCREV = "39afaac5f2b8b307d7d7b5f2f790fbb6759bda5e" 

S = "${WORKDIR}/git" 

DEPENDS = "swig-native" 

inherit scons setuptools 

do_compile_prepend() { 
    cd ${S}/ 
    scons 
    ${PYTHON} ${S}/python/setup.py install 
} 

답변

0
dma_cb->dest_ad = (uint32_t)&((pwm_t *)PWM_PERIPH_PHYS)->fif1; 

이는 정확하게 오류의 의미를 나타내는 것처럼 보입니다. 포인터를 32 비트 정수로 캐스트합니다. 포인터가 64 비트 일 때 안전하지 않습니다.

여분의 캐스트 (처음에는 크기가 큰 정수)를 사용하거나 -Wno-pointer-to-int-cast을 사용하여 경고를 음소거 할 수 있습니다. 그러나 이것은 거의 확실한 생각이 아닙니다. 대신에 주소는 32 비트 정수가 아닌 포인터로 저장되어야합니다.

다른 곳에서 컴파일이 성공한 이유는 무엇입니까? 저는 raspbian이 32 비트 OS (적어도 pi2 이상)라고 가정합니다. 따라서 포인터는 행운에 의해 올바른 크기가됩니다.

이것은 당연히 한 가지 더 많은 해결책을 제시합니다. 즉, 32 비트 yocto 이미지를 만들 수 있습니다. 그 코드를 수정하지 않지만 적어도 오류가 사라질 것이다 :)

+0

답장을 보내 주셔서 감사합니다 @jku! 불행히도 그러한 해결 방법 (** uint32_t **에서 ** uintptr_t **로 변경)은 해당 포인터를 32 비트에서 64 비트로 변경하려고했습니다. 레시피는 성공적으로 빌드되었지만 ** test ** 파일 (이 라이브러리를 사용하여 수정해야합니다)은 64 비트 용입니다. 나는이 scons 구성 파일에 문제가 있다고 가정하지만, 다른 한편으로는 ** EXTRA_OESCONS **를 사용하여 **이 매개 변수를 추가 할 수 없습니다. ** - Wno-pointer-to-int-cast ** scons 빌드 도구 - 그냥 여기처럼 : [http://cgit.openembedded.org/meta-openembedded/tree/meta-oe/recipes-support/mongodb/mongodb_git.bb?h=master]. – astor555

+0

당신이하고있는 일을 정말로 알지 못한다면 int-cast-to-int 캐스트 캐스트를하지 마십시오. 경고는 정상적인 경우에 문제를 일으킬 실제 문제에 대해 알려줍니다. – jku

+0

완전 동의하셨습니다! 내 가정은 사실입니까? Yocto 또는 Scons가 해당 라이브러리를 빌드하기 위해 적절한 크로스 컴파일러를 사용하지 않았습니까? – astor555