|
загрузка с декрементом указателя |
|
|
|
Feb 13 2016, 18:10
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
Цитата(Сергей Борщ @ Feb 13 2016, 17:20)  Указатель? индекс Цитата(SSerge @ Feb 13 2016, 17:27)  Тогда это команды типа LDR Rt, [Rn], #offset а декремент ?
|
|
|
|
|
Feb 15 2016, 23:01
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Огурцов @ 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 ? А ещё можно за проход сразу пачку регистров грузить или сохранять. Одной командой.
|
|
|
|
|
Feb 15 2016, 23:38
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(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 находится отрицательное число). Или можно пересылать "задом наперёд", уменьшая счётчик -- это проще для понимания, но может не подходить в конкретном случае (вдруг массивы перекрываются в памяти, и пересылать надо именно двигаясь вперёд). Цитата А ещё можно за проход сразу пачку регистров грузить или сохранять. Одной командой. Можно. Если надо переслать несколько слов (и всегда одно и то же количество), этот способ будет наиболее быстрым.
|
|
|
|
|
Feb 17 2016, 05:24
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Дошли у меня наконец-то руки скачать и открыть описание системы команд Cortex-M0 (не имел практики с ним). Да, всё там сильно урезано по сравнению с M3... Автор всё время талдычит о каких-то тактах Цитата(Огурцов @ Feb 17 2016, 01:42)  мне как раз и не хватало шестого такта повторное чтение документации открыло что он есть, поэтому решение появилось Обработка одного 32-битного слова у Вас не должна превышать 6 тактов? Так Вас понимать?? Тогда предложенный SII вариант не подходит - он требует 8 тактов на проход, судя по даташиту. Если надо тратить именно не более 6 тактов на слово, то есть только один вариант - загрузка и обработка сразу нескольких слов (как я предлагал). Другого решения нет. Так как любая команда перехода занимает 3 такта, а любая команда загрузки/выгрузки из/в ОЗУ - минимум 2 такта.
|
|
|
|
|
Feb 17 2016, 17:11
|
Гуру
     
Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588

|
загрузка с выгрузкой занимает 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. выравнивание можно сделать, инструкция двухбайтная - загрузка я считаю, может быть два
|
|
|
|
|
Feb 18 2016, 03:46
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Огурцов @ 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.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|