| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Cortex-M3 и прекъсвания http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=10125 |
Страница 1 от 1 |
| Автор: | tolstolob [ Съб Май 12, 2012 8:58 pm ] | |||||||||
| Заглавие: | Cortex-M3 и прекъсвания | |||||||||
Всичко се случва на Олимекското платче STM32-H152. Софта е бутлоудър + апликейшън. От апликейшън трябва да вляза в бутлоудър (за последващо флашване) без да детачвам USB-то. И на двете места имам само 2 разрешени прекъсвания: SysTick и USB_LP_IRQ. За целта в апликейшъна забранявам временно прекъсванията със "CPSID F" - за всеки случай да блокира всичко. Правя джъмп към буут и разрешавам отново прекъсванията ("CPSIE F"), след което нито сисТик, нито USB интеръптите работят. Като след джъмпа, реинициализирам SysTick-a, щото трябва да цъка по-различно. Явно пропускам да направя още нещо, но какво е то? Джъмпа е нещо такова:
|
||||||||||
| Автор: | loser [ Съб Май 12, 2012 9:27 pm ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
може би трябва да направиш usb reenumeration, не съм много навътре с usb, но работя с stm32103, и на мен ми трябва точно това, което се опитваш да направиш, дано успееш - и да споделиш решението; това usb reenumeration, доколкото успях да видя в примерите на st, се състои във физическо откачане и след това закачане към usb шината, доколкото разбрах - това се прави с въздействие върху жицата за данни на usb интерфейса - насилствено дърпане към vdd/vss за определено време - за тези цели трябва на платката да има предвидени за тази цел жици, които може да управляваш непосредствено от контролера от друга страна, може би е възможно и софтуерно да превключваш режима на работа - st дават един пример, dfu - device firmware update, аз ползвам него, за мен той работи, но аз сложих в началото да се проверява състоянието на един пин на процесора - според това състояние преценявам дали да се представя като bootloader, или като основното устройство; така и не успях да направя тези неща без да откачам/закачам usb-то чисто практически - ако ти е възможно - първо провери с дебъгер дали скокът ти работи, ако не работи - може да провериш дали си препрограмирал коректно базовия адрес на векторната таблица - но едва ли е това за моето устройство прецених, че няма смисъл да правя това, което ти искаш - макар, че е по-удобно при нужда за смяна на фирмуеъра това да става без нужда да се разкача устройството и да се окъсяват жици; твърде рядко се налага да го препрограмирам, и се примирих със сигурност някои от хората тук знаят как се прави, дано споделят опит |
|
| Автор: | tolstolob [ Съб Май 12, 2012 9:40 pm ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
Точно реенумерацията искам да избегна, защото хост приложението, с което флашвам (3rd party), отива в киреча след първата изпратена команда. Иначе скоковете работят както трябва - проверено е. Въпроса остава. Сигурен съм, че във форума някой някога е настъпвал същата мотика |
|
| Автор: | miro_atc [ Нед Май 13, 2012 12:31 am ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
По-добре си оправи приложението, всичко останало е потенциална бомба със закъснител... Нормално, един буутстрап очаква да го извика ресет вектора и всички периферии да са му ресетнати, т.е. "девствени". Почти всички разчитат на това и си пипат само неща, които им трябват. Примерно не хранят кучето, ако не са му отвързали каишката. Но ако друг софтуер е бръмчал преди това няма никаква гаранция кво е пускал и омазал. Затова като се вика бутстрап се прави или пълен ресет или само ресет на перифериите и чак тогава джъмп. Аз горещо препоръчвам ресетване на перифериите, включително и на USB-то плюс нова енумерация и всичко да си тръгне на чисто. Но ако много държиш да го направиш без откачане мисля че може да стане. Но трябва да подадеш информация на бутстрапа откъде го викаш и съответно той да прецени какво да прави с USB-то. Не познавам ST, но някои куртекси си имат reset cause регистър и от там бутстрапа може да разбере кой го е извикал. Всъщност може както си забранил прекъсванията по това да се познае... Значи първо ако можеш направи ресет на всички останали периферии без USB, спри си и SysTick-а и извикай бутстрапа. Той да си инициализира всичко както си му е реда, но като стигне до USB да провери дали са разрешени прекъсванията. Ако не са, може да прескочиш инициализацията на хардуера и само да инициализираш структурите на USB стека, така че да се излъже че е минала инициализацията, сетване на USB адрес, избор на device configuration и т.н. Имай предвид, че след прекомпилиране променливите си сменят адресите, така че ти трябва да се погрижиш за применливите на USB стека. В идеалния случай той изобщо няма да разбере, че е имало някаква гимнастика. Но тъй като може да имаш промени по USB стека, бъгове и т.н. може би най-добре да ресетнеш USB хардуера (ако си бърз и не бараш пулъпа, хоста няма да разбере) и след това го инициализираш и да симулираш сетъп пакетите за адреса и избор на конфигурация (евентуално размер на фифота, ендпоинт и т.н). Така не зависиш от предишни версии на софта, обаче ако не познаваш USB стека дето ползваш може да си вкараш и автогол. |
|
| Автор: | Цецо [ Нед Май 13, 2012 11:07 am ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
Аз ползвам нещо подобно, ама минавам през ресет, т.е. имам енумерация наново. При мен обаче е задължително, щото основното ми приложение е на VCOM, a бутлоадера на DFU. Ако и двете се търкалят под един дивайс клас... МОЖЕ БИ наистина може да минеш без енумерация. Честно казано не виждам що да не стане, ама наистина трябва да си много сигурен в какво състояние основното приложение зарязва системата и в какво очаква да я получи бутлоадера. Значи целия проблем на подобни гадости е, че много трудно се дебъгва. Ама трябва да измислиш начин. Един от начините е да си имплементираш в самия бутлоадер, част от кода на приложението (инициализацията както е в самото приложение и скока към бутлоадера). Т.е. целия код да ти е в бутлоадера и да си пуснеш дебъгера. Щото иначе нищо не виждаш, стреляш на сляпо. Имаш ли идея поне какво се случава, като "забие"? Смисъл ексепшън ли набива, кой? Сложи там някакви пинове да сигнализират къде през какво си минал, че иначе е безмислено да копаш. |
|
| Автор: | tolstolob [ Нед Май 13, 2012 1:32 pm ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
Уф, хванах го. Когато писах първия пост, джъмпа се изпълняваше в колбека на ендпойнта по който получавам данните. Сега го преместих извън прекъсване и май стана (на СисТик-а имам един ЛЕД, вече цъка). USB-то също има прекъсвания, но все още не съм проверил дали получава данни както трябва... Мистерии... |
|
| Автор: | Цецо [ Нед Май 13, 2012 2:02 pm ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
Абе много объркано звучиш |
|
| Автор: | tolstolob [ Нед Май 13, 2012 2:22 pm ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
Миро, идеята е да се ползват 3-rd party лоудъри, щото ги има за всякакви ОС. Затова е цялата гимнастика. |
|
| Автор: | miro_atc [ Нед Май 13, 2012 4:18 pm ] | |||||||||||||||||||||||||||
| Заглавие: | Re: Cortex-M3 и прекъсвания | |||||||||||||||||||||||||||
В куртекса всичко се води ексепшън. Прекъсванията са вид ексепшън. Важното е, че всеки ексепшън си има ниво, което може да е фиксирано (системните ексепшъни) или може да е програемируемо (повечето прекъсвания). Самото ядро следи нивата и не позволява инверсия на приоритетите. Казано на прост език, преди да рестартираш трябва да "излезеш" от всякакви прекъсвания/ексепшъни. Иначе бутстрапа или софтуера след него може да се опита да извика примерно SVC дето е с по-нисък приоритет от твоя и ще гръмне с hard fault. Чистенето не е сложно, ще дам малко код защото и на други може да им се наложи да рестартират (приемерно при хард фаулт или друго омазване след което трябва да се ребутне):
Ако лоадера ползва USB не виждам как ще стане... Той ако е читаво написан трябва да свали пулъпа поне за 50ms, за да почне на чисто, а тогава и хоста ще иска нова енумерация. |
||||||||||||||||||||||||||||
| Автор: | tolstolob [ Нед Май 13, 2012 6:28 pm ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
Да, сега вече е по-ясно. Благодаря, Миро. Тая идея със скоците ще донесе повече мъки, отколкото ползи, затова отива в киреча. По-добре бутлоудъра да е развързан напълно от апликейшъна, най-вече заради евентуални нови версии на разните му стекове и т.н. |
|
| Автор: | miro_atc [ Нед Май 13, 2012 7:00 pm ] | |||||||||
| Заглавие: | Re: Cortex-M3 и прекъсвания | |||||||||
Точно така! Иначе, софтуерния рестарт пак може да си го ползваш. Примерно при мен като се омаже пейзажа (гръмне куче или има кофти ексепшън) искам да покажа причината на екрана, обаче нямам как да знам дали и GUI-то ми не е омазано. Затова си запомням причината и викам горната процедура. Тя симулира толкова връщания от прекъсвания, колкото е нужно. Периферията също се ресетва и всичко тръгва абсолютно на чисто все едно като след power ресет. Но после като тръгне приложението си гледа reset cause регистъра и разбира, че не е баш истински ресет. Тогава вече се изкарва BOD-a (blue screen of death) По принцип има и по-лесен начин за софтуерен ресет, имаше някакъв SYSRESETREQ бит но не помня вече защо на нас не ни вършеше работа... |
||||||||||
| Автор: | tolstolob [ Нед Май 13, 2012 7:13 pm ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
Точно софтуерния ресет мисля да ползвам. Аз все пак си имам вратичка за евентуална разширена комуникация между буут и аппл, и тя е - неинициализирана РАМ. В добавка към ресет причините може да свърши полезна работа понякога. |
|
| Автор: | Цецо [ Пон Май 14, 2012 10:14 am ] |
| Заглавие: | Re: Cortex-M3 и прекъсвания |
Аз минавам през софтуерен ресетот апликейшъна към лоадера. Щото ме мързи да мисля В бакъп регистрите шибвам някакъв идентификационнен стринг и му бия рисета, съответно бутлоадера ги прочита и поема той. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|