| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| cortex m MPU http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=18191 |
Страница 1 от 1 |
| Автор: | CALL-151 [ Вто Яну 25, 2022 4:51 pm ] |
| Заглавие: | cortex m MPU |
Здравейте, Как да превключа cortex m3 в unprivileged mode когато използвам MPU? Дефинирам две адресни пространства: едното за да го кажем системно и едно за приложение. Приложението няма достъп до системното адресно пространство. Това го нагласям с MPU. В някъкъв момент управлението се предава на приложението. Как първоначално да превключа в unprivileged mode. Ако просто запиша 3 в control регистъра то процесора ще се окаже в unprivileged mode докато изпълнява код от системеното адресно пространство и става exception. Реално ако запиша 3 в control регистъра и веднага направя jump към приложението, работи защото инструкциите вече са в опашката от инструкции и не се чете от паметта и MPU не го хваща. Но не ми харесва така. Ако пък дойде прекъсване в този момент ще стане боза... Става и като запиша 3 инструкции в стека на приложението и ги изпълня. Тези инструкции превключват режима докъто се изпълнява код от адресното пространство на приложението. В този случай обаче трябва да разреша стека на приложението за изпълнение на код от него което не ми харесва. Никъде в интернет няма ясен отговор на въпроса. Ако някой ме разбра какво питам и знае нещо ще съм благодарен да сподели |
|
| Автор: | miro_atc [ Вто Яну 25, 2022 6:52 pm ] |
| Заглавие: | Re: cortex m MPU |
Аз така и не стигнах до MPU-тата, ама не мисля че това има значение. Значи правилният начин за смяна на контексти е през така наречените ексепшъни. Биле те софтуерни (svc/swi) или хардуерни. На пръв поглед нещата стават през стека. Хардуерно се спасяват някои регистри в текущия стек (който и да е той). При влизането във вектора ти се сменя на привилигирован режим и т.н. Линк регистъра ти обаче не е адрес за връщане, а специална стойност от рода на FFFF-нещо си. Всичко това го има описано на много места. Това, което не е описано много добре е, че ядрото си има нещо като вътрешен стек и си пази текущото ниво и колко нива си влязал. Демек като стане ексепшън и докато той се обработва стане друг ексепшън или фолт то си ги брои. Като тръгнеш да излизаш трябва да излезеш по обратния път. Нормално то си е така, но ако софтурно решиш да подменяш нещо по стековете трябва да симулираш толкова излизания с LR=FFFFFxx, колкото пъти си влизал. Демек не може да го излъжеш с броя нивата на вложеност. Ако се пробваш ще получиш хард фолт. Но може да го лъжеш къде да се върне. Подменяйки стека или съдържанието на стека може да си дошъл от едно място, а да се върнеш на друго. Стига да се върнеш на същото ниво от което си дошъл. Така се сменят контексти във всеки ОС. Другото, което е важно е, че ядрото тръгва с ресет ексепшън. Демек мисли, че е в ексепшън и може да "излезеш" от него. Но в стековете в паметта няма нищо и ако се пробваш ще гръмне. Естествено трябва да си попълниш нещо валидно в стека, преди да излезеш. Както се опитах да обясня по-горе, ядрото си знае че "излизаш" и знае, че трябва да се върне в по-ниско ниво. При излизане приоритета може само да пада и трябва да пада, иначе както казах хард фолт. При влизане може да се качва, иначе пак само хард фолт. С други думи в ресета си нагласяш MPU-то и каквото решиш, подготвяш си някакъв стек все едно уж че си дошъл отнякъде от тред мод. Слагаш в LR вълшебната стойност и просто си излизаш |
|
| Автор: | CALL-151 [ Сря Яну 26, 2022 4:42 pm ] |
| Заглавие: | Re: cortex m MPU |
мерси за отговора! Бях пробвал с exception но имаше странни последствия после при работа в някои случаи... Сега го направих пак с exception (ползвам pending exception) и сега работи. Проблема беше подравняването на стека на 8 при exception! не съм очаквал там да има още 4 байта понякога. Чел съм стара докоументация на cortex m3 r1! Там пише че по подразбиране подравняването на стека на 8 при exception е излкюченно. Обаче тези от АРМ в ревизия на ядртото R2 са го сложили включено! |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|