|
В чём особенность программирования MK по JTAG? |
|
|
|
Dec 6 2017, 07:23
|
Частый гость
 
Группа: Участник
Сообщений: 168
Регистрация: 25-08-05
Пользователь №: 7 944

|
Отлаживаю однотипные модули на базе 1986ВЕ1Т (Миландр). В устройстве имеется FLASH 1636РР2АУ (тоже Миландр). Модуль должен перепрограммироваться по шине CAN. Процесс идёт так: новая прошивка записывается в 1636РР2АУ, проверяется контрольная сумма, после чего контроллер копирует её из 1636РР2АУ во внутреннюю FLASH, перезагружается командой NVIC_SystemReset() и далее работает. Проблемы возникли с одним из 5 модулей: после перепрошивки по CAN он намертво зависает, хотя если прошивать его через программатор по JTAG, то работает нормально. Пробовал проводить перепрошивку под отладчиком: новая программа записывается во FLASH контроллера без дефектов, происходит перезагрузка, программа запускается, но после выполнения нескольких операций уходит в HardFault. Вопрос: в чём особенность программирования по JTAG по сравнению с перепрошивкой контроллером? В чём может быть причина такого сбоя ?
Сообщение отредактировал NikP - Dec 6 2017, 07:36
|
|
|
|
|
 |
Ответов
|
Dec 8 2017, 10:47
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(NikP @ Dec 8 2017, 09:22)  С проблемой разобрался. Когда стал проходить прошивку после перезагрузки по шагам, то выяснилось, что затык происходит при обращении к флэш при старте программы. Сделал пару задержек в этом куске программы, и всё заработало. Вероятно, после перезагрузки перепрошитой программы эта часть отрабатывается быстрее, чем при записи программы в МК по JTAG. Да уж.... "разработчик".... Вставил пару костылей и "решил проблему". До следующего костыля. Цитата(Genadi Zawidowski @ Dec 7 2017, 13:19)  не-а... Для ускорения процесса все-таки обычно работой с FLASH занимается flash loader, который да, напрямую, помещается в память программируемого девайса. Хотя это не SEGGER... А зачем? Если JTAG имеет доступ ко всему адресному пространству МК, значит он имеет доступ и к регистрам отвечающим за интерфейс программирования FLASH. А значит он (имея доступ к ОЗУ) может загрузить туда содержимое очередного прошиваемого блока и (имея доступ к регистрам управления прошивкой) - стартовать через эти регистры операцию записи во флешь. Цитата(VladislavS @ Dec 7 2017, 17:43)  Не ускорять, а унифицировать. Флэшек и способов их подключения в природе несметное количество, а протокол с флэшлоадером строго определён. Унифицировать можно написав скрипт для каждого МК, выполняющийся на компе и знающий адреса и номера битов в регистрах программирования флешь, находящихся в области периферийных регистров МК. А доступ ко всему ОЗУ и всем регистрам отлаживаемого МК эмулятор имеет. В составе IAR видел директорию с кучей *.ddf-файлов для каждого семейства поддерживаемых МК - возможно это оно и есть. И написать такой скрипт будет проще, чем писать загрузчик, выполняющийся на самом МК.
|
|
|
|
|
Dec 8 2017, 12:15
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (jcxz @ Dec 8 2017, 12:47)  Унифицировать можно написав скрипт для каждого МК, выполняющийся на компе и знающий адреса и номера битов в регистрах программирования флешь, находящихся в области периферийных регистров МК. А доступ ко всему ОЗУ и всем регистрам отлаживаемого МК эмулятор имеет. Это будет очень медленно и печально. Поэтому в ОЗУ грузится некиая подпрограмма копирования блоков из ОЗУ во флешь, отладчик кладет в ОЗУ содержимое сразу большого блока (страницы) флешь, ставит точку останова на конец этой подпрограммы и запускает ее. QUOTE (jcxz @ Dec 8 2017, 12:47)  В составе IAR видел директорию с кучей *.ddf-файлов для каждого семейства поддерживаемых МК - возможно это оно и есть. Нет, это device description file - файлы описания периферийных регистров и их битов. То, что я описал, у IAR называется (раньше называлось, сейчас - не знаю) flash loader и была отдельная галочка "use flash loader". QUOTE (jcxz @ Dec 8 2017, 12:47)  И написать такой скрипт будет проще, чем писать загрузчик, выполняющийся на самом МК. В openocd реализованы оба варианта. Разность в скорости записи на порядки. "Лучше день потерять, потом долететь за пять минут!".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 8 2017, 16:16
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Сергей Борщ @ Dec 8 2017, 14:15)  Это будет очень медленно и печально. Поэтому в ОЗУ грузится некиая подпрограмма копирования блоков из ОЗУ во флешь, отладчик кладет в ОЗУ содержимое сразу большого блока (страницы) флешь, ставит точку останова на конец этой подпрограммы и запускает ее. Программирование блока (страницы) флешь по времени - это несколько мсек. Чтобы стартовать запись такого блока в любом МК нужно выполнить считанное кол-во записей в регистры IO. Неужто длительность этих записей такая большая, что занимает хотя-бы миллисекунды?? Очевидно что нет: в одном из моих текущих проектов я отлаживаю ПО в SDRAM (подключенной к МК). Перед загрузкой программирую регистры контроллера внешней шины для чего написал соответствующий .mac-файл и подсунул IAR. В этом файле написан срипт настройки контроллера внешней шины МК в несколько десятков записей в регистры IO. И времени его выполнения я на глаз не замечаю - грузится примерно как во внутреннюю ОЗУ. Цитата(Сергей Борщ @ Dec 8 2017, 14:15)  То, что я описал, у IAR называется (раньше называлось, сейчас - не знаю) flash loader и была отдельная галочка "use flash loader". В openocd реализованы оба варианта. Разность в скорости записи на порядки. "Лучше день потерять, потом долететь за пять минут!". У меня нигде эта галка не установлена. Скорость записи какая? Она в первую очередь определяется временем стирания блоков флешь. Типичное время стирания одного блока в текущем МК == 5 секунд! На фоне этого даже миллисекунды незаметны, не говоря уже о микросекундах, которые очевидно занимают операции записи регистров через JTAG.
|
|
|
|
|
Dec 8 2017, 16:40
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (jcxz @ Dec 8 2017, 18:16)  Программирование блока (страницы) флешь по времени - это несколько мсек. Чтобы стартовать запись такого блока в любом МК нужно выполнить считанное кол-во записей в регистры IO. Кроме NXP бывают и другие процессоры. и там надо почитать регистр в ожидании готовности, потом записать другой для запуска процесса записи, после этого положить собственно записываемый байт/слово и дождаться окончания записи (почитывая регистр). Каждое это действие через отладочный интерфейс достаточно медленно. В NXP это все делает прошитая изготовителем в системную память функция. QUOTE (jcxz @ Dec 8 2017, 18:16)  У меня нигде эта галка не установлена. Сочувствую
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
NikP В чём особенность программирования MK по JTAG? Dec 6 2017, 07:23 x893 Почему нельзя посмотреть по шагам после перепрошив... Dec 6 2017, 07:47 Obam Если один блок из пяти "дурИт", мож там ... Dec 6 2017, 07:52 jcxz Цитата(NikP @ Dec 6 2017, 09:23) В чём мо... Dec 6 2017, 11:17 gerber Копайте в сторону flash wait states. Dec 6 2017, 20:23 HardEgor Цитата(NikP @ Dec 6 2017, 14:23) Вопрос: ... Dec 7 2017, 10:39 Genadi Zawidowski Цитатапо JTAG вы напрямую, минуя контроллер, залив... Dec 7 2017, 11:19 mantech Цитата(Genadi Zawidowski @ Dec 7 2017, 14... Dec 7 2017, 11:27  VladislavS Не ускорять, а унифицировать. Флэшек и способов их... Dec 7 2017, 15:43   VladislavS Цитата(Сергей Борщ @ Dec 8 2017, 15:15) ... Dec 8 2017, 16:09      VladislavS Цитата(jcxz @ Dec 8 2017, 20:26) Вобщем д... Dec 8 2017, 18:12       Obam Цитата(VladislavS @ Dec 8 2017, 22:12) Эт... Dec 8 2017, 18:46        VladislavS Цитата(Obam @ Dec 8 2017, 21:46) Тема про... Dec 8 2017, 19:13         Obam Цитата(VladislavS @ Dec 8 2017, 23:13) Та... Dec 9 2017, 07:43          VladislavS Цитата(Obam @ Dec 9 2017, 10:43) Более то... Dec 9 2017, 09:38          jcxz Цитата(Obam @ Dec 9 2017, 09:43) Вот вы в... Dec 9 2017, 15:46       jcxz Цитата(VladislavS @ Dec 8 2017, 20:12) Ва... Dec 8 2017, 19:18        VladislavS Цитата(jcxz @ Dec 8 2017, 22:18) А в чём ... Dec 8 2017, 19:21         jcxz Цитата(VladislavS @ Dec 8 2017, 21:21) Пр... Dec 8 2017, 19:29        Сергей Борщ QUOTE (jcxz @ Dec 8 2017, 21:18) длительн... Dec 8 2017, 20:13      Сергей Борщ QUOTE (jcxz @ Dec 8 2017, 19:26) А зачем ... Dec 8 2017, 18:56   Obam Цитата(Сергей Борщ @ Dec 8 2017, 16:15) Н... Dec 8 2017, 17:51 NikP Насчёт своего уровня как программиста и разработчи... Dec 8 2017, 17:18 VladislavS Пробовал и опять чисто практически. Так что, реком... Dec 8 2017, 19:32 jcxz Цитата(VladislavS @ Dec 8 2017, 21:32) Пр... Dec 8 2017, 21:36  gerber Цитата(jcxz @ Dec 9 2017, 00:36) Вот у ме... Dec 9 2017, 21:38   AlexandrY Цитата(gerber @ Dec 9 2017, 23:38) что пр... Dec 10 2017, 11:23 Obam Да-да, не уж-то мне надо вспоминать, как они были ... Dec 9 2017, 13:31 VladislavS Не знаю что у вас там завертелось, но ARM без набо... Dec 9 2017, 15:20 Obam Ядро - это ядро (впишите любое на свой выбор), тут... Dec 9 2017, 19:48 jcxz Цитата(Obam @ Dec 9 2017, 21:48) Что зря?... Dec 10 2017, 02:05
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|