|
вызов супервизора 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.
|
|
|
|
|
Sep 3 2018, 11:08
|

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

|
Цитата(jcxz @ Sep 3 2018, 14:01)  Зачем? При явной работе с PC адрес инструкции, записываемой в этот регистр, должен быть с установленным 0-м битом, указывающим на Thumb-режим. Цитата Зачем её ставить после пересылки в SP если эта загрузка никак к памяти не обращается? Хотя она конечно не помешает, но сэкономив на пуговицах Вы добавили кучу лишних команд, перфекционист должен негодовать  Тут мне следует почитать специальный pdf-документ на эту тему, т.к. не до конца понимаю когда их ставить. В общем-то, действительно, тут вообще они не нужны. Я посчитал, что после смены активного указателя стека может что-то измениться в плохую сторону без барьерных инструкций, это не есть гуд. Перфекционист негодует Кстати, тут прямо пишут Цитата Note When changing the stack pointer, software must use an ISB instruction immediately after the MSR instruction. This ensures that instructions after the ISB instruction execute using the new stack pointer. See ISB Так что ISB надо вставлять. Выглядит даже логично - действительно конвейер надо сбросить, т.к. SP может наадресовать чего-нибудь не того в конвейверной обработке... Цитата А если это загрузчик в ROM и его никак не изменить? ... Боюсь представить если также будут думать разработчики ROM-бута в каком-то МК. Будет очень плохо, конечно же  По-хорошему, такого быть не должно... Цитата PPS: Кстати - не вижу в Вашем коде никаких манипуляций с FPU, хотя вроде писали что он для Cortex-M4. А вот с этим я еще пока разбираюсь. Есть регистр FPCCR, в нем биты ASPEN и LSPEN. А есть еще CONTROL с его FPCA. Причем все они взаимосвязаны и надо переварить, как именно. В примере от индусов (старый порт RTOS) в бит FPCA CONTROL пишется 0 и вызывается SVC. При этом предварительно биты ASPEN, LSPEN в FPCCR установлены в 1, а FPU-сопроцессор, естественно, включен.
|
|
|
|
Сообщений в этой теме
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   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
|
|
|