-
- Для тестирования, попробовал вернуться к корням. Оригинальный
проект Nuvoton NUC970_NonOS_BSP из SampleCode/FreeRTOS при "-O3
-flto=auto" в GCC13 с некоторыми несущественными правками (для
устранения ошибок сборки) собирается, но перестаёт работать даже на
стадии инициализации, происходит разрыв отладочного соединения JTAG
в sysSetupCP15(). При уровне "-O0", однако, оригинальный проект
работает. VVB(44 знак., 30.01.2024 09:07, ссылка)
- Опять вы двигаетесь в маргинальном направлении. Не поддерживает
никто NonOS_BSP, его дали чисто на оте#ись и он кривой-косой. Для
нувотона только linux поддерживается и работоспособен без
нареканий. Если вам так нужен Bare metal берите за образец
исходники драйверов linux и не надо задаваться вопросом "почему код
не соответствует даташиту или юзер-мануалу", работайте по
исходникам а не по мануалу. Добавление: с ассемблерными вставками в
lto были какие то проблемы. - 3m(30.01.2024 10:53)
- И отчего же китайцы честно не пишут "вот вам кривой-косой non-OS
BSP, от#ебитесь"? Это было бы честно, я бы раньше представлял
временные затраты и забил бы на чип. Почему другие производители
настолько кривой BSP не делают? (TI, NXP, STM и т.д.) VVB(83 знак., 30.01.2024 14:20)
- От всех! По моему я писал уже что нужно полностью отбросить западный подход к разработке используя китайчину. Поддерживается только мэйнстрим под который заточен чип: это может быть Андроид, Линукс или какая-то китай-ртос или даже ардуина. Все что вне мейнстрима НЕ РАБОТАЕТ и если делать строго по ДШ тоже не заработает и запустить не смогут даже китайские инженеры. Таков путь, не нравится => Верхний Ларс. - 3m(30.01.2024 17:42)
- До относительно недавнего времени Nuvoton вообще ничего к чипам просто так не давали - только Product Brief на сайте. Все остальное - через дилера, у которого был логин на крытый FTP. Соответственно баги исправлялись по запросу клиентов. Там в саппорте три человека ЕМНИП. - LightElf(30.01.2024 14:28)
- И отчего же китайцы честно не пишут "вот вам кривой-косой non-OS
BSP, от#ебитесь"? Это было бы честно, я бы раньше представлял
временные затраты и забил бы на чип. Почему другие производители
настолько кривой BSP не делают? (TI, NXP, STM и т.д.) VVB(83 знак., 30.01.2024 14:20)
- Опять вы двигаетесь в маргинальном направлении. Не поддерживает
никто NonOS_BSP, его дали чисто на оте#ись и он кривой-косой. Для
нувотона только linux поддерживается и работоспособен без
нареканий. Если вам так нужен Bare metal берите за образец
исходники драйверов linux и не надо задаваться вопросом "почему код
не соответствует даташиту или юзер-мануалу", работайте по
исходникам а не по мануалу. Добавление: с ассемблерными вставками в
lto были какие то проблемы. - 3m(30.01.2024 10:53)
- С WDT разобрался, это мои косяки были в скриптах установки
отладочного соедения. VVB(443 знак., 29.01.2024 11:12)
- Поздравляю с прогрессом, пусть и небольшим. У системы есть
статическое ОЗУ? Чтобы дампить туда ход работы программы и, после
сбоя, вычитывать? - Nikolay_Po(29.01.2024 14:29)
- Там есть 56к SRAM и в RTC есть 16 32-битных слов для хранения
данных - LightElf(29.01.2024 15:38)
- Кстати, RTC это нечто бесподобное. Врагу не пожелаю с ним работать. Я неделю исследовал недокументированное поведение. - VVB(29.01.2024 16:25)
- Пишите туда журнал: метка времени и код функции, в которую передаётся управление (или в которую входит программа). Может, удастся выявить закономерность. - Nikolay_Po(29.01.2024 16:24)
- Там есть 56к SRAM и в RTC есть 16 32-битных слов для хранения
данных - LightElf(29.01.2024 15:38)
- Поздравляю с прогрессом, пусть и небольшим. У системы есть
статическое ОЗУ? Чтобы дампить туда ход работы программы и, после
сбоя, вычитывать? - Nikolay_Po(29.01.2024 14:29)
- Если программа работает, значит количество ошибок четное(С):) Как уже писали, на "бомбер" (а-ля указатель с левыми значениями) похоже или преполнение стека. Как ещё варианты - переменная, которая дб статическая, объявлена на стеке, знаковая переменная типа таймстемпа вместо беззнаковой, выход за границы массива (уже упоминалось), прога собрана без -fno-common и один модуль бьёт по другому, размотанные циклы без барьера. Это всё может приводить к отложенным чудесатым Vit(8 знак., 26.01.2024 08:33)
- Я бы, вдобавок к питанию, предположил проблему с сигналом RESET.
Короткий пичок по ней или наоборот очень затянутый фронт. Там нога
RESET двунавправленная, может это не учли? Прошивка делает
софт-ресет, а из-за схемы на ножке сброс до конца не выполняется и
проц встает раком. - LightElf(25.01.2024 11:30 - 18:46)
- Кстати, нарвались на подобное давно, проц SAM7X был и он импульсы сброса делал, вроде с той цепи кондер убрал и нормально стало. - Visitor(25.01.2024 20:35)
- RESET это RC цепь 10 кОм / 1.0 мкФ, вплотную у ножек МК (на рабочей
плате). Там нечему наводиться. - VVB(25.01.2024 11:50)
- У Нувотона аппнота есть про RESET на NUC970 и ваши 10кОм/1мкФ оной
аппноте не соответствуют. LightElf(1 знак., 25.01.2024 14:39, картинка)
- ЕМНИП, это были аппаратные проблемы первых кристаллов, которые
пофиксили в следующих релизах, и эта схема не нужна. - VVB(25.01.2024 14:53)
- У первых кристаллов была проблема с питанием, а не сбросом. Эта аппнота про всех. На всякий случай прикладываю, вдруг кто не читал. LightElf(2 знак., 25.01.2024 15:17, ссылка, ссылка)
- ЕМНИП, это были аппаратные проблемы первых кристаллов, которые
пофиксили в следующих релизах, и эта схема не нужна. - VVB(25.01.2024 14:53)
- У Нувотона аппнота есть про RESET на NUC970 и ваши 10кОм/1мкФ оной
аппноте не соответствуют. LightElf(1 знак., 25.01.2024 14:39, картинка)
- Исчо я бы проверил, совпадает ли скрипт инициализации с маркировкой на проце. У камней с маркировкой 61Y/62Y/63Y (то есть имеющие память разных производителей) - разные скрипты инициализации DDR2 (ЕМНИП) и при несовпадении может быть всякое интересное. - LightElf(25.01.2024 18:44)
- А почему отказаться от МК ?! Tyмблep(1255 знак., 25.01.2024 15:18)
- У меня гоняется flood ping в 2 терминалах (всего около 17'000
пакетов / с), может через полчаса сбойнуть, а может и через 10
часов. Проблема в том, что неизвестна причина. Я могу лишь
исследовать осциллографом поведение чипа до сбоя (тут я ещё могу
JTAG использовать) и после сбоя (JTAG уже недоступен). Надо быть
тупым, чтобы сделать некоторые телодвижения в коде и ждать 10 часов
до возникновения сбоя, для проверки какой-то гипотезы. - VVB(25.01.2024 17:36)
- Вы здесь не для того, чтобы разъяснять нам причины, по которым вы "не можете". А для того, чтобы искать способы. Nikolay_Po(537 знак., 25.01.2024 20:27)
- А если не делать никаких телодвижений Tyмблep(471 знак., 25.01.2024 18:33)
- У меня гоняется flood ping в 2 терминалах (всего около 17'000
пакетов / с), может через полчаса сбойнуть, а может и через 10
часов. Проблема в том, что неизвестна причина. Я могу лишь
исследовать осциллографом поведение чипа до сбоя (тут я ещё могу
JTAG использовать) и после сбоя (JTAG уже недоступен). Надо быть
тупым, чтобы сделать некоторые телодвижения в коде и ждать 10 часов
до возникновения сбоя, для проверки какой-то гипотезы. - VVB(25.01.2024 17:36)
- Я бы попробовал 1) заменить на входе RESET RC-цепочку на м/с SVS;
2) временно попробовать тактировать от внешнего генератора; 3)
временно попробовать без использования Ethernet, если он у вас
используется (кстати, какой у вас PHY и как он тактируется - от
собственного кварца 25МГц или по-другому?). - reZident(25.01.2024 13:07)
- Плюсую, тока вместо эзернета я п сформулировал так: все
используемые/доступные интерфейсы. akz(314 знак., 25.01.2024 13:44)
- Я имел в виду именно Ethernet как самый программно-аппаратно замороченный интерфейс. А так же собственный поучительный опыт, что не стоит забывать об уже ранее учтенных багах при последующей модернизации схемы. Я как-то при замене PHY для LPC1768 решил сэкономить на стоимости кварцевого генератора, позыбыв про неустранимый баг с зависанием конвейера внутри МК при сбое тактирования MAC. reZident(1 знак., 25.01.2024 14:23, ссылка)
- Плюсую, тока вместо эзернета я п сформулировал так: все
используемые/доступные интерфейсы. akz(314 знак., 25.01.2024 13:44)
- Поставить внешний железный wdt. - ASDFS(25.01.2024 13:02)
- Сейчас это стало очевидным. Кто же ожидал такой подлянки от
Nuvoton? Errata нет. Косяки в документации, биты местами
перепутаны, описание IP блоков не соответствует реальному
поведению. Короче, это опыт на будущее: внимательно смотреть
китайцев на наличие errata и на качество документации, перед
закладыванием в серийный проект. И не бояться "выкинуть в корзину"
все альфа-бета-гамма версии ПО, сделанные на основе оценочного
модуля. Сейчас я бы заложил другой чип, не Nuvoton. - VVB(25.01.2024 13:14)
- Что-то мне кажется, что это случай "виноват компилятор". Просто баг в коде, и программа творит дикости, затирает коэффициенты ФАПЧ и выводит из режима тактовый генератор. Тактирование сбоит и падает. А виноват чип... Nikolay_Po(1054 знак., 25.01.2024 15:45)
- Закладывать китайчатину надо ту которая всеми изъезжена вдоль и поперек. ASDFS(117 знак., 25.01.2024 13:49)
- Сейчас это стало очевидным. Кто же ожидал такой подлянки от
Nuvoton? Errata нет. Косяки в документации, биты местами
перепутаны, описание IP блоков не соответствует реальному
поведению. Короче, это опыт на будущее: внимательно смотреть
китайцев на наличие errata и на качество документации, перед
закладыванием в серийный проект. И не бояться "выкинуть в корзину"
все альфа-бета-гамма версии ПО, сделанные на основе оценочного
модуля. Сейчас я бы заложил другой чип, не Nuvoton. - VVB(25.01.2024 13:14)
- Описанное мною поведение соответствует состоянию "Power-down Mode"
(за исключением того что у меня при сбое работает HXT, а в
"Power-down Mode" он, судя по документации, не должен работать), но
вот в чём дело: у меня в коде нет ни одного обращения к регистру
CLK_PMCON, и нет команды "mcr p15, 0, <Rd>, c7, c0, 4". - VVB(25.01.2024 11:48)
- Чип умеет исполнять код из ОЗУ? Если да, то может быть что угодно. - Nikolay_Po(25.01.2024 15:46)
- Он только из ОЗУ и исполняет. В ПЗУ только начальный загрузчик. - LightElf(25.01.2024 15:49)
- ммм... Есть у линкера секция .noinit? Начать с этого, выводить
журнал вызовов функций либо в неинициализируемую секцию памяти,
либо статус аппаратно в порт вывода. Ну и в прерываниях-исключениях
тоже не забыть прописать. Может, какой системный сбой вызовет
исключение, и пока ФАПЧ не легла совсем, может и его удастся
зарегистрировать. Nikolay_Po(94 знак., 25.01.2024 17:13)
- Если возникает любое исключение data/prefetch/undefined abort, его
ловит отладчик; многократно проверено. В данном случае отладчик
ничего не ловит и просто теряет связь по JTAG, сигнал TDO = "1"
всегда. Поэтому я отбросил всякие идеи об: 1) неправильных
инструкциях; 2) неправильных адресов данных; 3) неправильных
адресов кода. - VVB(25.01.2024 17:29)
- Если неправильная инструкция "кладёт" систему тактирования, никакой отладчик не сработает. Остаётся вариант, для зацепки, выводить код функции в GPIO. Только нужно инлайнить, чтобы стек не участвовал. Nikolay_Po(66 знак., 25.01.2024 20:14)
- Рассмотрите возможность эпизодических сбоев ОЗУ из-за неправильной инициализации или питания. - LightElf(25.01.2024 18:52)
- Если возникает любое исключение data/prefetch/undefined abort, его
ловит отладчик; многократно проверено. В данном случае отладчик
ничего не ловит и просто теряет связь по JTAG, сигнал TDO = "1"
всегда. Поэтому я отбросил всякие идеи об: 1) неправильных
инструкциях; 2) неправильных адресов данных; 3) неправильных
адресов кода. - VVB(25.01.2024 17:29)
- ммм... Есть у линкера секция .noinit? Начать с этого, выводить
журнал вызовов функций либо в неинициализируемую секцию памяти,
либо статус аппаратно в порт вывода. Ну и в прерываниях-исключениях
тоже не забыть прописать. Может, какой системный сбой вызовет
исключение, и пока ФАПЧ не легла совсем, может и его удастся
зарегистрировать. Nikolay_Po(94 знак., 25.01.2024 17:13)
- Он только из ОЗУ и исполняет. В ПЗУ только начальный загрузчик. - LightElf(25.01.2024 15:49)
- Чип умеет исполнять код из ОЗУ? Если да, то может быть что угодно. - Nikolay_Po(25.01.2024 15:46)
- А первая заповедь ? Исполнена ? akz(528 знак., 25.01.2024 10:47)
- На оценочном модуле в лабораторных условиях при отсутствии чего-либо мощного питания идеальны. Кроме того, при работе на рабочей плате сбой также имеет место быть. - VVB(25.01.2024 11:34)
- Кстати, да. Не так давно столкнулся с напоминанием об этой заповеди: SciFi(1 знак., 25.01.2024 10:52, ссылка)
- Теоретически может левый код записать что-нибудь такое в нужный
регистр настройки тактирования и вызвать вот это всё? Если так,
можно ли настроить какие-нибудь средства диагностики, чтобы
отловить такую запись? - SciFi(25.01.2024 10:20)
- Есть регистр CLK_PMCON, бит 0 (XTAL_EN). Я по JTAG пробовал его сбросить, он не сбрасывается: записать в него "0" невозможно, запись игнорируется. Кроме того, при сбое работает тактовый генератор, а этот бит управляет именно генератором а не буфером от генератора к цепи XIN. - VVB(25.01.2024 10:42)
- Если память не изменяет, то ЖТАГовая отладка АТмеги позволяет
остановиться на записи-чтении в ячейку памяти. Интересно, нонешние
мегапроцэссоры так умеют? - mse homjak(25.01.2024 10:26)
- ARM9 - древнее г-но мамонта. Там может и не быть. А Cortex-M3, к примеру, вполне себе. - SciFi(25.01.2024 10:37)
- Есть одна идея по устранении последствий сбоя. Попробую перевести WDT на тактирование от часового кварца, благо он имеется. - VVB(25.01.2024 10:20)
- как костыль - принудительно перезагружать раз в час изнутри -
скорее всего это поможет... - sav6622(25.01.2024 10:15)
- мы как то нарвались на трехдневный сбой, раз в три дня =))) на
длинном прогоне... потом выяснилось что это переполнение 32 битной
переменной в сетке исполнения 8 кГц =))) а по ней контроль
целостности шел =)) - sav6622(25.01.2024 10:16)
- У нас тоже был случайно возникающий hardfault из-за похожей ошибки.
Размер буфера modbus при ошибке фрейма определялся неправильно и МК
в этом случае пытался посчитать CRC данных размером -1...-3 в
размерности int :-) - reZident(25.01.2024 12:50)
- Я был бы счастлив словить хоть hard fault, хоть что-нибудь другое. - VVB(25.01.2024 12:55)
- Поймали погромиста? :-) - SciFi(25.01.2024 10:22)
- конечно поймали =))) - sav6622(25.01.2024 10:42)
- У нас тоже был случайно возникающий hardfault из-за похожей ошибки.
Размер буфера modbus при ошибке фрейма определялся неправильно и МК
в этом случае пытался посчитать CRC данных размером -1...-3 в
размерности int :-) - reZident(25.01.2024 12:50)
- мы как то нарвались на трехдневный сбой, раз в три дня =))) на
длинном прогоне... потом выяснилось что это переполнение 32 битной
переменной в сетке исполнения 8 кГц =))) а по ней контроль
целостности шел =)) - sav6622(25.01.2024 10:16)
- еще как вариант - всю память НЕиспользуемую прописать возврат на
ресет-старт - sav6622(25.01.2024 10:10)
- Как ядро может исполнять инструкции, если на него не поступает тактовая частота? - VVB(25.01.2024 10:12)
- Я в подобных случаях в первую очередь - увеличиваю стеки по
максимуму. При повышенной оптимизации требования к стеку могут
вырасти. - il-2(25.01.2024 10:10)
- стек + кучу - sav6622(25.01.2024 10:11)
- но правда если утечка - то это лишь удлинит период ДО зависания =) - sav6622(25.01.2024 10:11)
- стек + кучу - sav6622(25.01.2024 10:11)
- а просто перейти на -Os и проверить ? может и не будет... - sav6622(25.01.2024 10:06)
- Какая гарантия того что не будет? 6 часов непрерывной работы? 24?
Гарантий нет, а потом будет "фобос в грунт". Если есть сбой, надо
разобраться, а не обходить без понимания причин. VVB(266 знак., 25.01.2024 10:10)
- В первую очередь отключите lto. Эта фигня очень сложная и иногда
дает непредсказуемые результаты. Серия NUC97x в комплекте с
китайским линуксом никаких нареканий по части надежности не вызвала
вплоть до снятия изделий с производства. У вас похоже bare metal,
так это ССЗБ при использовании китайчины. С китайскими изделиями
любой даже самый минимальный шаг в сторону - это песец, опыт работы
с западными чипами тут надо забыть. - 3m(25.01.2024 14:09)
- Эхх... А я, наоборот, включаю эту фигню, -flto=auto (авто - чтобы
оптимизатор сориентировался по количетсву доступных ядер ЦП хоста
при компиляции), чтобы повысить качество кода. Писал уже не раз,
что LTO позволяет быстрее находить ошибки, по крайней мере на свежих GCC, начиная с 10 и
выше. На 9й версии с CortexM3 было чуть неоднозначно. Nikolay_Po(127 знак., 25.01.2024 15:56)
- Пофиксить в чужом коде - это исправить чужой код? Там работы ... - AlexBi(25.01.2024 17:07)
- Ну, я для прикола, скомпилировал OpenOCD с -O3 -flto.
Предупреждений штук 50 пришлось поправить. Часто встречалось, что,
размер буфера был определён меньше, чем возможный размер вносимых в
буфер данных. Собственно, предпосылки к глюкам. - Nikolay_Po(26.01.2024 14:16)
- Это у вас какие-то умные предупреждения. Я, после включения всех
предупреждений, чаще вижу "сравнение знакового и беззнакового",
"запись в переменную меньшего размера", "использование
зарезервированных имен", "функция без прототипа", "структуры с
дырками", "свич без дефаулта или не все енумы" и т.д. Исправлять
все это рука не поднимается, боюсь увязнуть и что-то случайно
испортить. - AlexBi(26.01.2024 17:13)
- Ну, значит код самого OpenOCD был достаточно чистым. Править приходилось, в основном, подклюаемые библиотеки от неособо щепитильных разработчиков. Если не исправлять - есть риск оставить глюки при исользовании полной оптимизации. LTO вместе с O3 используют любые послабления. И если что-то может пойти не так и окажется выгодно для оптимизации - то пойдёт не так. - Nikolay_Po(26.01.2024 18:15)
- Это у вас какие-то умные предупреждения. Я, после включения всех
предупреждений, чаще вижу "сравнение знакового и беззнакового",
"запись в переменную меньшего размера", "использование
зарезервированных имен", "функция без прототипа", "структуры с
дырками", "свич без дефаулта или не все енумы" и т.д. Исправлять
все это рука не поднимается, боюсь увязнуть и что-то случайно
испортить. - AlexBi(26.01.2024 17:13)
- Ну, я для прикола, скомпилировал OpenOCD с -O3 -flto.
Предупреждений штук 50 пришлось поправить. Часто встречалось, что,
размер буфера был определён меньше, чем возможный размер вносимых в
буфер данных. Собственно, предпосылки к глюкам. - Nikolay_Po(26.01.2024 14:16)
- Пофиксить в чужом коде - это исправить чужой код? Там работы ... - AlexBi(25.01.2024 17:07)
- Эхх... А я, наоборот, включаю эту фигню, -flto=auto (авто - чтобы
оптимизатор сориентировался по количетсву доступных ядер ЦП хоста
при компиляции), чтобы повысить качество кода. Писал уже не раз,
что LTO позволяет быстрее находить ошибки, по крайней мере на свежих GCC, начиная с 10 и
выше. На 9й версии с CortexM3 было чуть неоднозначно. Nikolay_Po(127 знак., 25.01.2024 15:56)
- если вещь ответственная - то без WatchDog никак... всё остальное - всё равно не доказывает что сбой устранен - может просто его вероятность понижена в разы-десятки раз - sav6622(25.01.2024 10:13)
- В первую очередь отключите lto. Эта фигня очень сложная и иногда
дает непредсказуемые результаты. Серия NUC97x в комплекте с
китайским линуксом никаких нареканий по части надежности не вызвала
вплоть до снятия изделий с производства. У вас похоже bare metal,
так это ССЗБ при использовании китайчины. С китайскими изделиями
любой даже самый минимальный шаг в сторону - это песец, опыт работы
с западными чипами тут надо забыть. - 3m(25.01.2024 14:09)
- Какая гарантия того что не будет? 6 часов непрерывной работы? 24?
Гарантий нет, а потом будет "фобос в грунт". Если есть сбой, надо
разобраться, а не обходить без понимания причин. VVB(266 знак., 25.01.2024 10:10)
- Для тестирования, попробовал вернуться к корням. Оригинальный
проект Nuvoton NUC970_NonOS_BSP из SampleCode/FreeRTOS при "-O3
-flto=auto" в GCC13 с некоторыми несущественными правками (для
устранения ошибок сборки) собирается, но перестаёт работать даже на
стадии инициализации, происходит разрыв отладочного соединения JTAG
в sysSetupCP15(). При уровне "-O0", однако, оригинальный проект
работает. VVB(44 знак., 30.01.2024 09:07, ссылка)