|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 12:28 am
|
Страница 1 от 1
|
[ 13 мнения ] |
|
| Автор |
Съобщение |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Cortex-M3 и прекъсвания
Всичко се случва на Олимекското платче STM32-H152. Софта е бутлоудър + апликейшън. От апликейшън трябва да вляза в бутлоудър (за последващо флашване) без да детачвам USB-то. И на двете места имам само 2 разрешени прекъсвания: SysTick и USB_LP_IRQ. За целта в апликейшъна забранявам временно прекъсванията със "CPSID F" - за всеки случай да блокира всичко. Правя джъмп към буут и разрешавам отново прекъсванията ("CPSIE F"), след което нито сисТик, нито USB интеръптите работят. Като след джъмпа, реинициализирам SysTick-a, щото трябва да цъка по-различно. Явно пропускам да направя още нещо, но какво е то? Джъмпа е нещо такова:
|
| Съб Май 12, 2012 8:58 pm |
|
 |
|
loser
Ранг: Минаващ
Регистриран на: Съб Ное 12, 2011 9:21 pm Мнения: 62
|
 Re: Cortex-M3 и прекъсвания
може би трябва да направиш usb reenumeration, не съм много навътре с usb, но работя с stm32103, и на мен ми трябва точно това, което се опитваш да направиш, дано успееш - и да споделиш решението; това usb reenumeration, доколкото успях да видя в примерите на st, се състои във физическо откачане и след това закачане към usb шината, доколкото разбрах - това се прави с въздействие върху жицата за данни на usb интерфейса - насилствено дърпане към vdd/vss за определено време - за тези цели трябва на платката да има предвидени за тази цел жици, които може да управляваш непосредствено от контролера
от друга страна, може би е възможно и софтуерно да превключваш режима на работа - st дават един пример, dfu - device firmware update, аз ползвам него, за мен той работи, но аз сложих в началото да се проверява състоянието на един пин на процесора - според това състояние преценявам дали да се представя като bootloader, или като основното устройство; така и не успях да направя тези неща без да откачам/закачам usb-то
чисто практически - ако ти е възможно - първо провери с дебъгер дали скокът ти работи, ако не работи - може да провериш дали си препрограмирал коректно базовия адрес на векторната таблица - но едва ли е това
за моето устройство прецених, че няма смисъл да правя това, което ти искаш - макар, че е по-удобно при нужда за смяна на фирмуеъра това да става без нужда да се разкача устройството и да се окъсяват жици; твърде рядко се налага да го препрограмирам, и се примирих
със сигурност някои от хората тук знаят как се прави, дано споделят опит
|
| Съб Май 12, 2012 9:27 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: Cortex-M3 и прекъсвания
Точно реенумерацията искам да избегна, защото хост приложението, с което флашвам (3rd party), отива в киреча след първата изпратена команда. Иначе скоковете работят както трябва - проверено е. Въпроса остава. Сигурен съм, че във форума някой някога е настъпвал същата мотика 
|
| Съб Май 12, 2012 9:40 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Cortex-M3 и прекъсвания
По-добре си оправи приложението, всичко останало е потенциална бомба със закъснител...
Нормално, един буутстрап очаква да го извика ресет вектора и всички периферии да са му ресетнати, т.е. "девствени". Почти всички разчитат на това и си пипат само неща, които им трябват. Примерно не хранят кучето, ако не са му отвързали каишката. Но ако друг софтуер е бръмчал преди това няма никаква гаранция кво е пускал и омазал. Затова като се вика бутстрап се прави или пълен ресет или само ресет на перифериите и чак тогава джъмп.
Аз горещо препоръчвам ресетване на перифериите, включително и на USB-то плюс нова енумерация и всичко да си тръгне на чисто. Но ако много държиш да го направиш без откачане мисля че може да стане. Но трябва да подадеш информация на бутстрапа откъде го викаш и съответно той да прецени какво да прави с USB-то. Не познавам ST, но някои куртекси си имат reset cause регистър и от там бутстрапа може да разбере кой го е извикал. Всъщност може както си забранил прекъсванията по това да се познае... Значи първо ако можеш направи ресет на всички останали периферии без USB, спри си и SysTick-а и извикай бутстрапа. Той да си инициализира всичко както си му е реда, но като стигне до USB да провери дали са разрешени прекъсванията. Ако не са, може да прескочиш инициализацията на хардуера и само да инициализираш структурите на USB стека, така че да се излъже че е минала инициализацията, сетване на USB адрес, избор на device configuration и т.н. Имай предвид, че след прекомпилиране променливите си сменят адресите, така че ти трябва да се погрижиш за применливите на USB стека. В идеалния случай той изобщо няма да разбере, че е имало някаква гимнастика. Но тъй като може да имаш промени по USB стека, бъгове и т.н. може би най-добре да ресетнеш USB хардуера (ако си бърз и не бараш пулъпа, хоста няма да разбере) и след това го инициализираш и да симулираш сетъп пакетите за адреса и избор на конфигурация (евентуално размер на фифота, ендпоинт и т.н). Така не зависиш от предишни версии на софта, обаче ако не познаваш USB стека дето ползваш може да си вкараш и автогол.
|
| Нед Май 13, 2012 12:31 am |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
 Re: Cortex-M3 и прекъсвания
Аз ползвам нещо подобно, ама минавам през ресет, т.е. имам енумерация наново.
При мен обаче е задължително, щото основното ми приложение е на VCOM, a бутлоадера на DFU.
Ако и двете се търкалят под един дивайс клас... МОЖЕ БИ наистина може да минеш без енумерация. Честно казано не виждам що да не стане, ама наистина трябва да си много сигурен в какво състояние основното приложение зарязва системата и в какво очаква да я получи бутлоадера.
Значи целия проблем на подобни гадости е, че много трудно се дебъгва. Ама трябва да измислиш начин. Един от начините е да си имплементираш в самия бутлоадер, част от кода на приложението (инициализацията както е в самото приложение и скока към бутлоадера). Т.е. целия код да ти е в бутлоадера и да си пуснеш дебъгера. Щото иначе нищо не виждаш, стреляш на сляпо.
Имаш ли идея поне какво се случава, като "забие"? Смисъл ексепшън ли набива, кой? Сложи там някакви пинове да сигнализират къде през какво си минал, че иначе е безмислено да копаш.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Нед Май 13, 2012 11:07 am |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: Cortex-M3 и прекъсвания
Уф, хванах го. Когато писах първия пост, джъмпа се изпълняваше в колбека на ендпойнта по който получавам данните. Сега го преместих извън прекъсване и май стана (на СисТик-а имам един ЛЕД, вече цъка). USB-то също има прекъсвания, но все още не съм проверил дали получава данни както трябва... Мистерии...
|
| Нед Май 13, 2012 1:32 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
 Re: Cortex-M3 и прекъсвания
Абе много объркано звучиш  Както каза Миро, постарай се добре да изолираш двата процеса, до колкото е възможно, предвид изискванията де.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Нед Май 13, 2012 2:02 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: Cortex-M3 и прекъсвания
Миро, идеята е да се ползват 3-rd party лоудъри, щото ги има за всякакви ОС. Затова е цялата гимнастика.
|
| Нед Май 13, 2012 2:22 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Cortex-M3 и прекъсвания
В куртекса всичко се води ексепшън. Прекъсванията са вид ексепшън. Важното е, че всеки ексепшън си има ниво, което може да е фиксирано (системните ексепшъни) или може да е програемируемо (повечето прекъсвания). Самото ядро следи нивата и не позволява инверсия на приоритетите. Казано на прост език, преди да рестартираш трябва да "излезеш" от всякакви прекъсвания/ексепшъни. Иначе бутстрапа или софтуера след него може да се опита да извика примерно SVC дето е с по-нисък приоритет от твоя и ще гръмне с hard fault. Чистенето не е сложно, ще дам малко код защото и на други може да им се наложи да рестартират (приемерно при хард фаулт или друго омазване след което трябва да се ребутне):  |  |  |  | Код: FUNC( LowLevelBoot )
// тука може да има ресет на периферии и т.н.
// тук си подготвяш един малък стек нейде в края на паметта и сетваш и двата SP там ldr r1, =__stack_svc_end msr MSP, r1 msr PSP, r1 mov.w r3, #0x1000000
// после проверяваме текущото ниво mrs r0, PSR lsls r0, #23 beq 9f
// нивото не е ОК, затова симулираме "излизане" от ексепшън, но ще се върнем пак в същата процедура... ldr r2, = LowLevelBoot stmia r1, {r2-r3} // PC, xPSR subs r1, #6*4 //r0-r3,r12, r14 msr PSP, r1 mov r1, #0xFFFFFFFD bx r1
9: // Restart (от адрес 0) cpsie i msr PSR, r3 mov.w r2, #0x0 ldr sp, [r2] ldr r2, [r2, #4] bx r2
ENDF( LowLevelBoot )
|  |  |  |  |
Ако лоадера ползва USB не виждам как ще стане... Той ако е читаво написан трябва да свали пулъпа поне за 50ms, за да почне на чисто, а тогава и хоста ще иска нова енумерация.
|
| Нед Май 13, 2012 4:18 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: Cortex-M3 и прекъсвания
Да, сега вече е по-ясно. Благодаря, Миро. Тая идея със скоците ще донесе повече мъки, отколкото ползи, затова отива в киреча. По-добре бутлоудъра да е развързан напълно от апликейшъна, най-вече заради евентуални нови версии на разните му стекове и т.н.
|
| Нед Май 13, 2012 6:28 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
 Re: Cortex-M3 и прекъсвания
Точно така! Иначе, софтуерния рестарт пак може да си го ползваш. Примерно при мен като се омаже пейзажа (гръмне куче или има кофти ексепшън) искам да покажа причината на екрана, обаче нямам как да знам дали и GUI-то ми не е омазано. Затова си запомням причината и викам горната процедура. Тя симулира толкова връщания от прекъсвания, колкото е нужно. Периферията също се ресетва и всичко тръгва абсолютно на чисто все едно като след power ресет. Но после като тръгне приложението си гледа reset cause регистъра и разбира, че не е баш истински ресет. Тогава вече се изкарва BOD-a (blue screen of death) По принцип има и по-лесен начин за софтуерен ресет, имаше някакъв SYSRESETREQ бит но не помня вече защо на нас не ни вършеше работа...
|
| Нед Май 13, 2012 7:00 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: Cortex-M3 и прекъсвания
Точно софтуерния ресет мисля да ползвам. Аз все пак си имам вратичка за евентуална разширена комуникация между буут и аппл, и тя е - неинициализирана РАМ. В добавка към ресет причините може да свърши полезна работа понякога.
|
| Нед Май 13, 2012 7:13 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
 Re: Cortex-M3 и прекъсвания
Аз минавам през софтуерен ресетот апликейшъна към лоадера. Щото ме мързи да мисля В бакъп регистрите шибвам някакъв идентификационнен стринг и му бия рисета, съответно бутлоадера ги прочита и поема той.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Май 14, 2012 10:14 am |
|
|
|
Страница 1 от 1
|
[ 13 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 6 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|