Отговори на тема  [ 25 мнения ]  Отиди на страница Предишна  1, 2
Заменям финансова срещу програмна помощ (ARM Cortex CM3) 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Сеп 24, 2005 2:00 pm
Мнения: 787
Мнение 
Ами да ти кажа не съм сетвал тика на най-нисък приоритет в main(). Ще го пробвам в понеделник. А иначе той компилатора сам си слага единицата, това съм го проверил вече


Съб Мар 19, 2011 12:52 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11278
Местоположение: Добрич
Мнение 
Ако слага единица може ти да не се сдържиш и да ме напсуваш ;-)


Съб Мар 19, 2011 3:25 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Сеп 24, 2005 2:00 pm
Мнения: 787
Мнение 
Абе аз в псуване по тебе няма да се юркам (целия ми репертоар там е запазен за създателите на кортекс) ама пак не става работата. Сложих най-ниския приоритет на систик, сетнах флага нонсис-незнам-си-какво и пак ми гърми по същия начин :cry:


Пон Мар 21, 2011 4:12 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11278
Местоположение: Добрич
Мнение 
ех... не става :-)
Пробвал съм го преди да ти пиша....

Ето ти кода дето тествай


Ресет вектор:

Код:
            // Trigger Pending interrupt
                ldr         r0, = NVIC_INT_CTRL
                movs      r1, #NVIC_INT_CTRL_PEND_SV
                str         r1, [r0]
                // continue with the reset initialization
                nop



Е случая за по-лесно ползвам pending вместо systick но това няма значение... (все прекъсване)

Самото прекъсване:

Код:
            PUSH {r4,lr}
            LDR r0,=thread_exit+1
            LDR r1,=SysCall+1
            LDR r2,=0x01000000
            PUSH {r0-r2}
            SUB sp,sp,#(5*4)
            LDR r0,=0xFFFFFFF9
            BX r0



Функция за същинската обработка (може да е написана на С ):

Код:
SysCall:
            adds    r0, #0
            bx      lr


Като излезе от SysCall идва тук:

Код:
thread_exit:
            svc      0



И сървиса:
sys_svc_handler:
Код:
               ADD       sp,sp,#(9*4)
            POP       {pc}


Това нещо ще върви на кой да е куртекс - като тръгне от ресет влиза в пендинг, после обработка, после thread_exit, svc 0 и се връща и продължава в ресет...

Ако нещо не работи при теб поне виж какво. В систем контрола (SCB) има един регистър CFSR (current fault status register) виж какво ти дава като причина за фаулт-а


Пон Мар 21, 2011 10:26 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Сеп 24, 2005 2:00 pm
Мнения: 787
Мнение 
Утре ще го пробвам и ще ти кажа резултата!


Пон Мар 21, 2011 11:37 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Сеп 24, 2005 2:00 pm
Мнения: 787
Мнение 
Таман се бях наточил да те питам да дадеш някой пейпал адрес за почерпката ама... пак не ще гадта мръсна! :evil:
Копирах точно кода ти, само махнах тригера за пендинг (нали съм на SysTick, то и без друго тъпия компилатор не е чувал за тия двете константи там). Пак гръмва на POP {PC}. В UFSR ми връща INVSTATE флага вдигнат.
Ти как казваш че си го пробвал? На Rowley Crossworks с CM3 ли си? Някакви други инициализации правиш ли отвън?


Вто Мар 22, 2011 9:04 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

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

Регистриран на: Съб Сеп 24, 2005 2:00 pm
Мнения: 787
Мнение 
Абе аз с асемблера на 10-ина процесора си се справям с наслада от много години насам ама нали ти споменах че точно арм-ското безумие едва ли някога ще се хвана да го уча. Значи по принцип и аз стигнах до същия извод при трасирането понеже има разлика от 12 думи в стека между времето когато влезна в систик и оня POP. Обаче нямам идея какво може да ги е сложило там - мой код не е със сигурност а други прекъсвания в момента съм забранил.
Утре ще се помъча да го прекавам всичко през асемблера, тъпотията е че в Rowley не знам как да му предавам константите дето са отвън. А хелпа е... абе по-добре без него. В резултат асемблера не знае нито едно име на регистър. Пълна тъпотия...
Пак ще ти кажа какво съм сътворил...


Вто Мар 22, 2011 12:32 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11278
Местоположение: Добрич
Мнение 
kiiid написа:
Обаче нямам идея какво може да ги е сложило там


Може би компилаторът ги е сложил... Най-вероятно трябва да изключиш фреймирането:

GCCFLAGS += -fomit-frame-pointer

Ако ползваш Ц++ трябва и ексепшъните да се махнат с -fno-exceptions

Но може и друго да е, затова като си правиш такива игрички със стека най-добре асемблер, че да ти е мирна главата....

Цитат:
тъпотията е че в Rowley не знам как да му предавам константите дето са отвън


Според мен за човек, владеещ 10 платформи, е срамота да ползва Rowley... Все едно професионален готвач да се тъпче с полуфабрикати, щото вкъщи му е трудно да си забърка сам мандажата ;-)


Вто Мар 22, 2011 1:15 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Сеп 24, 2005 2:00 pm
Мнения: 787
Мнение 
miro_atc написа:
Според мен за човек, владеещ 10 платформи, е срамота да ползва Rowley... Все едно професионален готвач да се тъпче с полуфабрикати, щото вкъщи му е трудно да си забърка сам мандажата ;-)


Еее... Нали ти казах че се мъча да мина по най-бързия начин към отърване от тоя контролер, дано да е завинаги. То ако имаше начин и интерпретатор на бейсик бих ползвал та да ми се махне от главата колкото може по-лесно :)


Вто Мар 22, 2011 1:56 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 25 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

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


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

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