1

IAR에서 작동하지만 Atmel Studio 7에서는 작동하지 않는 코드가 있습니다. 구조체 내부의 포인터에 함수를 할당하려고하면 ld returned 1 exit statusundefined reference to '_read' (또는 _write) 오류가 발생합니다. 내가 정의 된 두 개의 포인터가 다음과 같이 사용하는 데 필요한 드라이버에서 구조체의 함수 포인터가 작동하지 않습니까?

: 파일에서

#define BMM050_WR_FUNC_PTR \ 
    s8 (*bus_write)(u8, u8, \ 
    u8 *, u8) 

#define BMM050_RD_FUNC_PTR \ 
    s8 (*bus_read)(u8, u8, \ 
    u8 *, u8)re 

은 그들이 가지고로 정의 된 구조체는 다음과 같습니다

내 응용 프로그램에서
struct bmm050_t { 
    u8 company_id;/**<mag chip id*/ 
    u8 dev_addr;/**<mag device address*/ 

    BMM050_WR_FUNC_PTR;/**< bus write function pointer*/ 
    BMM050_RD_FUNC_PTR;/**< bus read function pointer*/ 
    void (*delay_msec)(BMM050_MDELAY_DATA_TYPE);/**< delay function pointer*/ 

    s8 dig_x1;/**< trim x1 data */ 
    s8 dig_y1;/**< trim y1 data */ 

    s8 dig_x2;/**< trim x2 data */ 
    s8 dig_y2;/**< trim y2 data */ 

    u16 dig_z1;/**< trim z1 data */ 
    s16 dig_z2;/**< trim z2 data */ 
    s16 dig_z3;/**< trim z3 data */ 
    s16 dig_z4;/**< trim z4 data */ 

    u8 dig_xy1;/**< trim xy1 data */ 
    s8 dig_xy2;/**< trim xy2 data */ 

    u16 dig_xyz1;/**< trim xyz1 data */ 
}; 

내가 시도 할 :

bmm050.bus_write = i2c_write; 
bmm050.bus_read = i2c_read; 

내 기능

은 정의로 :

int8_t i2c_write(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data, uint8_t count); 

int8_t i2c_read(uint8_t dev_addr, uint8_t reg_addr, uint8_t *reg_data, uint8_t count); 

편집 : 내가 물었다 같은 오류 코드를 부착하고있다 : 나는 당신의 i2c_writei2c_read 기능 printf, write, putc, puts, 또는 유사한 함수를 호출 추측하고

c:/program files (x86)/atmel/studio/7.0/toolchain/arm/arm-gnu-toolchain/bin/../lib/gcc/arm-none-eabi/5.3.1/../../../../arm-none-eabi/lib/armv6-m\libc.a(lib_a-writer.o): In function `_write_r': 
C:\Users\aba\Documents\Atmel Studio\7.0\Project1\Project1\Debug\writer.c(1,1): error: undefined reference to `_write' 
c:/program files (x86)/atmel/studio/7.0/toolchain/arm/arm-gnu-toolchain/bin/../lib/gcc/arm-none-eabi/5.3.1/../../../../arm-none-eabi/lib/armv6-m\libc.a(lib_a-readr.o): In function `_read_r': 
C:\Users\aba\Documents\Atmel Studio\7.0\Project1\Project1\Debug\readr.c(1,1): error: undefined reference to `_read' 
collect2.exe(0,0): error: ld returned 1 exit status 
+0

디버거를 사용하여 덤프, 백 트레이스 및 모든 것을 가져 와서 실제로 'BMM050_MDELAY_DATA_TYPE'이 무엇인지 살펴보십시오. –

+1

표시된 코드 중에'_read' 및'_write' ('bus_read' 나'i2c_read' 등)에 대한 언급이 없습니다. 링커가이 코드에 대해 불평하고 있다고 생각하는 이유는 무엇입니까? – TripeHound

+0

나는 함수와 오류를 할당하려고 시도하는 두 줄을 주석 처리했다. 'BMM050_MDELAY_DATA_TYPE'은'uint_32t'이고 어떤 이유로 bmm050.delay_msec = delay_cycles_ms가 잘 작동합니다. – NitrogenAir

답변

1

. 예? 당신이보고있는

오류는 래퍼 _write_r_read_r가 기본이 writeread 기능을 호출하기 위해 노력하고 찾을 수있는 없습니다. the newlib C library에 예를 들어 this discussion (sec. 6.4) 이러한 기능 구현을 참조하십시오.

bmm050.bus_write = i2c_writebmm050.bus_read = i2c_read 행을 주석 처리하면 오류가 사라집니다. 코드에 read 또는 write이 없기 때문입니다. 코드에서 i2c_read을 참조하지 않는 경우 (예 : 해당 줄을 주석으로 처리 한 경우) 링커는 컴파일 된 개체 파일에서 i2c_read을 제거 할 수 있습니다. i2c_read이 없으면 _read_r 또는 read이 필요하지 않으므로 링커 오류가 발생하지 않습니다.

그럼 어떻게해야합니까?

몇 가지 옵션을 시도해 보겠습니다.

  1. 지원 계약이있는 경우 BSP (Board-Support-Package) 공급 업체에 문의하십시오.
  2. Atmel Studio 소스/라이브러리를 검색하여 해당 하드웨어에 _read 또는 _write 구현을 제공하는지 확인하십시오. Atmel Studio에 보드 용 BSP가 포함되어 있다면이 기능이 포함될 수 있습니다. (I 아트멜 스튜디오 나 자신이없는, 아마 내가 한 경우에도 동일 BSP가없는 것, 그래서 더 구체적으로 보는 곳보다 당신을 말할 수 없습니다.)
  3. i2c_readi2c_write을 수정하여 장치의 I2C 레지스터에 직접 액세스하십시오. 이러한 함수에서 호출 한 C 라이브러리의 I/O 루틴을 제거 할 수 있으면 더 이상 _read 또는 _write이 필요하지 않습니다.
  4. 기존 구현을 찾지 못하거나 필요 없으면 구현을 온라인으로 확인하십시오. 예를 들어, this blog post (독일어)에는 _write의 샘플 구현이 포함됩니다. 스레드에있는 그 아래의 링크에 더하여, (독일어를 말하지 않더라도) 도움이 될 수 있습니다.
  5. 마지막으로, 사용자의 특정 대상에 의미있는 입력 및 출력을 수행 할 사용자 _read_write을 굴립니다. 나는 그것을 I2C로 모았지만, UART, LCD, 7 세그먼트 디스플레이, Nixie 등 무엇이든 원할 수도 있습니다. — 원하는 I/O 루틴을 작성하십시오! 이것은 기본적으로 # 3과 동일한 유형의 작업을 포함하지만 다른 상황에서 발생합니다.

은 참조 : 다른 플랫폼 _write_r 위해서는 자신의 OS를 (효과적으로) 구현의

  • this discussion에 비슷한 상황에 관한
    • this answer

      이 이야기 할 무언가를 가지고!
  • 관련 문제