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

 
 
 
Reply to this topicStart new topic
> Как урезать exception stacking для Cortex-M4F
jcxz
сообщение Apr 24 2015, 04:31
Сообщение #1


Гуру
******

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



Подскажите: где в M4F устанавливается размер сохраняемого контекста при exception stacking-е?
У M3 и M4 (без F) он фиксированный и равен 8 словам. Но для M4F он опционально (вроде как опционально?) может включать регистры FPU (дополнительно 18 слов).
У меня сейчас в стэкинг пишутся регистры FPU. Мне это не нужно (FPU в ISR не нужен, а для задач ОС есть своё сохранение регистров FPU при переключении задачи).
Что-то навскидку не могу найти по мануалу - где конфигурится размер стэкинга. Ткните носом плиз!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 24 2015, 04:55
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Lazy stacking feature.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 24 2015, 05:25
Сообщение #3


Гуру
******

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



Спасибо! До регистра Floating-Point Context Control я не дошёл wink.gif
Хм... похоже мне нужно: LSPEN=0; ASPEN=0.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 24 2015, 06:40
Сообщение #4


Гуру
******

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



Не помогло.... sad.gif
Похоже эти биты отвечают только именно за Lazy stacking. Место под регистры всё равно выделяется и SP смещается на 8+18 слов (вместо 8) и EXC_RETURN==0xE9.
Мне нужно не только чтобы регистры FPU не сохранялись при стэкинге, но и место под них не резервировалось. Вобщем чтобы 4-й бит EXC_RETURN был ==1.

Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2015, 06:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(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.

Не судьба.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 24 2015, 07:05
Сообщение #6


Гуру
******

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



Цитата(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).
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2015, 07:28
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вот тут написано:
Цитата
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.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Apr 24 2015, 07:35
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



что-то из этой фразы не очевидно что место под регистры будет всегда выделено...
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2015, 07:40
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Golikov A. @ Apr 24 2015, 10:35) *
что-то из этой фразы не очевидно что место под регистры будет всегда выделено...

Ну да, был не прав. Там написано, что в зависимости от состояния 3-х битов в 2-х регистрах может быть выделено, а может и нет.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 24 2015, 07:58
Сообщение #10


Гуру
******

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



Везде в мануале так пишут, что как будто место под 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 )

Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2015, 08:01
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Чего там непонятного? Вы мануал пробовали читать? Я даже ссылку давал.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 24 2015, 08:05
Сообщение #12


Гуру
******

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



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

Непонятно как включить или отключить выделение места под регистры FPU при стэкинге.
Если Вы так хорошо умеете читать мануал, то скажите как мне получить состояние 4-го бита EXC_RETURN равное ==1 ???
Вы мануале вроде как указано, что он может принимать разные значения.
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2015, 08:12
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Apr 24 2015, 11:05) *
Непонятно как включить или отключить выделение места под регистры FPU при стэкинге.

Сбросить бит FPCA в регистре CONTROL.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 24 2015, 08:23
Сообщение #14


Гуру
******

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



Цитата(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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:41
Рейтинг@Mail.ru


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