这是avr studio的软件调试的这个问题 让我昨天弄到两点多 所以把它记录下来。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned char uint8_t;
typedef struct
{
char chip;
unsigned int addr;
int addr_length;
void *buffer;
unsigned int length;
} twi_pack_t;
unsigned char i2c_address[] =
{
0x6a,
0x6b,
0x34,
0x35,
};
int twi_master_read(const twi_pack_t *package)
{
unsigned char Status;
unsigned char * Data;
unsigned char sla;
unsigned char reg;
unsigned int len;
sla = package->chip;//把0x4b 传给sla 可是在avr studio中 总是出错 这个地方传不过来
reg = package->addr;
Data = package->buffer;
len = package->length;
return sla;
}
unsigned char address_slave(void)
{
uint8_t i;
uint8_t status;
static uint8_t *rxtmp;
twi_pack_t packet;
packet.chip = i2c_address[1];//把0x4b给chip
packet.addr = 0;
packet.addr_length = 0;
packet.buffer = (void*) rxtmp;
packet.length = 1;
status = twi_master_read(&packet);//通过结构体变量完成数据传递
return status;
}
int main()
{
unsigned char i;
i =address_slave();
printf("%x/n",i);
return 0;
}
这段代码是在我的工程里面截取的一段(编译环境ICC avr),在vc++ 6.0,keil中调试没问题 ox6b 可以成功的通过结构体变量packet.chip 传递给twi_master_read 函数中的 sla 变量 ,可是在avr studio里软件仿真时就不行 sla接不到正确的数,在函数twi_master_read中结构体的成员都没有传递进来, 然后我把 twi_master_read(const twi_pack_t *package) 中的 const 限定符 去掉 就ok了。
总结:avrstudio 软件仿真 在这个问题上有些缺陷 ,不过为保证 在iccavr中编译生成的 机器码中 出现这种错误而导致 功能不良 我只能选择先把const去掉 等功能ok后 在加上const 重新烧录 看实际效果。

本文记录了一段在AVRStudio中遇到的软件调试问题,在特定环境下编译时,使用结构体进行参数传递出现问题,通过去除const限定符解决了该问题。
847





