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

 
 
5 страниц V  « < 3 4 5  
Reply to this topicStart new topic
> Самомодифицирующийся код в экосистеме Cortex-M., есть ли право на жизнь?
VladislavS
сообщение Jun 30 2018, 18:33
Сообщение #61


Местный
***

Группа: Свой
Сообщений: 446
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Недавно в другой теме проскакивал вот такой код. По сути - копирование восьми uint16_t.
Код
cpld_regs[0] = ppm8s.state.rx.chanel[0].fv_att_h.fvatt;
cpld_regs[1] = ppm8s.state.rx.chanel[0].fv_att_v.fvatt;
cpld_regs[2] = ppm8s.state.rx.chanel[1].fv_att_h.fvatt;;
cpld_regs[3] = ppm8s.state.rx.chanel[1].fv_att_v.fvatt;
cpld_regs[4] = ppm8s.state.rx.chanel[2].fv_att_h.fvatt;;
cpld_regs[5] = ppm8s.state.rx.chanel[2].fv_att_v.fvatt;
cpld_regs[6] = ppm8s.state.rx.chanel[3].fv_att_h.fvatt;;
cpld_regs[7] = ppm8s.state.rx.chanel[3].fv_att_v.fvatt;

Который компилируется вот в это
Код
        LDR.W    R1,??DataTable6
        LDRH     R2,[R1, #+0]
        MOV      R0,#+1610612736
        STRH     R2,[R0, #+0]
        LDRH     R3,[R1, #+2]
        STRH     R3,[R0, #+2]
        LDRH     R2,[R1, #+4]
        STRH     R2,[R0, #+4]
        LDRH     R3,[R1, #+6]
        STRH     R3,[R0, #+6]
        LDRH     R2,[R1, #+8]
        STRH     R2,[R0, #+8]
        LDRH     R3,[R1, #+10]
        STRH     R3,[R0, #+10]
        LDRH     R2,[R1, #+12]
        STRH     R2,[R0, #+12]
        LDRH     R3,[R1, #+14]
        STRH     R3,[R0, #+14]

Зачем компилятор R2 и R3 чередует?
IAR 8.30.1
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 30 2018, 19:31
Сообщение #62


Гуру
******

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



Цитата(Arlleex @ Jun 30 2018, 18:09) *
А выделенное то зачем? Вы что-то говорили про перемежение инструкций для удаления штрафов LDR/STR. Могли бы озвучить, в чем там проблема?

Если выполнить просто:
LDR R2, [R1, #4]
LDR R2, [R2]

то вторая команда выполнится за 2 такта. Если же между ними вставить любую другую команду, не модифицирующую R2, то LDR R2, [R2] должна выполниться за 1 такт.
Это следует из фразы:
LDR [any] are pipelined when possible. This means that if the next instruction is an LDR or STR, and the destination of the first LDR is not used to compute the address for the next instruction, then one cycle is removed from the cost of the next instruction.
из "ARM® Cortex®‑M4 Processor Technical Reference Manual" раздел "3.3.3 Load/store timings".
Поэтому мой генератор кода использует в качестве рабочих два регистра - R2 и R3 с перемежением, чтобы убрать такие штрафы.

Цитата(VladislavS @ Jun 30 2018, 21:33) *
Зачем компилятор R2 и R3 чередует?

Здесь не знаю. А для какого это ядра?
Мой генератор кода заточен для Cortex-M4. У него я не знаю необходимости в таком перемежении.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jun 30 2018, 19:35
Сообщение #63


Местный
***

Группа: Свой
Сообщений: 446
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(jcxz @ Jun 30 2018, 22:31) *
Здесь не знаю. А для какого это ядра?
Мой генератор кода заточен для Cortex-M4. У него я не знаю необходимости в таком перемежении.

Тоже Cortex-M4, если точнее, то STM32F427.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 30 2018, 19:41
Сообщение #64


Гуру
******

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



Цитата(AlexandrY @ Jun 30 2018, 17:43) *
Таким образом теряете детерминизм и гарантированность времени окончания пересылки, так какой прок экономить такты?

Ваш пост настолько бессмысленен, что даже не знаю как ответить..... wacko.gif
На всякий случай: частоты ШИМ-ов для motor control обычно лежат где-то около 10-30 кГц. А для моего Cortex-M это однозначно - много тысяч тактов CPU на период ШИМа. Что как бы не сравнимо с 31 тактом. Не находите?
Если вы дадите себе труд изучить работу любого DMA в режиме linked-list, то увидите, что длительность пересылки будет много больше указанных нескольких десятков тактов. Кроме всего прочего....

Цитата(VladislavS @ Jun 30 2018, 22:35) *
Тоже Cortex-M4, если точнее, то STM32F427.

Не знаю. По-крайней мере TRM для CM4 в разделе "3.3.3 Load/store timings" о необходимости такого не говорит. Можете сами убедиться.
Может в реализации CM4 от STM32 имеется какой-то баг, который фиксится таким образом?
У себя я реализовал только оптимизацию чередованием инструкций указанную выше.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jun 30 2018, 19:45
Сообщение #65


Местный
***

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



Цитата(jcxz @ Jun 30 2018, 23:31) *
Поэтому мой генератор кода использует в качестве рабочих два регистра - R2 и R3 с перемежением, чтобы убрать такие штрафы.

Точно. LDR первая же всегда 2 такта занимает.

Цитата
Зачем компилятор R2 и R3 чередует?

По тем же самым причинам - снижение штрафов на LDR/STR.
LDR [any] are pipelined when possible. This means that if the next instruction is an LDR or STR, and the destination of the first LDR is not used to compute the address for the next instruction, then one cycle is removed from the cost of the next instruction.

Сообщение отредактировал Arlleex - Jun 30 2018, 19:49
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 30 2018, 19:54
Сообщение #66


Гуру
******

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



Цитата(Arlleex @ Jun 30 2018, 22:45) *
По тем же самым причинам - снижение штрафов на LDR/STR.
LDR [any] are pipelined when possible. This means that if the next instruction is an LDR or STR, and the destination of the first LDR is not used to compute the address for the next instruction, then one cycle is removed from the cost of the next instruction.

В том случае это не применимо: содержимое R2 и R3 не используется для вычисления адреса в следующих за ними командах. Посмотрите внимательнее.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Jul 1 2018, 07:22
Сообщение #67


Ally
******

Группа: Модераторы
Сообщений: 6 059
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Jun 30 2018, 22:41) *
Ваш пост настолько бессмысленен, что даже не знаю как ответить..... wacko.gif
На всякий случай: частоты ШИМ-ов для motor control обычно лежат где-то около 10-30 кГц. А для моего Cortex-M это однозначно - много тысяч тактов CPU на период ШИМа. Что как бы не сравнимо с 31 тактом. Не находите?
Если вы дадите себе труд изучить работу любого DMA в режиме linked-list, то увидите, что длительность пересылки будет много больше указанных нескольких десятков тактов. Кроме всего прочего....

Я тоже не понял эту аргументацию.
Понял только что вам как бы детерминизм в токовых контурах не важен.
И что такое токовый контур похоже не знаете.
Ну не в теме и не в теме. Что поделаешь.
Продолжайте пилить динамику. biggrin.gif

А тему переназовите так - как мне сделать пересылку быстрее чем по linked-list поскольку в XMC4700 оказался скверный DMA.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 1 2018, 10:03
Сообщение #68


Местный
***

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



Кстати, решил почитать внимательнее 3.3.2. Load/store timings из Cortex-M3 Technical Reference Manual. Там есть такие строки:
Цитата
LDR Rx!,[any] is not normally pipelined. That is, base update load is generally at least a two-cycle operation (more if stalled). However, if the next instruction does not require to read from a register, the load is reduced to one cycle. Non register writing instructions include CMP, TST, NOP, and non-taken IT controlled instructions.

Что это вообще за инструкции такие с синтаксисом обратной записи в базовый регистр LDR Rx!,[any]? Для LDM понимаю, но чтобы для LDR... Опечатка в документации? Тоже вряд ли, ниже по тексту про LDM отдельно все сказано.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 1 2018, 12:00
Сообщение #69


Гуру
******

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



Цитата(Arlleex @ Jul 1 2018, 13:03) *
Что это вообще за инструкции такие с синтаксисом обратной записи в базовый регистр LDR Rx!,[any]? Для LDM понимаю, но чтобы для LDR... Опечатка в документации? Тоже вряд ли, ниже по тексту про LDM отдельно все сказано.

Видимо это инструкции вида:
LDR Rx, [Ry], #z
и
LDR Rx, [Ry, #z]!

PS: Кстати - Вы смотрите не последнюю ревизию ядра. В ревизии r2p1 для CM3 такого замечания уже нет - видимо исправили.
Так что надо смотреть какая ревизия ядра у Вашего МК.

Цитата(AlexandrY @ Jul 1 2018, 10:22) *
А тему переназовите так - как мне сделать пересылку быстрее чем по linked-list поскольку в XMC4700 оказался скверный DMA.

Так расскажите нам: в каком таком ядре идеальный DMA, умеющий загружать из ОЗУ описание следующего блока linked-list (которое как правило имеет размер в несколько слов) за 0 тактов? Видимо это ядро умеет мгновенно телепортировать в DMA содержимое ОЗУ без использования шин biggrin.gif
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Jul 1 2018, 15:22
Сообщение #70


Частый гость
**

Группа: Участник
Сообщений: 179
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(jcxz @ Jun 29 2018, 10:51) *
Вы о чём? wacko.gif

Простые вопросы на самом деле бывают со сложными ответами. Особенно когда мозаика не складывается в общий узор.
Я повторю свой вопрос - откуда мк читает программный код?
Есть ли дополнительный код или инструкции которые должен выполнять мк в нативе, или программный код на мк в режиме эмуляции?
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 1 2018, 16:25
Сообщение #71


Местный
***

Группа: Свой
Сообщений: 446
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(AVI-crak @ Jul 1 2018, 18:22) *
Я повторю свой вопрос - откуда мк читает программный код?

При наличии PSRAM в чипе странно было бы генерить код не в него. Хотя, от задачи зависит тоже.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 2 2018, 16:12
Сообщение #72


Гуру
******

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



Цитата(VladislavS @ Jul 1 2018, 19:25) *
При наличии PSRAM в чипе странно было бы генерить код не в него. Хотя, от задачи зависит тоже.

Конечно генерю в PSRAM. При генерации в обычную SRAM время выполнения увеличивается примерно в 2 раза.
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Jul 2 2018, 20:46
Сообщение #73


Частый гость
**

Группа: Участник
Сообщений: 179
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(jcxz @ Jul 2 2018, 22:12) *
Конечно генерю в PSRAM. При генерации в обычную SRAM время выполнения увеличивается примерно в 2 раза.

Как и предполагалось, для ответа простые вопросы нужно хорошо подумать.
Повторюсь:
Откуда мк начинает выполнять программный код сразу после аппаратного сброса. Общая функция этого кода, и что происходит дальше по алгоритму.

Сообщение отредактировал AVI-crak - Jul 2 2018, 20:46
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 3 2018, 04:44
Сообщение #74


Местный
***

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



Цитата(AVI-crak @ Jul 3 2018, 00:46) *
Откуда мк начинает выполнять программный код сразу после аппаратного сброса. Общая функция этого кода, и что происходит дальше по алгоритму.

А откуда он после сброса может выполнять код, на Ваш взгляд? Конечно же из flash. И алгоритм его находится во flash-памяти. Но формирует опкоды для исполнения в PSRAM.
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Jul 3 2018, 18:38
Сообщение #75


Частый гость
**

Группа: Участник
Сообщений: 179
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(Arlleex @ Jul 3 2018, 10:44) *
А откуда он после сброса может выполнять код, на Ваш взгляд? Конечно же из flash.

Правильный ответ считается решением задачи.
Go to the top of the page
 
+Quote Post

5 страниц V  « < 3 4 5
Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2018 - 14:04
Рейтинг@Mail.ru


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