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

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


Гуру
******

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



Цитата(Arlleex @ Sep 3 2018, 11:05) *
[*]Как видно в конце ассемблерного кода, я подменяю в памяти адрес задачи на тот же, только с установленным 0-м битом.

Зачем?

Цитата(Arlleex @ Sep 3 2018, 11:05) *
[*]Поставил DSB в местах, где меняется SP, а также после записи в CONTROL (как рекомендует ARM). Хотелось бы выслушать мнение насчет расстановки DSB, желательно аргументированно rolleyes.gif ISB убрал полностью, ибо не вижу в них смысла здесь.

Зачем DSB после записи в SP? А в программе в куче мест где делается PUSH ... или ADD/SUB SP, ... тоже будете DSB расставлять? biggrin.gif
DSB задерживает выполнение последующих после неё команд пока не завершатся все текущие/отложенные доступы к памяти как я понимаю.
Зачем её ставить после пересылки в SP если эта загрузка никак к памяти не обращается?
Хотя она конечно не помешает, но сэкономив на пуговицах Вы добавили кучу лишних команд, перфекционист должен негодовать biggrin.gif

После модификации CONTROL DSB тоже лишняя. Я вижу - Вы не запрещаете прерывания на время всех манипуляций. Подумайте что будет если между модификацией CONTROL и DSB произойдёт прерывание? Это показывает - что DSB неэффективна тут.
Да и вообще - такие манипуляции с CONTROL я бы не рисковал делать при разрешённых прерываниях. В uCOS-II например не только никак не обращаются к CONTROL, но и все манипуляции с переключениями стеков и пр. делают при запрещённых прерываниях.

Цитата(Arlleex @ Sep 3 2018, 11:05) *
[*]Подразумевается, что в системе нет загрузчика, или загрузчик, после выполнения своего кода и перехода на пользовательское приложение, привел все регистры в состояние после сброса, а также режим работы CPU и активный SP.

А если это загрузчик в ROM и его никак не изменить?

PS: Когда на на ARM9 в CCS сталкивался с тем, что штатный стартап-код (цепляемый штатным CCS) переводил CPU в непривилегированный режим. И все операции с привилегированными ресурсами вызывали fault-ы. Писателями этого стартапа подразумевалось видимо, что работать с такими ресурсами следует только из обработчика SVC. Пришлось найти исходники стартапа и исправить их мнение - только так. rolleyes.gif
Боюсь представить если также будут думать разработчики ROM-бута в каком-то МК.

PPS: Кстати - не вижу в Вашем коде никаких манипуляций с FPU, хотя вроде писали что он для Cortex-M4.
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
- - 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
- - 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 - 04:49
Рейтинг@Mail.ru


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