IAR에서 작동하지만 Atmel Studio 7에서는 작동하지 않는 코드가 있습니다. 구조체 내부의 포인터에 함수를 할당하려고하면 ld returned 1 exit status
및 undefined 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_write
및 i2c_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
디버거를 사용하여 덤프, 백 트레이스 및 모든 것을 가져 와서 실제로 'BMM050_MDELAY_DATA_TYPE'이 무엇인지 살펴보십시오. –
표시된 코드 중에'_read' 및'_write' ('bus_read' 나'i2c_read' 등)에 대한 언급이 없습니다. 링커가이 코드에 대해 불평하고 있다고 생각하는 이유는 무엇입니까? – TripeHound
나는 함수와 오류를 할당하려고 시도하는 두 줄을 주석 처리했다. 'BMM050_MDELAY_DATA_TYPE'은'uint_32t'이고 어떤 이유로 bmm050.delay_msec = delay_cycles_ms가 잘 작동합니다. – NitrogenAir