Отговори на тема  [ 13 мнения ] 
Cortex-M3 и прекъсвания 
Автор Съобщение
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Cortex-M3 и прекъсвания
Всичко се случва на Олимекското платче STM32-H152.
Софта е бутлоудър + апликейшън. От апликейшън трябва да вляза в бутлоудър (за последващо флашване) без да детачвам USB-то. И на двете места имам само 2 разрешени прекъсвания: SysTick и USB_LP_IRQ.
За целта в апликейшъна забранявам временно прекъсванията със "CPSID F" - за всеки случай да блокира всичко. Правя джъмп към буут и разрешавам отново прекъсванията ("CPSIE F"), след което нито сисТик, нито USB интеръптите работят. Като след джъмпа, реинициализирам SysTick-a, щото трябва да цъка по-различно.

Явно пропускам да направя още нещо, но какво е то?

Джъмпа е нещо такова:
Код:
stackPointerValue = *((const volatile UInt32 *) BOOTLOADER_START_ADDR);
pBootResetVector = (TBootResetVector) *((const volatile UInt32 *)(BOOTLOADER_START_ADDR + 4));
           
__disable_fiq();
           
SCB->VTOR = BOOTLOADER_START_ADDR;
__set_MSP( stackPointerValue );
pBootResetVector();


Съб Май 12, 2012 8:58 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 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
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: Cortex-M3 и прекъсвания
Точно реенумерацията искам да избегна, защото хост приложението, с което флашвам (3rd party), отива в киреча след първата изпратена команда.
Иначе скоковете работят както трябва - проверено е.
Въпроса остава. Сигурен съм, че във форума някой някога е настъпвал същата мотика :)


Съб Май 12, 2012 9:40 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 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
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 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
Профил ICQ
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: Cortex-M3 и прекъсвания
Миро, идеята е да се ползват 3-rd party лоудъри, щото ги има за всякакви ОС. Затова е цялата гимнастика.


Нед Май 13, 2012 2:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Cortex-M3 и прекъсвания
tolstolob написа:
Уф, хванах го. Когато писах първия пост, джъмпа се изпълняваше в колбека на ендпойнта по който получавам данните. Сега го преместих извън прекъсване и май стана (на СисТик-а имам един ЛЕД, вече цъка). USB-то също има прекъсвания, но все още не съм проверил дали получава данни както трябва... Мистерии...


В куртекса всичко се води ексепшън. Прекъсванията са вид ексепшън. Важното е, че всеки ексепшън си има ниво, което може да е фиксирано (системните ексепшъни) или може да е програемируемо (повечето прекъсвания). Самото ядро следи нивата и не позволява инверсия на приоритетите.

Казано на прост език, преди да рестартираш трябва да "излезеш" от всякакви прекъсвания/ексепшъни. Иначе бутстрапа или софтуера след него може да се опита да извика примерно 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   )



tolstolob написа:
Миро, идеята е да се ползват 3-rd party лоудъри, щото ги има за всякакви ОС. Затова е цялата гимнастика.

Ако лоадера ползва USB не виждам как ще стане... Той ако е читаво написан трябва да свали пулъпа поне за 50ms, за да почне на чисто, а тогава и хоста ще иска нова енумерация.


Нед Май 13, 2012 4:18 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: Cortex-M3 и прекъсвания
Да, сега вече е по-ясно. Благодаря, Миро.
Тая идея със скоците ще донесе повече мъки, отколкото ползи, затова отива в киреча.
По-добре бутлоудъра да е развързан напълно от апликейшъна, най-вече заради евентуални нови версии на разните му стекове и т.н.


Нед Май 13, 2012 6:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Cortex-M3 и прекъсвания
tolstolob написа:
По-добре бутлоудъра да е развързан напълно от апликейшъна, най-вече заради евентуални нови версии на разните му стекове и т.н.


Точно така!

Иначе, софтуерния рестарт пак може да си го ползваш. Примерно при мен като се омаже пейзажа (гръмне куче или има кофти ексепшън) искам да покажа причината на екрана, обаче нямам как да знам дали и GUI-то ми не е омазано. Затова си запомням причината и викам горната процедура. Тя симулира толкова връщания от прекъсвания, колкото е нужно. Периферията също се ресетва и всичко тръгва абсолютно на чисто все едно като след power ресет. Но после като тръгне приложението си гледа reset cause регистъра и разбира, че не е баш истински ресет. Тогава вече се изкарва BOD-a (blue screen of death)

По принцип има и по-лесен начин за софтуерен ресет, имаше някакъв SYSRESETREQ бит но не помня вече защо на нас не ни вършеше работа...


Нед Май 13, 2012 7:00 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 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
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 13 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни