реклама на сайте
подробности

 
 
> вызов супервизора SVCall в STM32
FFFF
сообщение Aug 31 2018, 10:27
Сообщение #1





Группа: Участник
Сообщений: 9
Регистрация: 26-08-18
Пользователь №: 107 048



В cortex M есть команда вызова системных функций, SVC
при исполнении этой команды процессор переходит в обработчик исключения супервизора.

что должно происходить в обработчике исключения супервизора, вызов системной функции прямо в обработчике?
как то странно это. логичнее на мой взгляд было бы выйти из обработчика передав управление вызываемой функции в привилегированном режиме. незнаю как только реализовать это попроще

как правильно должно это все работать по задумкам разработчиков?

Сообщение отредактировал FFFF - Aug 31 2018, 10:38
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Arlleex
сообщение Sep 2 2018, 08:50
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(FFFF @ Sep 1 2018, 18:21) *
А меня жаба душит транжирить SVC на такое... Вообще не хочу, чтобы FreeRTOS использовала SVC.

а Вы как бы распорядились SVC?

Сам факт того, что это прерывание используется только 1 раз... Ужас.
Даже если оно мне не нужно - у меня внутренний когнитивный диссонанс biggrin.gif

Цитата(jcxz @ Sep 1 2018, 19:27) *
Что-то у Вас мухи с котлетами намешаны wink.gif
Зачем ещё и указатель стека прерываний на начало стека из таблицы прерываний ставить?
Это вобщем-то не относится к данной задаче. Хотя конечно хозяин - барин.

...

Опять мухи с котлетами. Тогда сюда ещё до кучи и инициализацию пинов впендюрить можно. laughing.gif

...

Зачем?

Не мое. Это я сейчас порт на Cortex-M4 открыл и сюда вставил laughing.gif Нужно оно там или не нужно - это другой вопрос, конечно же.

Цитата
Да и вроде - невозможно так записать что-то в CONTROL. Нужно юзать EXC_RETURN.

В привилегированном режиме можно. EXC_RETURN используется при входе в прерывание и выходе из него.

Цитата
Ну вообще-то тут R0-R3,R12,LR,XPSR совершенно лишние.
Вроде как достаточно восстановить R4-R11, занести в LR нужное значение и сделать BX LR (сымитировать возврат из прерывания с переключением на нужный стек и в нужный режим).

В этом и фишка, что я хочу полностью избавиться от SVC, передать управление на первую задачу без использования прерывания. Поэтому я и предложил восстановить весь регистровый стек, потому как мы не в прерывании еще находимся, поэтому R0-R3, R12, LR, XPSR восстановить нужно будет.
Интересно вот, что будет если в привилегированном режиме потока записать EXC_RETURN в LR со значениями (PSP + Thread Mode) и сделать BX LR... Какой-нибудь Usage Fault, скорее всего.

Цитата
В результате режим процессора Вы не переключили и он остался в handler-режиме.
Для переключения нужно юзать BX LR с правильным значением в нём.
И опять же - ISB тут лишняя.

Повторюсь, что режим процессора должен оставаться в Thread. Если бы прерывание было - как в исходном примере, то я не задался бы целью обойти использование SVC sad.gif
ISB лишняя, да... Там весь порт кривущий, но работает. Вычищаю потихоньку, что нужно мне. Вот и решил заморочиться, избавившись от такого не очень, на мой взгляд, разумного использования SVC. Я еще понимаю, если бы оно вызывалось раз в день. Но тут только при старте приложения...

Цитата
PS: Да и, как видно по приведённому Вами коду, FreeRTOS использует не всю SVC, а только SVC 0. Остальные 255 - свободны. Неужто Вам 255 не хватит? Для чего???

Мне-то хватит. Просто хочу свои SVC как можно короче сделать, без лишних телодвижений. А подход, предложенный индусами-портировщиками, мне не очень нравится. Поэтому и гадаю, как красиво сделать wink.gif

Цитата
В uCOS вообще не заморачиваются: они изначально заносят в PSP=0, а потом просто программно возбуждают PendSV (как для любого программного переключения контекста), а в ISR PendSV делают проверку если PSP==0 (начальный старт первой задачи) - просто пропускают сохранение контекста сразу переходя к восстановлению контекста самой приоритетной задачи.
Конечно при этом в переключатель контекста добавляется одна лишняя команда, но имхо - это несущественно.

Воот. Вот это уже другое дело. Я тоже рассматривал такой вариант, но как раз лишние пару инструкций проверки травят душу перфекциониста biggrin.gif
Вот и думаю, что это сделать, скорее всего, можно без прерываний и лишних телодвижений в переключателе контекста (я хотел бы, чтобы он был как можно короче и быстрее). Просто нужно исхитриться и восстановить весь контекст выполнения первой запускаемой задачи.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 2 2018, 10:04
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Arlleex @ Sep 2 2018, 11:50) *
В привилегированном режиме можно. EXC_RETURN используется при входе в прерывание и выходе из него.

А в непривилегированном? В каком режиме (и с какими привилегиями) находится ядро Cortex-M после сброса - мы знаем из мануала, а в каком режиме и с какими привилегиями оно будет находиться после завершения выполнения ROM-boot на любом МК - Вы знаете? rolleyes.gif
А в каком режиме будет находиться CPU после смены регистра SP через запись в CONTROL - Handler или Thread? Также изменит режим согласно SP или нет?
И по Вашему коду неясно - в каком изначальном режиме и с какими привилегиями ядро находится перед выполнением этого кода, поэтому я и написал что в общем случае - это не будет работать.
В то же время мануал на ядро говорит:
Handler mode always uses the MSP, so the processor ignores explicit writes to the active stack
pointer bit of the CONTROL register when in Handler mode. The exception entry and return
mechanisms automatically update the CONTROL register based on the EXC_RETURN value

Из чего я заключаю, что самый надёжный способ установки SP и режима CPU - через EXC_RETURN. Кстати - uCOS нигде не пишет в биты 0,1 CONTROL напрямую - везде только через EXC_RETURN. А она написана грамотно и для многих МК.

Цитата(Arlleex @ Sep 2 2018, 11:50) *
В этом и фишка, что я хочу полностью избавиться от SVC, передать управление на первую задачу без использования прерывания. Поэтому я и предложил восстановить весь регистровый стек, потому как мы не в прерывании еще находимся, поэтому R0-R3, R12, LR, XPSR восстановить нужно будет.

а я Вам предлагал войти в любое прерывание и сделать выход оттуда с помощью нужного значения EXC_RETURN. Неужто у Вас нет ни одного свободного вектора прерывания? Не обязательно SVC. К тому же весь - Вы его всё равно не восстановите, регистры нужны для работы, и к тому же формат хранения контекста задачи удобно сделать совместимым с аппаратным порядком сохранения регистров по прерыванию.

Цитата(Arlleex @ Sep 2 2018, 11:50) *
Интересно вот, что будет если в привилегированном режиме потока записать EXC_RETURN в LR со значениями (PSP + Thread Mode) и сделать BX LR... Какой-нибудь Usage Fault, скорее всего.

Может и так, а может и сработает. Пробовать нужно.

Цитата(Arlleex @ Sep 2 2018, 11:50) *
Мне-то хватит. Просто хочу свои SVC как можно короче сделать, без лишних телодвижений.

Так можно любой другой вектор использовать. Их обычно полно неиспользуемых в МК.

Цитата(Arlleex @ Sep 2 2018, 11:50) *
но как раз лишние пару инструкций проверки травят душу перфекциониста biggrin.gif

Я же писал - не пара, а только одна лишняя.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- FFFF   вызов супервизора SVCall в STM32   Aug 31 2018, 10:27
- - AlexandrY   Цитата(FFFF @ Aug 31 2018, 13:27) как пра...   Aug 31 2018, 11:27
- - x893   Как это сделано в любой RTOS.   Aug 31 2018, 11:44
|- - AlexandrY   Цитата(x893 @ Aug 31 2018, 14:44) Как это...   Aug 31 2018, 12:13
- - FFFF   спасибо. и как это сделано в любой rtos? системная...   Aug 31 2018, 11:51
- - x893   Там в основном ассемблер. Для изучения сильно помо...   Aug 31 2018, 11:54
- - jcxz   Цитата(FFFF @ Aug 31 2018, 13:27) что дол...   Aug 31 2018, 12:17
|- - Arlleex   Цитата(jcxz @ Aug 31 2018, 15:17) Видимо ...   Sep 1 2018, 13:44
- - Arlleex   Открыл вот порт FreeRTOS на Cortex-M4. В этой RTOS...   Sep 1 2018, 14:48
|- - jcxz   Цитата(Arlleex @ Sep 1 2018, 17:48) ldr r...   Sep 1 2018, 16:27
- - FFFF   А меня жаба душит транжирить SVC на такое... Вообщ...   Sep 1 2018, 15:21
- - FFFF   если передавать номер функции в регистре перед выз...   Sep 2 2018, 06:03
|- - AlexandrY   Цитата(FFFF @ Sep 2 2018, 09:03) если пер...   Sep 2 2018, 06:38
- - FFFF   собственно я сам до этого дошел, думаю это лежит н...   Sep 2 2018, 06:49
|- - jcxz   Цитата(Arlleex @ Sep 2 2018, 11:50) Воот....   Sep 2 2018, 21:19
|- - Arlleex   Цитата(jcxz @ Sep 3 2018, 00:19) Вобщем -...   Sep 3 2018, 04:57
- - Arlleex   В общем, выделил часок на свои изыскания и, опреде...   Sep 3 2018, 08:05
- - AlexandrY   Цитата(Arlleex @ Sep 3 2018, 11:05) [/lis...   Sep 3 2018, 08:10
|- - Arlleex   Цитата(AlexandrY @ Sep 3 2018, 12:10) Тяж...   Sep 3 2018, 09:46
- - jcxz   Цитата(Arlleex @ Sep 3 2018, 11:05) [*]Ка...   Sep 3 2018, 10:01
- - Arlleex   Цитата(jcxz @ Sep 3 2018, 14:01) Зачем? П...   Sep 3 2018, 11:08
- - jcxz   RE: вызов супервизора SVCall в STM32   Sep 3 2018, 11:44
- - Arlleex   ЦитатаА как она туда (в стек) попадёт с 0 в мл.бит...   Sep 3 2018, 12:00
- - jcxz   Цитата(Arlleex @ Sep 3 2018, 15:00) А вот...   Sep 3 2018, 12:26
- - Arlleex   Цитата(jcxz @ Sep 3 2018, 16:26) Проверил...   Sep 3 2018, 13:02
- - jcxz   Цитата(Arlleex @ Sep 3 2018, 16:02) Сейча...   Sep 3 2018, 13:26


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 02:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016