jcxz 184 9 декабря, 2020 Опубликовано 9 декабря, 2020 · Жалоба Столкнулся со странным и неприятным поведением Data Watchpoint and Trace (DWT) на Cortex-M4F при отключении отладчика. Пока отладчик подключен (или неподключен и не подключался), то бит0 в DWT_CTRL ==1 (а 25-й бит ==0), т.е. DWT_CYCCNT включен и инкрементируется. Всё ок. Но при отключении отладчика (отключение отладочной сессии в IAR, сам эмулятор естественно не трогаю) происходит странное: Содержимое DWT_CYCCNT перестаёт инкрементироваться, а из DWT_CTRL начинает считываться содержимое остановленного DWT_CYCCNT! Т.е. - с обоих регистров (DWT_CTRL/DWT_CYCCNT) читается содержимое DWT_CYCCNT, которое было в момент перед отключением отладчика (DWT_CYCCNT заморозился). Никакие дальнейшие попытки записи в DWT_CTRL не производят никакого эффекта - восстановить нормальное функционирование DWT_CTRL/DWT_CYCCNT не получается. DWT_CYCCNT я использую у себя в программе и это очень неприятное его поведение. Отладчик подключен по SWD. Пробовал разные типы сброса (в свойствах подключения отладчика в IAR) - не помогает. Может я чего-то упускаю и есть некий бит конфигурации, управляющий поведением DWT_CYCCNT (кроме битов 0 и 25 DWT_CTRL)? PS: Галка "J-Link\Leave Target Running" в меню IAR установлена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 9 декабря, 2020 Опубликовано 9 декабря, 2020 · Жалоба 1 час назад, jcxz сказал: Пока отладчик подключен (или неподключен и не подключался), то бит0 в DWT_CTRL ==1 (а 25-й бит ==0), т.е. DWT_CYCCNT включен и инкрементируется... Вроде такого быть не должно - мануал на ядро говорит, что там по умолчанию 0, т.е. CYCCNT выключен. А МК какой? Не пробовали провести аналогичный эксперимент на другом типе МК (другого производителя)? Что в содержимом DEMCR при наблюдении проблемного поведения (заморожен CYCCNT)? Мое ИМХО: при отключении отладчик сбрасывает бит TRCENA в DEMCR (и не важно, включали ли Вы его руками программно). Мануал гласит Цитата [24] TRCENA Global enable for all DWT and ITM features: 0 = DWT and ITM blocks disabled. 1 = DWT and ITM blocks enabled. If the DWT and ITM blocks are not implemented, this bit is UNK/SBZP.When TRCENA is set to 0: • DWT registers return UNKNOWN values on reads. Whether the processor ignores writes to the DWT unit is IMPLEMENTATION DEFINED. • ITM registers return UNKNOWN values on reads. Whether the processor ignores writes to the ITM unit is IMPLEMENTATION DEFINED. Setting this bit to 0 might not stop all events. To ensure all events are stopped, software must set all DWT and ITM feature enable bits to 0, and then set this bit to 0. The effect of this bit on the TPIU, ETM, and other system trace components is IMPLEMENTATION DEFINED. Так что, вполне вероятно. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 9 декабря, 2020 Опубликовано 9 декабря, 2020 · Жалоба 18 минут назад, Arlleex сказал: Вроде такого быть не должно - мануал на ядро говорит, что там по умолчанию 0, т.е. CYCCNT выключен. У меня не по-умолчанию: при старте ПО я включаю бит0 DWT_CTRL. И пока отладчик подключен (или он вообще не подключался) - всё ок. 18 минут назад, Arlleex сказал: А МК какой? Не пробовали провести аналогичный эксперимент на другом типе МК (другого производителя)? XMC4700. Я только сейчас заметил. Да и на других мне особо не нужно - там везде есть хотя-бы один 32-битный таймер, а на XMC4700, к сожалению, - ни одного. :(((((((( 18 минут назад, Arlleex сказал: Мое ИМХО: при отключении отладчик сбрасывает бит TRCENA в DEMCR (и не важно, включали ли Вы его руками программно). Мануал гласит Точно! Совсем забыл. Я же его самостоятельно устанавливаю перед включением CYCCNT. Но что-то совсем подзабыл. Спасибо Вам, что ткнули носом. PS: Похоже никак не запретить отладчику его отключать. Придётся какой-то костыль ваять, для проверки и включения оного бита. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться