|
|
  |
Как урезать exception stacking для Cortex-M4F |
|
|
|
Apr 24 2015, 06:47
|
Гуру
     
Группа: Свой
Сообщений: 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. Не судьба.
|
|
|
|
|
Apr 24 2015, 07:05
|
Гуру
     
Группа: Свой
Сообщений: 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).
|
|
|
|
|
Apr 24 2015, 07:58
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Везде в мануале так пишут, что как будто место под FPU-регистры может выделяться, а может и нет. Но как это переключить - не понятно. В порту uCOS для M4F тоже кстати при описании фрейма стека при переключении задач так описывают, как будто можно не выделять место под FPU. Ниже выдержка из описания стековых фреймов задач в uCOS. Как раз верхние 8 слов соответствуют стэкингу в M3 (картинки a и  . Порт использует сохранённые стэкингом значения регистров не перемещая их, а просто программно дописывает 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 )
|
|
|
|
|
Apr 24 2015, 08:05
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Apr 24 2015, 14:01)  Чего там непонятного? Вы мануал пробовали читать? Я даже ссылку давал. Непонятно как включить или отключить выделение места под регистры FPU при стэкинге. Если Вы так хорошо умеете читать мануал, то скажите как мне получить состояние 4-го бита EXC_RETURN равное ==1 ??? Вы мануале вроде как указано, что он может принимать разные значения.
|
|
|
|
|
Apr 24 2015, 08:23
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Apr 24 2015, 14:12)  Сбросить бит FPCA в регистре CONTROL. Всё я это уже сам нашёл только что  Именно это мне и нужно было. Запутался немного с двумя разными FPCA: регистром FPCA (Floating-Point Context Address) и битом FPCA в регистре CONTROL. И ещё меня запутал отладчик: почему-то отладчик (IAR+JLink) бит CONTROL.FPCA всегда показывает как ==0. И только после того как я явно сделал MRS R2, CONTROL, то увидел его истинное значение (==1). Всем участникам - спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|