|
Виж темите без отговор | Виж активните теми
Дата и час: Пет Авг 21, 2026 10:39 pm
Заменям финансова срещу програмна помощ (ARM Cortex CM3)
| Автор |
Съобщение |
|
kiiid
Ранг: Почетен член
Регистриран на: Съб Сеп 24, 2005 2:00 pm Мнения: 787
|
Ами да ти кажа не съм сетвал тика на най-нисък приоритет в main(). Ще го пробвам в понеделник. А иначе той компилатора сам си слага единицата, това съм го проверил вече
|
| Съб Мар 19, 2011 12:52 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11278 Местоположение: Добрич
|
Ако слага единица може ти да не се сдържиш и да ме напсуваш 
|
| Съб Мар 19, 2011 3:25 pm |
|
 |
|
kiiid
Ранг: Почетен член
Регистриран на: Съб Сеп 24, 2005 2:00 pm Мнения: 787
|
Абе аз в псуване по тебе няма да се юркам (целия ми репертоар там е запазен за създателите на кортекс) ама пак не става работата. Сложих най-ниския приоритет на систик, сетнах флага нонсис-незнам-си-какво и пак ми гърми по същия начин 
|
| Пон Мар 21, 2011 4:12 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11278 Местоположение: Добрич
|
ех... не става
Пробвал съм го преди да ти пиша....
Ето ти кода дето тествай
Ресет вектор:
Е случая за по-лесно ползвам pending вместо systick но това няма значение... (все прекъсване) Самото прекъсване: Функция за същинската обработка (може да е написана на С ): Като излезе от SysCall идва тук: И сървиса: sys_svc_handler:
Това нещо ще върви на кой да е куртекс - като тръгне от ресет влиза в пендинг, после обработка, после thread_exit, svc 0 и се връща и продължава в ресет...
Ако нещо не работи при теб поне виж какво. В систем контрола (SCB) има един регистър CFSR (current fault status register) виж какво ти дава като причина за фаулт-а
|
| Пон Мар 21, 2011 10:26 am |
|
 |
|
kiiid
Ранг: Почетен член
Регистриран на: Съб Сеп 24, 2005 2:00 pm Мнения: 787
|
Утре ще го пробвам и ще ти кажа резултата!
|
| Пон Мар 21, 2011 11:37 am |
|
 |
|
kiiid
Ранг: Почетен член
Регистриран на: Съб Сеп 24, 2005 2:00 pm Мнения: 787
|
Таман се бях наточил да те питам да дадеш някой пейпал адрес за почерпката ама... пак не ще гадта мръсна!
Копирах точно кода ти, само махнах тригера за пендинг (нали съм на SysTick, то и без друго тъпия компилатор не е чувал за тия двете константи там). Пак гръмва на POP {PC}. В UFSR ми връща INVSTATE флага вдигнат.
Ти как казваш че си го пробвал? На Rowley Crossworks с CM3 ли си? Някакви други инициализации правиш ли отвън?
|
| Вто Мар 22, 2011 9:04 am |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11278 Местоположение: Добрич
|
INVSTATE означава само едно нещо - това, което поп-ваш от стека не е 0xFFFFFFFF9 a четен адрес, т.е. опитваш се да се върнеш в ARM режим (какъвто няма в куртекс).
Кодът който ти дадох (той всъщност е твой код де) няма нужда от никаква инициализация и го пускам от асемблер. Ползвам GCC естествено и СМ3 естествено...
Сега важното е какво става при теб. Най-вероятно нямаш проблем с инициализациите (те са за приоритети и щеше да гърми по друг начин). Вероятно някой ти пъха нещо в стека и поради това адресът ти за връщане се измества. Ти вадиш нещо друго от стека и то гърми (нормално...).
Не знам как се справяш с асемблера, ако можеш тия вектори си ги прехвърли на асемблер, а SysCall където ти е същинската обработка си я остави на С/С++.
Това с naked не е достатъчно, то маха кода за връщане но трябва да изключиш и фреймирането на стека (включено по подразбиране при GCC). Но дори и така не е сигурно, че компилатора няма да ти вкара глупости... Затова най-добре - асемблер, та да ти е мирна главата...
Иначе ето какво трябва да се получи - при влизане в прекъсване, то автоматично спасява R0-R3, R12, LR, PC, PSR... Да наречем това фрейм 1. След това в прекъсването ти вкарваш 2 думи, едната (r4) е глупст и не се ползва, а другата ти адреса за връщане от прекъсване и трябва да е 0xFFFFFFF9, Да наречем това фрейм 2. След това се пушват още 8 думи (фрейм 3), които изглеждат като фрейм 1, само че ще ни върнат на друго място. В края на прекъсването фрейм 3 се извлича...
След това отиваме в SysCall и в тоя момент имаме фрейм1 и 2 в стека. Функцията прави каквото прави и трябва да излезе без да пипа нашите два фрейма. Отиваме на thread_exit. Там се вика svc при това автоматично ти се генерира фрейм, т.е. нови 8 думи в стека.
И сега като влезе в sys_svc_handler в стека трябва да са фрейм 1, 2 и 4. Нас фрейм 4 не ни интересува изобщо, т.е. махаме 8 думи, махаме и още една дума от фрейм 2 (онова r4 дето е талаш за подравняване). Така ако никой не ни е мазал по стека, върхът му трябва да сочи към LR спасен от инструкцията "PUSH {r4,lr}".
Значи като извадим тоя LR (чиято стойност трябва да е 0xFFFFFFF9) във стека трябва да остане само фрейм 1. И тъй като не просто го вадим ами го слагаме в РС то автоматично се прави връщане от прекъсване, като се връщаме там откъдето е дошло първоначално....
При теб очевадно някой е вкарал нещо... Затова като се върнеш 9 думи назад не попадаш на 0xFFFFFFF9. Може и да попадаш, но някой междувременно да е омазал фрейм 1 и там да гърми...
С две думи слагаш си брейкпоинт в прекъсването и преди да излезаш от него гледаш къде сочи SP. Може да разгледаш и самия стек, да видиш как изглеждат фрейм 1 и 2.
Слагаш брейкпоинт в SVC-а там преди фаталния POP.... и гледаш дали SP и стека са ок или не са ок..
|
| Вто Мар 22, 2011 10:07 am |
|
 |
|
kiiid
Ранг: Почетен член
Регистриран на: Съб Сеп 24, 2005 2:00 pm Мнения: 787
|
Абе аз с асемблера на 10-ина процесора си се справям с наслада от много години насам ама нали ти споменах че точно арм-ското безумие едва ли някога ще се хвана да го уча. Значи по принцип и аз стигнах до същия извод при трасирането понеже има разлика от 12 думи в стека между времето когато влезна в систик и оня POP. Обаче нямам идея какво може да ги е сложило там - мой код не е със сигурност а други прекъсвания в момента съм забранил.
Утре ще се помъча да го прекавам всичко през асемблера, тъпотията е че в Rowley не знам как да му предавам константите дето са отвън. А хелпа е... абе по-добре без него. В резултат асемблера не знае нито едно име на регистър. Пълна тъпотия...
Пак ще ти кажа какво съм сътворил...
|
| Вто Мар 22, 2011 12:32 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11278 Местоположение: Добрич
|
Може би компилаторът ги е сложил... Най-вероятно трябва да изключиш фреймирането: GCCFLAGS += -fomit-frame-pointer Ако ползваш Ц++ трябва и ексепшъните да се махнат с -fno-exceptions Но може и друго да е, затова като си правиш такива игрички със стека най-добре асемблер, че да ти е мирна главата....
Според мен за човек, владеещ 10 платформи, е срамота да ползва Rowley... Все едно професионален готвач да се тъпче с полуфабрикати, щото вкъщи му е трудно да си забърка сам мандажата 
|
| Вто Мар 22, 2011 1:15 pm |
|
 |
|
kiiid
Ранг: Почетен член
Регистриран на: Съб Сеп 24, 2005 2:00 pm Мнения: 787
|
Еее... Нали ти казах че се мъча да мина по най-бързия начин към отърване от тоя контролер, дано да е завинаги. То ако имаше начин и интерпретатор на бейсик бих ползвал та да ми се махне от главата колкото може по-лесно 
|
| Вто Мар 22, 2011 1:56 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 10 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|