Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: В чём особенность программирования MK по JTAG?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
NikP
Отлаживаю однотипные модули на базе 1986ВЕ1Т (Миландр). В устройстве имеется FLASH 1636РР2АУ (тоже Миландр).
Модуль должен перепрограммироваться по шине CAN. Процесс идёт так: новая прошивка записывается в 1636РР2АУ,
проверяется контрольная сумма, после чего контроллер копирует её из 1636РР2АУ во внутреннюю FLASH, перезагружается
командой NVIC_SystemReset() и далее работает.
Проблемы возникли с одним из 5 модулей: после перепрошивки по CAN он намертво зависает, хотя если прошивать его через программатор
по JTAG, то работает нормально.
Пробовал проводить перепрошивку под отладчиком: новая программа записывается во FLASH контроллера без дефектов, происходит перезагрузка,
программа запускается, но после выполнения нескольких операций уходит в HardFault.
Вопрос: в чём особенность программирования по JTAG по сравнению с перепрошивкой контроллером?
В чём может быть причина такого сбоя ?
x893
Почему нельзя посмотреть по шагам после перепрошивки и System Reset?
Почему нельзя посмотреть информацию по HardFault ?
Obam
Если один блок из пяти "дурИт", мож там косяк монтажа? А вы "system reset", "особенность по JTAG"… (;
jcxz
Цитата(NikP @ Dec 6 2017, 09:23) *
В чём может быть причина такого сбоя ?

Например: в ошибке в новой прошивке. Или в куче других причин.
gerber
Копайте в сторону flash wait states.
HardEgor
Цитата(NikP @ Dec 6 2017, 14:23) *
Вопрос: в чём особенность программирования по JTAG по сравнению с перепрошивкой контроллером?
В чём может быть причина такого сбоя ?

Особенность в том, что по JTAG вы напрямую, минуя контроллер, заливаете прошивку во флэш.
А при прошивке по любому интерфейсу у вас на контроллере выполняется программа, которая принимает байты от компьютера и заливает во флэш.
Genadi Zawidowski
Цитата
по JTAG вы напрямую, минуя контроллер, заливаете прошивку во флэш

не-а... Для ускорения процесса все-таки обычно работой с FLASH занимается flash loader, который да, напрямую, помещается в память программируемого девайса. Хотя это не SEGGER...
mantech
Цитата(Genadi Zawidowski @ Dec 7 2017, 14:19) *
не-а... Для ускорения процесса все-таки обычно работой с FLASH занимается flash loader, который да, напрямую, помещается в память программируемого девайса. Хотя это не SEGGER...

Странно, всегда думал, что в блоке JTAG используется свой, аппаратный блок программирования. Что там ускорять - непонятно...
VladislavS
Не ускорять, а унифицировать. Флэшек и способов их подключения в природе несметное количество, а протокол с флэшлоадером строго определён.
NikP
Всем спасибо за обсуждение.
С проблемой разобрался. Когда стал проходить прошивку после перезагрузки по шагам, то выяснилось, что затык происходит при обращении к флэш при старте программы. Сделал пару задержек в этом куске программы, и всё заработало. Вероятно, после перезагрузки перепрошитой программы эта часть отрабатывается быстрее, чем при записи программы в МК по JTAG.

jcxz
Цитата(NikP @ Dec 8 2017, 09:22) *
С проблемой разобрался. Когда стал проходить прошивку после перезагрузки по шагам, то выяснилось, что затык происходит при обращении к флэш при старте программы. Сделал пару задержек в этом куске программы, и всё заработало. Вероятно, после перезагрузки перепрошитой программы эта часть отрабатывается быстрее, чем при записи программы в МК по JTAG.

Да уж.... "разработчик".... smile3009.gif
Вставил пару костылей и "решил проблему". До следующего костыля.

Цитата(Genadi Zawidowski @ Dec 7 2017, 13:19) *
не-а... Для ускорения процесса все-таки обычно работой с FLASH занимается flash loader, который да, напрямую, помещается в память программируемого девайса. Хотя это не SEGGER...

А зачем? Если JTAG имеет доступ ко всему адресному пространству МК, значит он имеет доступ и к регистрам отвечающим за интерфейс программирования FLASH.
А значит он (имея доступ к ОЗУ) может загрузить туда содержимое очередного прошиваемого блока и (имея доступ к регистрам управления прошивкой) - стартовать через эти регистры операцию записи во флешь.

Цитата(VladislavS @ Dec 7 2017, 17:43) *
Не ускорять, а унифицировать. Флэшек и способов их подключения в природе несметное количество, а протокол с флэшлоадером строго определён.

Унифицировать можно написав скрипт для каждого МК, выполняющийся на компе и знающий адреса и номера битов в регистрах программирования флешь, находящихся в области периферийных регистров МК. А доступ ко всему ОЗУ и всем регистрам отлаживаемого МК эмулятор имеет.
В составе IAR видел директорию с кучей *.ddf-файлов для каждого семейства поддерживаемых МК - возможно это оно и есть.
И написать такой скрипт будет проще, чем писать загрузчик, выполняющийся на самом МК.
Сергей Борщ
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 реализованы оба варианта. Разность в скорости записи на порядки. "Лучше день потерять, потом долететь за пять минут!".
VladislavS
Цитата(Сергей Борщ @ Dec 8 2017, 15:15) *
"Лучше день потерять, потом долететь за пять минут!".


Самое прикольное, что даже этот принцип тут не работает. Чуть нестандартный случай и скрипт написать/отладить занимает на порядок больше времени чем флэшлоадер. Год назад поимел много секаса вычитавая данные по SPI через скрипт. Уж очень тормозно всё работает и времянку выдерживать тот ещё геморрой. К тому же, попадаются чипы у которых функции работы с флэш есть во внутреннем ПЗУ, тогда флэшлоадер совсем простой получается по сравнению со скриптом.
jcxz
Цитата(Сергей Борщ @ Dec 8 2017, 14:15) *
Это будет очень медленно и печально. Поэтому в ОЗУ грузится некиая подпрограмма копирования блоков из ОЗУ во флешь, отладчик кладет в ОЗУ содержимое сразу большого блока (страницы) флешь, ставит точку останова на конец этой подпрограммы и запускает ее.

Программирование блока (страницы) флешь по времени - это несколько мсек. Чтобы стартовать запись такого блока в любом МК нужно выполнить считанное кол-во записей в регистры IO.
Неужто длительность этих записей такая большая, что занимает хотя-бы миллисекунды??
Очевидно что нет: в одном из моих текущих проектов я отлаживаю ПО в SDRAM (подключенной к МК). Перед загрузкой программирую регистры контроллера внешней шины для чего написал соответствующий .mac-файл и подсунул IAR. В этом файле написан срипт настройки контроллера внешней шины МК в несколько десятков записей в регистры IO. И времени его выполнения я на глаз не замечаю - грузится примерно как во внутреннюю ОЗУ.

Цитата(Сергей Борщ @ Dec 8 2017, 14:15) *
То, что я описал, у IAR называется (раньше называлось, сейчас - не знаю) flash loader и была отдельная галочка "use flash loader".
В openocd реализованы оба варианта. Разность в скорости записи на порядки. "Лучше день потерять, потом долететь за пять минут!".

У меня нигде эта галка не установлена. Скорость записи какая? Она в первую очередь определяется временем стирания блоков флешь. Типичное время стирания одного блока в текущем МК == 5 секунд! На фоне этого даже миллисекунды незаметны, не говоря уже о микросекундах, которые очевидно занимают операции записи регистров через JTAG.
Сергей Борщ
QUOTE (jcxz @ Dec 8 2017, 18:16) *
Программирование блока (страницы) флешь по времени - это несколько мсек. Чтобы стартовать запись такого блока в любом МК нужно выполнить считанное кол-во записей в регистры IO.
Кроме NXP бывают и другие процессоры. и там надо почитать регистр в ожидании готовности, потом записать другой для запуска процесса записи, после этого положить собственно записываемый байт/слово и дождаться окончания записи (почитывая регистр). Каждое это действие через отладочный интерфейс достаточно медленно. В NXP это все делает прошитая изготовителем в системную память функция.
QUOTE (jcxz @ Dec 8 2017, 18:16) *
У меня нигде эта галка не установлена.
Сочувствую sm.gif
NikP
Насчёт своего уровня как программиста и разработчика я особых иллюзий не питаю ))). Ну тут уж как в мультике : когда закончились даже худшие из лучших, в дело идут лучшие из худших ))
Что касается конкретного прибора, то в реальных условиях доступ к нему будет только по CAN, и отлаживать прибор приходится только включая его в условиях, близких к реальным рабочим.
Если кто умеет проводить отладку, используя эмулятор на компе, и при этом находить косяки, которые возникают в реальной работе, то , честно говоря, я ему завидую.
Так что ... В пианиста просьба не стрелять
jcxz
Цитата(Сергей Борщ @ Dec 8 2017, 18:40) *
Кроме NXP бывают и другие процессоры. и там надо почитать регистр в ожидании готовности, потом записать другой для запуска процесса записи, после этого положить собственно записываемый байт/слово и дождаться окончания записи (почитывая регистр). Каждое это действие через отладочный интерфейс достаточно медленно.

А зачем флешь писать побайтно??
В Infineon например сразу страница грузится и потом даётся команда на её запись.
Вобщем думаю: никакой заметной разницы по времени между записью напрямую через JTAG и через флешь-лоадер - нет. Тем более основное время занимает стирание, а не запись.
Obam
Цитата(Сергей Борщ @ Dec 8 2017, 16:15) *
Нет, это device description file - файлы описания периферийных регистров и их битов. То, что я описал, у IAR называется (раньше называлось, сейчас - не знаю) flash loader и была отдельная галочка "use flash loader".

Всё так и есть, ничего не изменилось. И галочка есть и разницы особой нет (по времени). Только с галочкой можно ещё и просто стереть контроллер.
VladislavS
Цитата(jcxz @ Dec 8 2017, 20:26) *
Вобщем думаю: никакой заметной разницы по времени между записью напрямую через JTAG и через флешь-лоадер - нет.

Ваша беда в том, что частности из своей практики обобщаете на вопросы с которыми не сталкивались. Достаточно вспомнить как "учили" меня с EEPROM в STM8 работать. Шире надо смотреть на окружающий мир и не быть столь категоричным не имея для того веских оснований.

Цитата(Obam @ Dec 8 2017, 20:51) *
И галочка есть и разницы особой нет (по времени).

Это пока вы не столкнулись с чем-нибудь "интереcным". Хотелось бы посмотреть как вы по SPI или I2C флэшку без флэшлоадера будете писать.

Цитата(NikP @ Dec 8 2017, 20:18) *
Так что ... В пианиста просьба не стрелять

Не берите в голову. Не ошибается тот кто ничего не делает. В реальной жизни подвохи случаются там где их совсем не ждешь...
Obam
Цитата(VladislavS @ Dec 8 2017, 22:12) *
Это пока вы не столкнулись с чем-нибудь "интереcным". Хотелось бы посмотреть как вы по SPI или I2C флэшку без флэшлоадера будете писать.

Напугали (; ежа... (ну дальше, надеюсь, понятно)
Тема про микроконтроллеры, но уверяю вас, JTAG стараюсь применять по назначению (;
Сергей Борщ
QUOTE (jcxz @ Dec 8 2017, 19:26) *
А зачем флешь писать побайтно??
Запишите в STM32/MSP430/AT91 (на выбор) страницу одним махом. Мужики-то не знают...
VladislavS
Цитата(Obam @ Dec 8 2017, 21:46) *
Тема про микроконтроллеры

Так и я про них. Поделитесь, как будете через J-TAG шить программу в микроконтроллер с SPI-флэшкой.
jcxz
Цитата(VladislavS @ Dec 8 2017, 20:12) *
Ваша беда в том, что частности из своей практики обобщаете на вопросы с которыми не сталкивались. Достаточно вспомнить как "учили" меня с EEPROM в STM8 работать.

Не сталкивался с чем? С прошивкой МК? Да уж, сколько уже лет (или десятилетий?) "не сталкиваюсь"... почти каждый день "не сталкиваюсь" wink.gif
Насчёт STM8: наличие собственного работающего проекта с хранением данных во внутренней EEPROM - это уже нельзя считать "веским основанием"?
Так что насчёт "категоричным не имея для того веских оснований" - это Вы думаю о себе говорите laughing.gif

Цитата(VladislavS @ Dec 8 2017, 20:12) *
Это пока вы не столкнулись с чем-нибудь "интереcным". Хотелось бы посмотреть как вы по SPI или I2C флэшку без флэшлоадера будете писать.

Точно так же, как это делал бы флешь-лоадер - обращаясь к регистрам IO этих самых SPI и I2C.
А в чём сложность-то?

Цитата(Сергей Борщ @ Dec 8 2017, 20:56) *
Запишите в STM32/MSP430/AT91 (на выбор) страницу одним махом. Мужики-то не знают...

Про эти МК я не говорил. sm.gif Но тем не менее всё равно - длительность стирания любого МК будет гораздо больше его записи через JTAG. Так что на фоне стирания каких-то незначительных замедлений не будет заметно.
VladislavS
Цитата(jcxz @ Dec 8 2017, 22:18) *
А в чём сложность-то?

Пробовали или опять чисто теоретически?
jcxz
Цитата(VladislavS @ Dec 8 2017, 21:21) *
Пробовали или опять чисто теоретически?

Нет, не пробовал. Но не вижу причин "против". А вы пробовали или опять чисто теоретически? rolleyes.gif
VladislavS
Пробовал и опять чисто практически. Так что, рекомендую не подставляться снова.
Сергей Борщ
QUOTE (jcxz @ Dec 8 2017, 21:18) *
длительность стирания любого МК будет гораздо больше его записи через JTAG. Так что на фоне стирания каких-то незначительных замедлений не будет заметно.
Незначительных заметно не будет. Будут очень заметны значительные. По той простой причине, что между JTAG и скриптом еще некая коробочка, которая втыкается почти всегда в USB, а там "записать байт-прочитать байт-записать байт-прочитать байт" происходит значитально медленее, чем "записать много-много байтов". Если у вас это не так - расскажите мужикам. А то у нас стирание 64К секунд 5 занимает, а запись без загрузчика почти минуту.
jcxz
Цитата(VladislavS @ Dec 8 2017, 21:32) *
Пробовал и опять чисто практически.

И...?

Цитата(Сергей Борщ @ Dec 8 2017, 22:13) *
Если у вас это не так - расскажите мужикам. А то у нас стирание 64К секунд 5 занимает, а запись без загрузчика почти минуту.

"У нас" это где?
Вот у меня IAR, прошиваю МК, без галки использовать лоадер(!), только "verify download". Весь процесс длится время примерно равное времени стирания - т.е. секунд 5.
Вот другой МК (STM32F4). Опять IAR. Опять нет галки. Время - примерно пара секунд.
ЧЯДНТ??
Как вам удалось добиться такого медленного программирования? Расскажите мужикам! rolleyes.gif
Код
Fri Dec 08, 2017 23:40:28: Initial reset was performed
Fri Dec 08, 2017 23:40:37: J-Link: Flash download: Flash programming performed for 3 ranges (262144 bytes)
Fri Dec 08, 2017 23:40:37: J-Link: Flash download: Total time needed: 6.846s (Prepare: 0.048s, Compare: 0.013s, Erase: 4.612s, Program: 2.152s, Verify: 0.007s, Restore: 0.011s)
Fri Dec 08, 2017 23:40:37: 233472 bytes downloaded and verified (26.63 Kbytes/sec)
Fri Dec 08, 2017 23:40:37: Loaded debugee: d:\WORK\FM-STM\FIRMWARE\FLASH_RELEASE.OUT\EXE\fm.out
Obam
Цитата(VladislavS @ Dec 8 2017, 23:13) *
Так и я про них. Поделитесь, как будете через J-TAG шить программу в микроконтроллер с SPI-флэшкой.

Вот вы вы что подразумевали... а то SPI, I2C... т.е. у контроллера на борту энергонезависимой памяти программ нет (это уже медиапроцессор - чуть более другая область). Тут да: или по JTAGу flashloader (только правильнее назвать его будет SerialWriter)в наботрное ОЗУ заливать и там исполнять, или уже в ROM он (loader) есть (к примеру 'C6747 DSPшник, но это опять пример не контроллера).
Более того, раздел про ARM.
VladislavS
Цитата(Obam @ Dec 9 2017, 10:43) *
Более того, раздел про ARM.

Ещё когда Земля была чуть тёплая, ARM грузились с внешних флэшек параллельных или последовательных. А сейчас и подавно. Почему вы решили, что все ARM должны иметь набортную флэш? Избаловала вас STM wink.gif
Obam
Да-да, не уж-то мне надо вспоминать, как они были 26-разрядными процессорами общего назначения?
Идея микроконтроллера всё же: программная и оперативная память на кристалле с ядром и периферией. Вспомните, как только 7TDMI стали с флэшом, тут то "всё и заверте..."
1830ве31 - это от отсталости, в '96 - атмел выкатил mcs51 с флэшом и мир заиграл другими красками (;

А расширительное толкование слов собеседника (тем более письменных), ну согласитесь, не достойно благородного дона (;
VladislavS
Не знаю что у вас там завертелось, но ARM без набортной флэш сейчас обычное явление.
jcxz
Цитата(Obam @ Dec 9 2017, 09:43) *
Вот вы вы что подразумевали... а то SPI, I2C... т.е. у контроллера на борту энергонезависимой памяти программ нет (это уже медиапроцессор - чуть более другая область).

Тут Вы зря.... Если какой-то МК Cortex-M (к примеру) не имеет встроенной флешь, он что после этого - перестаёт быть Cortex-M?
Я вообще считаю, что производители зря делают CM-ы с частотами от ~144 МГц и выше со встроенной флешь. Одни только проблемы: шины выборки широкие надо делать, wait-state-ы, кеши и т.п.
Лучше-бы взамен встроенной флешь ставили аналогичный объём ОЗУ и возможность загрузки (и исполнения) по quad-SPI извне.
Obam
Ядро - это ядро (впишите любое на свой выбор), тут разговоров нет.
Или не помните (в профиля смотреть не пойду) или прикидываетесь, что не знаете, как выглядело типичное управляющее устройство, пока не интегрировали оба вида памяти и периферию с ядром на кристалле и как и что это изменило.

По топику: что решили? "В чём особенность программирования МК по JTAG?" (;

Цитата(jcxz @ Dec 9 2017, 19:46) *
Тут Вы зря.... Если какой-то МК Cortex-M (к примеру) не имеет встроенной флешь, он что после этого - перестаёт быть Cortex-M?
Я вообще считаю, что производители зря делают CM-ы с частотами от ~144 МГц и выше со встроенной флешь. Одни только проблемы: шины выборки широкие надо делать, wait-state-ы, кеши и т.п.
Лучше-бы взамен встроенной флешь ставили аналогичный объём ОЗУ и возможность загрузки (и исполнения) по quad-SPI извне.

Что зря? Разве после пояснения, про каким боком SPI, I2C, не сказал, что либо свой загрузчик в ОЗУ, либо наличествующий штатный в ПЗУ.
gerber
Цитата(jcxz @ Dec 9 2017, 00:36) *
Вот у меня IAR, прошиваю МК, без галки использовать лоадер(!), только "verify download". Весь процесс длится время примерно равное времени стирания - т.е. секунд 5.
Вот другой МК (STM32F4). Опять IAR. Опять нет галки. Время - примерно пара секунд.
ЧЯДНТ??
Как вам удалось добиться такого медленного программирования? Расскажите мужикам! rolleyes.gif

Надо полагать, что если адаптер JTAG "родной" для данного вида МК (что означает, что прошивка адаптера знает систему команд Boundary Scan для данного вида МК), то прошивка флэшки будет происходить быстро, как и предусмотрено производителем МК и адаптера JTAG. Если адаптер "левый", то прошивкой флэшки уже будет заниматься среда программирования, если у неё есть соответствующие скрипты - а это и будет в духе "запиши в регистр байт, почитай регистр статуса", что по USB и вправду довольно медленно. Неким "консенсусом" выглядит в этом ракурсе идея закинуть в SRAM кусок кода, который примет сразу блок прошивки и сам на борту запишет его во флэшь.
jcxz
Цитата(Obam @ Dec 9 2017, 21:48) *
Что зря? Разве после пояснения, про каким боком SPI, I2C, не сказал, что либо свой загрузчик в ОЗУ, либо наличествующий штатный в ПЗУ.

"Зря" - не о том. А о том, что отсутствие встроенной энергонезависимой памяти программ, не делает микроконтроллер не микроконтроллером.
AlexandrY
Цитата(gerber @ Dec 9 2017, 23:38) *
что прошивка адаптера знает систему команд Boundary Scan для данного вида МК

В Cortex на архитектуре ARM®v7-M есть такая вещь как CoreSight™ DAP, там прямой доступ на шину и шаманства с Boundary Scan уже не нужны.


Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.