Easyelectronics.ru

Электроника для всех
Текущее время: 23 сен 2020, 09:35

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Передача структуры в функцию.
СообщениеДобавлено: 27 апр 2016, 15:11 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
Есть глобальная структура.
Код:
typedef struct sLoggerData
{
    uint32_t timestamp;
    uint32_t data;
    uint16_t type;
    uint16_t crc;
}sLoggerData;

sLoggerData loggerData;


Ставлю точку останова в дебагере на строчке
Цитата:
LOGGER_Read(0, &loggerData);

Вижу адрес структуры - 0x20000548

Перехожу в саму функцию - аргумент передается правильно.
Код:
uint32_t LOGGER_Read(uint32_t log_to_read, sLoggerData * logData)  //тут адрес 0x20000548
{
    uint32_t log_addr = LOGGER_GetLogAddress(log_to_read);

    I2C_ChooseDevice(EEPROM_CHIP);

    I2C_ReadEeprom(log_addr, (uint8_t *)&logData, sizeof(sLoggerData));  //тут адрес 0x20009fd8
    uint32_t crc = crc16 (0, (uint8_t *)&logData, (sizeof(sLoggerData)-2));
    if (crc == logData->crc)
        return 1;
    else
        return 0;
}

А когда доходит до (uint8_t *)&logData тут при кастинге адрес меняется на 0x20009fd8. Наверно поэтому данные не считываются?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача структуры в функцию.
СообщениеДобавлено: 27 апр 2016, 15:21 
Старожил

Зарегистрирован: 17 фев 2016, 17:31
Сообщения: 243
нашел проблему - вместо (uint8_t *)&logData надо (uint8_t *)logData.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача структуры в функцию.
СообщениеДобавлено: 27 апр 2016, 15:23 
Старожил
Аватара пользователя

Зарегистрирован: 27 янв 2012, 17:24
Сообщения: 525
jenya77 писал(а):
uint32_t LOGGER_Read(uint32_t log_to_read, sLoggerData * logData) //тут адрес 0x20000548
{
uint32_t log_addr = LOGGER_GetLogAddress(log_to_read);

I2C_ChooseDevice(EEPROM_CHIP);

I2C_ReadEeprom(log_addr, (uint8_t *)&logData, sizeof(sLoggerData)); //тут адрес 0x20009fd8
uint32_t crc = crc16 (0, (uint8_t *)&logData, (sizeof(sLoggerData)-2));
if (crc == logData->crc)
return 1;
else
return 0;
}
[/code]
А когда доходит до (uint8_t *)&logData тут при кастинге адрес меняется на 0x20009fd8. Наверно поэтому данные не считываются?

Вы передаете в функцию указатель, а потом внутри передаете его (указателя) адрес.
Все правильно.
Если хотите передать адрес структуры, уберите амперсанд.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB