Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как урезать exception stacking для Cortex-M4F
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
jcxz
Подскажите: где в M4F устанавливается размер сохраняемого контекста при exception stacking-е?
У M3 и M4 (без F) он фиксированный и равен 8 словам. Но для M4F он опционально (вроде как опционально?) может включать регистры FPU (дополнительно 18 слов).
У меня сейчас в стэкинг пишутся регистры FPU. Мне это не нужно (FPU в ISR не нужен, а для задач ОС есть своё сохранение регистров FPU при переключении задачи).
Что-то навскидку не могу найти по мануалу - где конфигурится размер стэкинга. Ткните носом плиз!
AHTOXA
Lazy stacking feature.
jcxz
Спасибо! До регистра Floating-Point Context Control я не дошёл wink.gif
Хм... похоже мне нужно: LSPEN=0; ASPEN=0.
jcxz
Не помогло.... sad.gif
Похоже эти биты отвечают только именно за Lazy stacking. Место под регистры всё равно выделяется и SP смещается на 8+18 слов (вместо 8) и EXC_RETURN==0xE9.
Мне нужно не только чтобы регистры FPU не сохранялись при стэкинге, но и место под них не резервировалось. Вобщем чтобы 4-й бит EXC_RETURN был ==1.

scifi
Цитата(jcxz @ Apr 24 2015, 08:25) *
Хм... похоже мне нужно: LSPEN=0; ASPEN=0.

Ну как же? Написано же, что надо LSPEN=1; ASPEN=1.

Цитата(jcxz @ Apr 24 2015, 09:40) *
Место под регистры всё равно выделяется и SP смещается на 8+18 слов (вместо 8) и EXC_RETURN==0xE9.

Там же написано, что так оно и работает. Место в стеке выделяется, но не используется.
У вас, похоже, с чтением какие-то проблемы.

Цитата(jcxz @ Apr 24 2015, 09:40) *
Мне нужно не только чтобы регистры FPU не сохранялись при стэкинге, но и место под них не резервировалось. Вобщем чтобы 4-й бит EXC_RETURN был ==1.

Не судьба.
jcxz
Цитата(scifi @ Apr 24 2015, 12:47) *
Там же написано, что так оно и работает. Место в стеке выделяется, но не используется.
У вас, похоже, с чтением какие-то проблемы.

Может и проблемы, но так я понял написанное в мануале на Tiva TM4C129DNCPDT (стр.127):
Код
When using floating-point routines, the Cortex-M4F processor automatically stacks the architected
floating-point state on exception entry. Figure 2-7 on page 128 shows the Cortex-M4F stack frame
layout when floating-point state is preserved on the stack as the result of an interrupt or an exception.
Note:    Where stack space for floating-point state is not allocated, the stack frame is the same as
that of ARMv7-M implementations without an FPU. Figure 2-7 on page 128 shows this stack
frame also.

А на Figure 2-7 приведены два стековых фрейма: один - с сохранением FPU, 2-й - без (и без выделения места под регистры FPU).
Т.е. - как я понимаю - где-то должна быть возможность не выделять место под регистры FPU.

И везде указано, что 4й бит EXC_RETURN может быть равен 1. Но у меня он всегда упорно ==0. Даже если FPU выключаю (через Coprocessor Access Control).
scifi
Вот тут написано:
Цитата
The stack frame type being used is determined by hardware automatically based on settings in the FPCCR and whether the FPU has already been used in the current context, as indicated by FPCA bit in the CONTROL special register. If the FPCA is set and the automatic state saving feature has been enabled, the exception stack frame with floating-point storage is then used.
Golikov A.
что-то из этой фразы не очевидно что место под регистры будет всегда выделено...
scifi
Цитата(Golikov A. @ Apr 24 2015, 10:35) *
что-то из этой фразы не очевидно что место под регистры будет всегда выделено...

Ну да, был не прав. Там написано, что в зависимости от состояния 3-х битов в 2-х регистрах может быть выделено, а может и нет.
jcxz
Везде в мануале так пишут, что как будто место под FPU-регистры может выделяться, а может и нет. Но как это переключить - не понятно.
В порту uCOS для M4F тоже кстати при описании фрейма стека при переключении задач так описывают, как будто можно не выделять место под FPU.
Ниже выдержка из описания стековых фреймов задач в uCOS. Как раз верхние 8 слов соответствуют стэкингу в M3 (картинки a и cool.gif.
Порт использует сохранённые стэкингом значения регистров не перемещая их, а просто программно дописывает R4-R11. Видно на картинке (a).
На картинке ( b ) для M4F то же самое как будто, а снизу после дописываются программно регистры FPU S0-S31, FPSCR (в коде этот кусок есть - так и есть).
CODE
* (3) There are two different stack frames depending on whether the Floating-Point(FP)
* co-processor is enabled or not.
*
* (a) The stack frame shown in the diagram is used when the FP co-processor is not present and
* OS_TASK_OPT_SAVE_FP is disabled. In this case, the FP registers and FP Status Control
* register are not saved in the stack frame.
*
* ( b ) If the FP co-processor is present but the OS_TASK_OPT_SAVE_FP is not set, then the stack
* frame is saved as shown in diagram (a). Moreover, if OS_TASK_OPT_SAVE_FP is set, then the
* FP registers and FP Status Control register are saved in the stack frame.
*
* (1) When enabling the FP co-processor, make sure to clear bits ASPEN and LSPEN in the
* Floating-Point Context Control Register (FPCCR).
*
* +------------+ +------------+
* | | | |
* +------------+ +------------+
* | xPSR | | xPSR |
* +------------+ +------------+
* |Return Addr | |Return Addr |
* +------------+ +------------+
* | LR(R14) | | LR(R14) |
* +------------+ +------------+
* | R12 | | R12 |
* +------------+ +------------+
* | R3 | | R3 |
* +------------+ +------------+
* | R2 | | R0 |
* +------------+ +------------+
* | R1 | | R1 |
* +------------+ +------------+
* | R0 | | R0 |
* +------------+ +------------+
* | R11 | | R11 |
* +------------+ +------------+
* | R10 | | R10 |
* +------------+ +------------+
* | R9 | | R9 |
* +------------+ +------------+
* | R8 | | R8 |
* +------------+ +------------+
* | R7 | | R7 |
* +------------+ +------------+
* | R6 | | R6 |
* +------------+ +------------+
* | R5 | | R5 |
* +------------+ +------------+
* | R4 | | R4 |
* +------------+ +------------+
* (a) | FPSCR |
* +------------+
* | S31 |
* +------------+
* .
* .
* .
* +------------+
* | S1 |
+------------+
* | S0 |
* +------------+
* ( b )

scifi
Цитата(jcxz @ Apr 24 2015, 10:58) *
Везде в мануале так пишут, что как будто место под FPU-регистры может выделяться, а может и нет. Но как это переключить - не понятно.

Чего там непонятного? Вы мануал пробовали читать? Я даже ссылку давал.
jcxz
Цитата(scifi @ Apr 24 2015, 14:01) *
Чего там непонятного? Вы мануал пробовали читать? Я даже ссылку давал.

Непонятно как включить или отключить выделение места под регистры FPU при стэкинге.
Если Вы так хорошо умеете читать мануал, то скажите как мне получить состояние 4-го бита EXC_RETURN равное ==1 ???
Вы мануале вроде как указано, что он может принимать разные значения.
scifi
Цитата(jcxz @ Apr 24 2015, 11:05) *
Непонятно как включить или отключить выделение места под регистры FPU при стэкинге.

Сбросить бит FPCA в регистре CONTROL.
jcxz
Цитата(scifi @ Apr 24 2015, 14:12) *
Сбросить бит FPCA в регистре CONTROL.

Всё я это уже сам нашёл только что wink.gif
Именно это мне и нужно было.
Запутался немного с двумя разными FPCA: регистром FPCA (Floating-Point Context Address) и битом FPCA в регистре CONTROL.
И ещё меня запутал отладчик: почему-то отладчик (IAR+JLink) бит CONTROL.FPCA всегда показывает как ==0. И только после того как я явно сделал MRS R2, CONTROL, то увидел его истинное значение (==1). wacko.gif

Всем участникам - спасибо! sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.