Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: загрузка с декрементом указателя
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Огурцов
не нашёл команду ассемблера, есть такая ?
stm32f0, 3, 4
Сергей Борщ
LDMDB?
SSerge
У M3 и M4 такая инструкция есть:
http://infocenter.arm.com/help/topic/com.a...a/BABIHJGA.html
А у M0, увы, нет:
http://infocenter.arm.com/help/index.jsp?t...b/BABIHJGA.html
Огурцов
да вроде бы не совсем правильная инструкция
мне нужно загрузить данные в регистр по указателю, декрементировать указатель и перейти пока не ноль
т.е. обычный цикл, который можно легко сделать на avr
а тут что-то через указатель стека, что там с чем сравнивать и что будет с данными при прерываниях
Сергей Борщ
Цитата(Огурцов @ Feb 13 2016, 18:56) *
мне нужно загрузить данные в регистр по указателю, декрементировать указатель и перейти пока не ноль
Пока не ноль что? Указатель?
SSerge
Тогда это команды типа LDR Rt, [Rn], #offset
но, аналогично, М0 такого не умеет.
http://infocenter.arm.com/help/topic/com.a...a/BABJGHFJ.html
Огурцов
Цитата(Сергей Борщ @ Feb 13 2016, 17:20) *
Указатель?

индекс


Цитата(SSerge @ Feb 13 2016, 17:27) *
Тогда это команды типа LDR Rt, [Rn], #offset

а декремент ?

Сергей Борщ
Цитата(Огурцов @ Feb 13 2016, 20:10) *
индекс
Откуда вдруг взялся индекс?
Огурцов
не, а как ещё можно быстренько пробежаться по массиву ?
aaarrr
Цитата(Огурцов @ Feb 13 2016, 21:10) *
а декремент ?

и декремент.
Огурцов
_и_ декремент не лезет
надо было вписать в пять тактов: загрузку, сохранение, декремент, проверку и переход
Огурцов
можно даже в шесть
SII
LDR R0, [R1]
STR R0, [R2]
SUBS R1, #4
BNE ....
jcxz
Цитата(Огурцов @ Feb 13 2016, 22:56) *
да вроде бы не совсем правильная инструкция
мне нужно загрузить данные в регистр по указателю, декрементировать указатель и перейти пока не ноль
т.е. обычный цикл, который можно легко сделать на avr
а тут что-то через указатель стека, что там с чем сравнивать и что будет с данными при прерываниях

Если не хотите читать документацию по системе команд, то хотя-бы асм-листинг этого си-кода посмотрите. С макс. оптимизацией.

Цитата(SII @ Feb 15 2016, 01:50) *
LDR R0, [R1]
STR R0, [R2]
SUBS R1, #4
BNE ....

Зачем много раз перезаписывать [R2]?
Может всё-таки: LDR R0,[R1],#4 / STR R0,[R2],#4 / SUBS R3,#1 ?
А ещё можно за проход сразу пачку регистров грузить или сохранять. Одной командой.
SII
Цитата(jcxz @ Feb 16 2016, 02:01) *
Зачем много раз перезаписывать [R2]?


Задача толком не определена, поэтому набросан лишь примерный код, очерчивающий общую идею.

Цитата
Может всё-таки: LDR R0,[R1],#4 / STR R0,[R2],#4 / SUBS R3,#1 ?


Эти варианты LDR/STR отсутствуют в первой Тумбе, а значит, на Cortex-M0 использоваться не могут. На самом деле, если чтение и запись идут с одинаковым шагом (+4 в Вашем примере), можно сделать примерно так:

Код
LDR   R0, [R1, R3]
STR   R0, [R2, R3]
ADDS  R3, #4
BNE   ...


В данном случае надо в R1, R2 и R3 занести правильные начальные значения, которые удобны для машины, а не для человека. R3 должен быть таким, чтобы при достижении им нуля (через сложение, а не вычитание) цикл прекращался; по сути, он содержит число пересылаемых байтов со знаком минус. Соответственно, в R1 и R2 должны быть не базовые адреса массивов, а адреса первых байтов после массивов (поскольку при сложении R1/R2 и R3 итоговый адрес будет меньше, чем находящийся в R1/R2 -- ведь в R3 находится отрицательное число).

Или можно пересылать "задом наперёд", уменьшая счётчик -- это проще для понимания, но может не подходить в конкретном случае (вдруг массивы перекрываются в памяти, и пересылать надо именно двигаясь вперёд).

Цитата
А ещё можно за проход сразу пачку регистров грузить или сохранять. Одной командой.


Можно. Если надо переслать несколько слов (и всегда одно и то же количество), этот способ будет наиболее быстрым.
Сергей Борщ
А пересылать не требовалось. Требовалось, цитирую, "загрузить данные в регистр по указателю, декрементировать указатель и перейти пока не ноль". Еще требовалось "быстренько пробежаться по массиву". Каков вопрос, такие и ответы. Если бы Огурцова интересовало решение, он бы постарался точно и максимально понятно описать задачу. А так это просто очередной вброс от этого персонажа.
Огурцов
мне как раз и не хватало шестого такта
повторное чтение документации открыло что он есть, поэтому решение появилось
единственно, что гнать индекс от минуса к нулю я не догадался, а это чуть более интересно, чем декремент
сейчас мегазанят, но как появится время перепишу свой развёрнутый цикл именно на этот вариант
jcxz
Дошли у меня наконец-то руки скачать и открыть описание системы команд Cortex-M0 (не имел практики с ним).
Да, всё там сильно урезано по сравнению с M3...
Автор всё время талдычит о каких-то тактах
Цитата(Огурцов @ Feb 17 2016, 01:42) *
мне как раз и не хватало шестого такта
повторное чтение документации открыло что он есть, поэтому решение появилось

Обработка одного 32-битного слова у Вас не должна превышать 6 тактов? Так Вас понимать??
Тогда предложенный SII вариант не подходит - он требует 8 тактов на проход, судя по даташиту.
Если надо тратить именно не более 6 тактов на слово, то есть только один вариант - загрузка и обработка сразу нескольких слов (как я предлагал). Другого решения нет.
Так как любая команда перехода занимает 3 такта, а любая команда загрузки/выгрузки из/в ОЗУ - минимум 2 такта.
Огурцов
загрузка с выгрузкой занимает 3 такта
переход 1+p
Цитата
The number of cycles required for a pipeline refill. This ranges from 1 to 3
depending on the alignment and width of the target instruction, and whether the
processor manages to speculate the address early.

выравнивание можно сделать, инструкция двухбайтная - загрузка
я считаю, может быть два
jcxz
Цитата(Огурцов @ Feb 17 2016, 23:11) *
загрузка с выгрузкой занимает 3 такта
переход 1+p

И где Вы такие данные взяли???
В даташите на ядро "Cortex-M0 Revision: r0p0 Technical Reference Manual" с http://infocenter.arm.com совсем другие значения.
Какой у Вас МК? Вроде писали про STM32F0xxx, а для него в "RM0360 Reference manual" указано ядро M0 (без плюса!) rev.r0p0.
Огурцов
Цитата
stm32f0, 3, 4

stm32f407 в первую очередь
jcxz
Цитата(SII @ Feb 16 2016, 05:38) *
Эти варианты LDR/STR отсутствуют в первой Тумбе, а значит, на Cortex-M0 использоваться не могут.

Оказывается у автора вообще М4. А мы тут распинаемся. Он сам не знает что ему нужно
Огурцов
ну да, муму тургенев написал, а памятник пушкину, ага
короче читайте внимательно, в моих постах не так много слов, чтобы пропускать целыми предложениями
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.