| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Дебъг и анализ на системи с RTOS http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13981 |
Страница 1 от 1 |
| Автор: | emilvtc [ Съб Авг 15, 2015 12:41 pm ] |
| Заглавие: | Дебъг и анализ на системи с RTOS |
В съседната тема се повдигна въпроса за дебъгването и отварям нова тема за целта. Системите които правя обикновено са в едночиопв вариант и обикновено всички пинове са заети, даже на пин има и по няколко периферии (шерване на пин). Развойните средства които използвам са нискобюджетни (jtag-ове разни) и съм поставен в условия "с пръдня боя" да правя ... (Предполагам, че повечето от вас работят с подобни ограничения) Та въпроса е как да дебъгваме устройствата си с възможност да извлечем максимално инфо какво се случва, без да се променят много таймингите на програмата, без да се използат много пинове (защото обикновено няма свободни). В моя случай живо ме интересува и моментната консуюация на устройството (не само на процесора), и дебъг инфото за активността в момента трябва да ми е "синхронно" с консумацията ... Системата е с RTOS, но и да не е- проблемите са сходни... |
|
| Автор: | palavrov [ Съб Авг 15, 2015 4:14 pm ] |
| Заглавие: | Re: Дебъг и анализ на системи с RTOS |
Малко размисли по темата: 0. Дистанционния ъпдейт трябва винаги да работи, без "ако" "ама" "само, че" и т.н.,че едно гипсиране на полето може да катурне цял бизнес. 1. След като е дистанционно е ясно, че няма как да се дебъгва, затова трябва да има железен лог - по възможност без зависимост от останалата част и хардуер - един външен флаш примерно който да се клати през някакви пинове с някакъв що годе читава структура за да не се губят съобщения. Няма нужда да се записват текстови съобщения, достатъчно е да се запише само адреса на който се е установило, че има грешка. Така се спестява адски много място за грешки а после девлопора с addr2line може да си намери къде точно е грешката - едно макросче и толкова. 2. Обработка на грешки и възстановяване на системата след грешка - колкото по просто, толкова по добре. Едно от най железните решения е рестартиране на цялото устройство при по сериозни грешки или поне на основната функционалност при по отделени възли/задачи - например gps, gprs и т.н. Това не се отнася за подистемата за логване на грешки - там е друга бира, трябва да работи винаги. 3. Forgiveness - има грешки и грешки, понякога някои грешки може само да се запишат в лог-а и да не се отработят като грешка - примерно грешка при някоя спомагателна AT команда в gprs системата. 4. Адски полезно е при грешки да се записва call stack с дълбочина 5-6 функции за да може програмиста после да разбере как се е стигнало до тази грешка (пак да повторя, достатъчно е да се записват само 4 байта с адресите на извикването на функциите - т.е. адресите за връщане от stack frame). 5. В случай на death lock на някоя нишка помага много ако се запишат call stack на всички нишки ( обикновенно са под 10 ) 6. Всеки докладван запис в лог файла трябва да се взема в предвид и да се анализира защо се е получил и съответно да се отработи: - да се оправи ако има бъг - да се даде повече видимост т.е. да се добавят още съобщения в лог-а за да се изясни ситуацията - да се махне генерирането на грешка ако това е нормална по време на работа да стават разни грешки - примерно CRC грешка в някоя комуникация, като тук има и няколко нюанса - в началато трябва да се логва за да може да се прецени колко често се логват такива грешки, това може да е заради някакъв друг (включително хардуерен) проблем, и като се установи, че всичко е точно от грешка да стане на предупреждение и т.н. 7. Куче на високо ниво - всички устройства трябва пишат примерно веднъж на ден едно съобщение в лог-а, че всичко е наред. И на сървъра ако някое устройство запази подозрително мълчание да му се обръща веднага внимание - т.е. това, че няма доклад за грешка може да означава и, че всичко е толкова омазано, че не може да се докладва ... |
|
| Автор: | emilvtc [ Съб Авг 15, 2015 4:48 pm ] |
| Заглавие: | Re: Дебъг и анализ на системи с RTOS |
Ще опиша как работя към момента, като се надявам заедно да подобрим варианта. В почти всички устройства имам поне по един led закачен към пин на проца. Връзвам led-а към захранванв, така че проца го пали с лог. 0. Това ми дава възможност да използвам изхода на проца като TxD за UART. Там, където мога конфигуриирам хардуерен уарт (ако има свободен) към този пин и сетвам най-високия баудрейт. Където не може с хардуерер -правя софтуерно предаване на байт (със задържане на управлението и моментно забранени прекъсвания) и баудрейт няколко мегабита (1,2 или 4). Така задържането на управлението и забавянето на програмата ми е 10uS, 5uS или 2.5uS в зависимост от баудрейта. При хардуерен уарт няма такова забавяне. Идеята е при преминаване през критични или важни точки в програмата да извеждам диагностични кодове прз уарт-а, които да чета с единия от каналите на логическия ми анализатор. С другите канали си следя останалата част от външния хардуер, а с аналоговия му канал следя моментната консумация на устройството. Падащия фронт на стартовия бит на уарт-а ми дава инфо за момента (с много малко закъснение) в който съм минал през "критичния" участък/точка от кода, а стойността на байта ми дава инфо за самия участък. Анализатора може да декодира уарт данните и ги виждам в хекс формат. Така имам инфо за преминаването през 255 такива контролни точки/участаци в кода. Допълнително ако искам да изведа някакви данни освен номера на контролната точка/участък - предавам един или няколко байта с данни след това (но не трябва да се прекалява с данните). С условна компилация заменям функциите за управление на лед-а с празни такива в диагносичен режим. В релиз режим съответно заменям с празни - функциите за извеждане на дебъг и фото през уарт-а. Как може да се подобри варианта и има ли по-добър? Мислех за вариант и да логвам данните от уарта на проца в PC-то и после с някакъв "парсер" да ги процесвам... На пример в еклипса може да се направи плъгин за целта... Няма ли нещо готово такова или подобно решение? П.П Мислех за диагностика по време на развоя, но palavrov добавя и момента след това... |
|
| Автор: | palavrov [ Съб Авг 15, 2015 6:41 pm ] |
| Заглавие: | Re: Дебъг и анализ на системи с RTOS |
По време на разработка debug log-а го пренасочвам целия през uart - и винаги имам закачен един FTDI към компа така, че да гледам на живо как работи системата. Вече за по тънки неща клатя някое гпио около кода който ме интересува - забавянето е минимално и дава добра видимост в лог. анализатор колко често се минава през този код, колко време се остава в него и т.н. На практика винаги когато е възможно избягвам дебъгване през JTAG защото спреш ли процесора не значи, че си спрял цялата система - ако има gprs или gps те си работят самостоятелно и става една каша ... затова превантивно писане на ясен и четлив код + повечко дебъг съобщения и четене на логовете. Тънките проблеми винаги са се случвали рядко и то на полето, затова според мен е по важно да се копае в тази посока ... като ти е на бюрото можеш да правиш всичко, ама като е на другия край на страната и клиента реве на умряло дупе да ти е яко |
|
| Автор: | miro_atc [ Нед Авг 16, 2015 11:02 am ] |
| Заглавие: | Re: Дебъг и анализ на системи с RTOS |
Трейс по принцип е добре да може да се изкарва по наличните интерфейси uart/usb/ethernet според каквото е налично... Но като скорост и удобство фабрично заложения дебъг интерфейс е най-добре. Ако иде реч за каубойските куртекси, те си имат SWO и по една жица изкарват 50-60 MHz. Всъщност зависи колко як драйвер са сложили, може и по-якичък да е при новите. А може и да е по-кекав, щото се сещам за STM-те най-слабата фамилия F1 е с най-яките драйвери... SWO-то по принцип може да изкарва стандартен UART, но при тия скорости е супер сложно да се семплира, затова се пуска манчестер кодиране. Така данните падат 2 пъти, примерно на 40MHz излизат 20Mbit/s но се семплира много по-лесно и става независимо от самия клок. Така трейса си работи още от тръгването на проца с вътрешния RC и може динамично да сменяш клока както си искаш. Та с две думи SWO е супер като скорост и гъвкавост и без алтернатива когато трябва да се дебъгват бързи неща, а не може да се спира. Примерно като дебъгвам етернет просто пускам трейса на пакетите на lwIP от моята страна и wireshark от другата и всичко става ясно... Определено като скорост няма грижи и изобщо не товари и забавя проца. По-скоро проблем е използването на памет, защото като се сложат много трейсoве с printf и това може да яде стек. Това ни беше голям проблем на нас и за целта се наложи да напиша вариант на sprintf, който не използва буфери. В случай че трейс интерфейса е бавен (като uart) тогава е добре да има памет, за да може да се буферира. Защото по принцип през повечето време почти няма какво да се трейсва, после изведнъж става твърде напечено и ако е uart без буфер най-интересното обикновено се губи... |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|