|
вызов супервизора SVCall в STM32 |
|
|
|
Aug 31 2018, 10:27
|
Группа: Участник
Сообщений: 9
Регистрация: 26-08-18
Пользователь №: 107 048

|
В cortex M есть команда вызова системных функций, SVC при исполнении этой команды процессор переходит в обработчик исключения супервизора.
что должно происходить в обработчике исключения супервизора, вызов системной функции прямо в обработчике? как то странно это. логичнее на мой взгляд было бы выйти из обработчика передав управление вызываемой функции в привилегированном режиме. незнаю как только реализовать это попроще
как правильно должно это все работать по задумкам разработчиков?
Сообщение отредактировал FFFF - Aug 31 2018, 10:38
|
|
|
|
|
 |
Ответов
|
Sep 3 2018, 08:05
|

Местный
  
Группа: Участник
Сообщений: 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, которую индусы задействовали для запуска первой задачи. Для этого: - Удалил обработчик SVC.
- Скорректировал функцию запуска первой задачи следующим образом:
Код __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} } Примечания: - Как видно в конце ассемблерного кода, я подменяю в памяти адрес задачи на тот же, только с установленным 0-м битом. И он останется там, в то время, как адреса других задач будут иметь 0 в этом бите. Можно и тут заморочиться и исправить, но я пока не стал. Большой проблемы это не доставит, т.к. этот адрес является адресом начала задачи, а при переключении контекста там будет уже другой адрес (чуть ниже точки входа в задачу).
- Поставил DSB в местах, где меняется SP, а также после записи в CONTROL (как рекомендует ARM). Хотелось бы выслушать мнение насчет расстановки DSB, желательно аргументированно
ISB убрал полностью, ибо не вижу в них смысла здесь.
- Подразумевается, что в системе нет загрузчика, или загрузчик, после выполнения своего кода и перехода на пользовательское приложение, привел все регистры в состояние после сброса, а также режим работы CPU и активный SP.
В общем-то проверил - работает, и я рад, что оно получилось
|
|
|
|
|
Sep 3 2018, 10:01
|
Гуру
     
Группа: Свой
Сообщений: 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, желательно аргументированно  ISB убрал полностью, ибо не вижу в них смысла здесь. Зачем DSB после записи в SP? А в программе в куче мест где делается PUSH ... или ADD/SUB SP, ... тоже будете DSB расставлять? DSB задерживает выполнение последующих после неё команд пока не завершатся все текущие/отложенные доступы к памяти как я понимаю. Зачем её ставить после пересылки в SP если эта загрузка никак к памяти не обращается? Хотя она конечно не помешает, но сэкономив на пуговицах Вы добавили кучу лишних команд, перфекционист должен негодовать После модификации 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. Пришлось найти исходники стартапа и исправить их мнение - только так. Боюсь представить если также будут думать разработчики ROM-бута в каком-то МК. PPS: Кстати - не вижу в Вашем коде никаких манипуляций с FPU, хотя вроде писали что он для Cortex-M4.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|