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

 
 
> вызов супервизора 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 3 2018, 08:05
Сообщение #2


Местный
***

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



В общем, выделил часок на свои изыскания и, определенно, пришел к некоторому успеху.
Повторюсь, что я хотел сделать.
Имеется FreeRTOS v10.0.0, компилятор ARMCCv5 Keil.
В системе есть 2 задачи:
CODE
xTaskHandle Task1Handle;
xTaskHandle Task2Handle;

void Task1(void *Parameters)
{
while(1)
{
HW_LED_TOGGLE(GPIO_LED1);

vTaskDelay(1000);
}
}

void Task2(void *Parameters)
{
while(1)
{
HW_LED_TOGGLE(GPIO_LED2);

vTaskDelay(500);
}
}

int main(void)
{
HW_MCUInit();

xTaskCreate(&Task1, "Task1", 128, NULL, 1, &Task1Handle);
xTaskCreate(&Task2, "Task2", 128, NULL, 1, &Task2Handle);

vTaskStartScheduler();

return 0;
}

Моя цель была в том, чтобы избавиться от единожды используемого прерывания SVC, которую индусы задействовали для запуска первой задачи. Для этого:
  1. Удалил обработчик SVC.
  2. Скорректировал функцию запуска первой задачи следующим образом:
Код
__asm void prvStartFirstTask(void)
{
    PRESERVE8
    
    // установка MSP
    ldr r0, =0xE000ED08
    ldr r0, [r0]
    ldr r0, [r0]
    msr msp, r0
    
    dsb
    
    // получение указателя на стековый фрейм задачи
    ldr r3, =pxCurrentTCB
    ldr r1, [r3]
    ldr r0, [r1]
    
    // последовательная загрузка контекста
    ldmia r0!, {r4-r11, r14} // загрузка R4-R11, LR (LR здесь уже, по сути, является аттавизмом)
    msr psp, r0              // установка PSP
    
    dsb
    
    // перевод CPU на использование стека PSP
    mov r0, #2
    msr control, r0
    
    dsb
    
    // извлечение XPSR из стекового фрейма
    mrs r1, psp
    add r1, r1, #28
    ldr r0, [r1]
    msr xpsr, r0
    
    // извлечение оставшихся регистров
    pop {r0-r3, r12, r14}
    
    // корректировка бита 0 регистра PC
    push {r0, r1}
    
    mrs r0, psp
    add r0, r0, #8
    ldr r1, [r0]
    orr r1, r1, #1
    str r1, [r0]
    
    pop {r0, r1}
    
    // переход на активную задачу
    pop {r15}
}

Примечания:
  1. Как видно в конце ассемблерного кода, я подменяю в памяти адрес задачи на тот же, только с установленным 0-м битом. И он останется там, в то время, как адреса других задач будут иметь 0 в этом бите. Можно и тут заморочиться и исправить, но я пока не стал. Большой проблемы это не доставит, т.к. этот адрес является адресом начала задачи, а при переключении контекста там будет уже другой адрес (чуть ниже точки входа в задачу).
  2. Поставил DSB в местах, где меняется SP, а также после записи в CONTROL (как рекомендует ARM). Хотелось бы выслушать мнение насчет расстановки DSB, желательно аргументированно rolleyes.gif ISB убрал полностью, ибо не вижу в них смысла здесь.
  3. Подразумевается, что в системе нет загрузчика, или загрузчик, после выполнения своего кода и перехода на пользовательское приложение, привел все регистры в состояние после сброса, а также режим работы CPU и активный SP.
В общем-то проверил - работает, и я рад, что оно получилось 08.gif
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Sep 3 2018, 08:10
Сообщение #3


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Arlleex @ Sep 3 2018, 11:05) *
[/list]В общем-то проверил - работает, и я рад, что оно получилось 08.gif

Тяжело же вам придется скоро.
Все переходят на Arm PSA
А там каждый чих через SVC.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Sep 3 2018, 09:46
Сообщение #4


Местный
***

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



Цитата(AlexandrY @ Sep 3 2018, 12:10) *
Тяжело же вам придется скоро.
Все переходят на Arm PSA
А там каждый чих через SVC.

Там, где это действительно нужно, пусть остается. Там, где это как собаке пятая нога - я чищу smile3046.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
- - Arlleex   Цитата(FFFF @ Sep 1 2018, 18:21) А меня ж...   Sep 2 2018, 08:50
|- - jcxz   Цитата(Arlleex @ Sep 2 2018, 11:50) В при...   Sep 2 2018, 10:04
|- - jcxz   Цитата(Arlleex @ Sep 2 2018, 11:50) Воот....   Sep 2 2018, 21:19
|- - Arlleex   Цитата(jcxz @ Sep 3 2018, 00:19) Вобщем -...   Sep 3 2018, 04:57
- - 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 Текстовая версия Сейчас: 21st July 2025 - 16:51
Рейтинг@Mail.ru


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