【发布时间】:2016-10-19 13:42:01
【问题描述】:
我有一个适用于 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究竟是什么。 -
您显示的所有代码都没有提及
_read和_write(仅bus_read或i2c_read等)。是什么让您认为链接器在抱怨此代码? -
我评论了我尝试分配功能的那两行,错误消失了。
BMM050_MDELAY_DATA_TYPE是uint_32t并且由于某种原因 bmm050.delay_msec = delay_cycles_ms 工作正常 -
为了喜欢混淆,请使用
typedef而不是 icky 宏! -
据我所知,要抱怨
_read(而不是bus_read),那么您显示的代码中可能存在剪切粘贴错误(例如,第二个宏定义有一个尾随re) 或其他一些宏内容正在启动(你没有在某处将i2c定义为空字符串?...在你的赋值语句中出现杂散空格?)。
标签: c struct function-pointers undefined-reference atmelstudio