Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 2016-окт-19 14:20 
Не в сети

Зарегистрирован: 2009-июл-20 10:04
Сообщения: 76
Откуда: Волгодонск
В примерах программ и в документации к 1986ВЕ9х везде упоминается, что во время операций записи или стирания флэш-памяти программа должна выполняться не с самой памяти программ, а из ОЗУ или внешней памяти. Но то же самое говорится и в документации по работе с памятью в процессорах stm32x: "...During a write operation to the Flash memory any attempt to read the Flash memory will stall the bus. The read operation will proceed correctly once the write operation has completed. This means that code or data fetches cannot be made while a write/erase operation is ongoing."
Но тем не менее, я нигде не вижу в прогрммах, как во время записи в память программа могла загружаться не из самой же флэш-памяти:
Код:
FLASH->CR |= FLASH_CR_PG;
        *(volatile uint16_t*)address = data;
        // подождем завершения операции
        status = wait(program_timeout);

На основе примера из документа AN2594 к их процессору у меня самого успешно работает целый ряд программ, и нареканий не возникало. При этом я не делал никаких специальных усилий по загрузке программы из ОЗУ, я даже до недавних пор (пока не столкнулся с миландровским 1986ВЕ92) и не подозревал, что у gcc есть такая возможность.

Объясните, кто может, в чем тут фокус? Может быть, пися (пиша?) программы для stm32x, я каким-то образом случайно не наступал на эти грабли. Хотелось бы и счас понять, как это получается.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-окт-19 16:44 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1178
Откуда: Тула
Пользуйтесь файлами стандартной библиотеки MDR32F9Qx_eeprom.h/MDR32F9Qx_eeprom.c, не забыв уточнить дефайн FLASH_PROG_FREQ_MHZ и указать, что код из MDR32F9Qx_eeprom.c должен исполняться из RAM.

Про импортные тех.описания забудьте совсем.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-окт-19 16:53 
Не в сети

Зарегистрирован: 2009-июл-20 10:04
Сообщения: 76
Откуда: Волгодонск
prostoRoman писал(а):
Про импортные тех.описания забудьте совсем.

Да это понятно. Непонятно только, почему в том случае получалось? Может быть, почему-либо те функции сами по себе оказывались в ОЗУ?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-окт-19 17:02 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1178
Откуда: Тула
Вероятно потому, что были объявлены подобным образом:
Код:
__RAMFUNC static void ProgramDelay(uint32_t Loops) __attribute__((section("EXECUTABLE_MEMORY_SECTION")));

/**
  * @brief  Program delay.
  * @param  Loops: Number of the loops.
  * @retval None.
  */
__RAMFUNC static void ProgramDelay(uint32_t Loops)
{
  volatile uint32_t i = Loops;
  for (; i > 0; i--)
  {
  }
}


Либо Вы изменяли уже готовый проект -- демонстрационный пример. Тогда сохранялись необходимые настройки IDE. Возможны и другие варианты.

В любом случае очень полезно заглядывать в исходники используемых библиотек.

_________________
сочувствующий…


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

Зарегистрирован: 2014-окт-02 16:05
Сообщения: 31
igorbounov писал(а):
...During a write operation to the Flash memory any attempt to read the Flash memory will stall the bus. The read operation will proceed correctly once the write operation has completed. This means that code or data fetches cannot be made while a write/erase operation is ongoing."
Но тем не менее, я нигде не вижу в прогрммах, как во время записи в память программа могла загружаться не из самой же флэш-памяти

Я, если честно, не вижу тут никакого противоречия. То, что шина стопориться означает только то, что шина стопориться. Я понял это так, что когда идет запись, процессор просто не может считать инструкцию и ждет. И все. Это, конечно, тоже важно - так можно прерывание пропустить, но ничего само по себе не ломается.
В аппноте нигде не написано, что код нужно помещать в RAM и в SPL для stm нигде нет никаких отметок вида __attribute__((section("EXECUTABLE_MEMORY_SECTION")));

В даташите на миландр же написано явно:
Цитата:
В режиме программирования Flash-память программ не может выдавать инструкции и данные процессору, поэтому перевод памяти в режим программирования (установка бита CON = 1) возможен только программой, исполняемой из памяти, установленной на внешней системной шине, или ОЗУ.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-янв-10 13:11 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
Про исполнение кода из ОЗУ, понятно, а как быть с работой периферии и прерываниями, если они нужны во время, например стирания страницы флеш-памяти, - что необходимо дополнительно разместить в оперативной памяти (на примере Keil) - таблицу векторов (в том числе обработчики HardFault () и т.п.) или весь Startup.s или весь код (компиляторы подшивают ещё библиотеки armlib, cpplib, scatter-файлы и прочие системные вещи) ??? :? :roll: Хорошо бы это осветить в техническом описании на микроконтроллер... :!:

_________________
Hack the Planet!


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

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 177
Откуда: ПКК "Миландр"
Цитата:
В режиме программирования программный код должен выполняться из области системной шины или ОЗУ. Выполнение программного кода из Flash-памяти программ в режиме программирования невозможно.


Вроде понятно написано, что обращений к памяти EEPROM в момент работы контроллера EEPROM быть не должно. Все остальное из этого следует.

Отключаются прерывания - чтобы не начал исполняться код обработчиков расположенных в EEPROM (в процессе работы контроллера EEPROM). Если таблица прерываний находится в ОЗУ (выборка адреса обработчика), как и весь код который вызывается в обработчиках прерываний, то проблем возникнуть не должно.

_________________
Отдел технической поддержки support@milandr.ru


Последний раз редактировалось Vasiliy 2018-янв-10 18:01, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-янв-10 16:12 
Не в сети
Аватара пользователя

Зарегистрирован: 2011-авг-21 18:55
Сообщения: 253
Vasiliy! Merci за информацию :D

_________________
Hack the Planet!


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

Зарегистрирован: 2016-окт-14 19:39
Сообщения: 44
Откуда: СПБ
R Max писал(а):
Про исполнение кода из ОЗУ, понятно, а как быть с работой периферии и прерываниями, если они нужны во время, например стирания страницы флеш-памяти, - что необходимо дополнительно разместить в оперативной памяти (на примере Keil) - таблицу векторов (в том числе обработчики HardFault () и т.п.) или весь Startup.s или весь код (компиляторы подшивают ещё библиотеки armlib, cpplib, scatter-файлы и прочие системные вещи) ??? :? :roll: Хорошо бы это осветить в техническом описании на микроконтроллер... :!:

Да чего тут освещать - при флеши в режиме программирования _все_ должно выполняться только из ОЗУ.
Весь startup нельзя помещать в ОЗУ - процессор не запустится, вектор сброса не найдет. А пока программа внутри main(), то из него никакой код и не выполняется. В scatter вообще кода нет.
Проще всего проектировать так, чтобы на время работы с флеш прерывания и библиотечные функции (кроме MDR32F9Qx_eeprom, которую положить в ОЗУ) вообще не использовать. Иначе придется таблицу векторов, обработчики прерываний и библиотеки переносить в ОЗУ (вектора только на Cortex-M3 можно переносить).


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

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


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

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


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

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