Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-ноя-18 09:20

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
СообщениеДобавлено: 2017-фев-22 09:38 
Не в сети

Зарегистрирован: 2015-апр-01 07:41
Сообщения: 12
Откуда: Пермь
Всем добра.
Сегодня совершенно внезапно код, который работает уже больше года, начал хандрить. При попытке записи в EEPROM на 1986ВЕ1Т проц начал падать в HardFault. Судя по отладчику, падение происходит при попытке вызова любой функции, помеченной как __RAMFUNC, то есть любой из MDR32F9Qx_eeprom.h. Раньше я такого не встречал. Код прошивки в последнее время изменялся, но ничего, что затрагивало бы работу с EEPROM, сделано не было.

Вот так делаю запись в EEPROM:
Код:
int8_t EEPROM_WriteData(uint32_t address, uint32_t bankSelector, void *data, uint32_t dataLen)
{
  // Проверить выравнивание по 4 байта
  if (dataLen % 4 != 0)
    return RESULT_BAD_ALIGNMENT;
  // Проверить границы памяти
  if (address+dataLen > 0x0801FFFC)
    return RESULT_BAD_MEMORY_RANGE;
  // Стереть страницу памяти
  EEPROM_ErasePage(address, bankSelector);
  // Записать новые данные
  uint32_t dataWords = dataLen / 4; // Количество слов данных
  uint32_t buffer = 0;
  for (uint32_t i = 0; i < dataWords; i++)
  {
    memcpy(&buffer, &(((char *)data)[i * 4]), sizeof(uint32_t));
    // Записать очередное слово
    EEPROM_ProgramWord(address + i * 4, bankSelector, buffer);
  }
  return RESULT_OK;
}


Разумеется, перед вызовом этой функции выключаю прерывания через __disable_irq();
Чтение производится просто по указателю, и оно работает нормально.
Есть какие-нибудь идеи?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-фев-22 12:39 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 622
Откуда: г. Санкт-Петербург
Перед вызовом функции убедитесь (при помощи отладчика), что код функции расположен в области RAM (0x2010_0000 - 0x2010_3fff)и не поврежден.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-фев-22 12:56 
Не в сети

Зарегистрирован: 2015-апр-01 07:41
Сообщения: 12
Откуда: Пермь
Функция EEPROM_ErasePage, на которой и происходит падение, имеет адрес 0x20000014.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-фев-22 13:01 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 622
Откуда: г. Санкт-Петербург
x-8973 писал(а):
Функция EEPROM_ErasePage, на которой и происходит падение, имеет адрес 0x20000014.

Код из этой области не может выполняться. Внимательней читайте спецификацию.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2017-фев-22 13:14 
Не в сети

Зарегистрирован: 2015-апр-01 07:41
Сообщения: 12
Откуда: Пермь
Проблема решена. В настройках линкера был указан icf-файл generic_cortex.icf. На днях слетали настройки проекта в Эклипсе, видимо, забыл поменять.


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

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


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

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


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB