У меня есть драйвер и код, которые работают в 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);
РЕДАКТИРОВАТЬ: я прикрепляю код ошибки по запросу:
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
. - person Elias Van Ootegem   schedule 19.10.2016_read
и_write
(толькоbus_read
илиi2c_read
и т. д.). Что заставляет вас думать, что компоновщик жалуется на этот код? - person TripeHound   schedule 19.10.2016BMM050_MDELAY_DATA_TYPE
этоuint_32t
и по какой-то причине выполнение bmm050.delay_msec = delay_cycles_ms работает нормально - person NitrogenAir   schedule 19.10.2016typedef
, а не неприглядные макросы! - person Lundin   schedule 19.10.2016typedef
, однако, поскольку они используют эти макросы везде в коде, мне также нужно было бы изменить его везде... - person NitrogenAir   schedule 19.10.2016_read
(вместо, скажем,bus_read
), то либо в коде, который вы показываете, есть ошибка вырезания и вставки (например, во втором определении макроса есть конечныйre
), либо какой-то вступают в силу другие макроэлементы (вы не определилиi2c
как пустую строку где-нибудь? ... случайные пробелы в ваших операторах присваивания?). - person TripeHound   schedule 19.10.2016