Вопрос по IARу и STM32

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
imsushka
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн окт 01, 2018 09:19:51

Вопрос по IARу и STM32

Сообщение imsushka »

Компилирую и смотрю lst файл

Код: Выделить всё

    719          u32 V0_V3(u32 temp) {
    720          
    721            if      ( temp == 0 ) return V0;
   \                     V0_V3: (+1)
   \        0x0   0x2800             CMP      R0,#+0
   \        0x2   0xD104             BNE.N    ??V0_V3_0
   \        0x4   0x....'....        LDR.W    R0,??DataTable19_3  ;; 0x20002e3a        <--------------------- 
   \        0x8   0x8800             LDRH     R0,[R0, #+0]
   \        0xA   0xB280             UXTH     R0,R0            ;; ZeroExt  R0,R0,#+16,#+16
   \        0xC   0xE015             B.N      ??V0_V3_1
    722            else if ( temp == 1 ) return V1;
   \                     ??V0_V3_0: (+1)
   \        0xE   0x2801             CMP      R0,#+1
   \       0x10   0xD104             BNE.N    ??V0_V3_2
   \       0x12   0x....'....        LDR.W    R0,??DataTable19_4  ;; 0x20002f6e        <--------------------- 
   \       0x16   0x8800             LDRH     R0,[R0, #+0]
   \       0x18   0xB280             UXTH     R0,R0            ;; ZeroExt  R0,R0,#+16,#+16
   \       0x1A   0xE00E             B.N      ??V0_V3_1
    723            else if ( temp == 2 ) return V2;
   \                     ??V0_V3_2: (+1)
   \       0x1C   0x2802             CMP      R0,#+2
   \       0x1E   0xD104             BNE.N    ??V0_V3_3
   \       0x20   0x....'....        LDR.W    R0,??DataTable19_5  ;; 0x20002f72        <--------------------- 
   \       0x24   0x8800             LDRH     R0,[R0, #+0]
   \       0x26   0xB280             UXTH     R0,R0            ;; ZeroExt  R0,R0,#+16,#+16
   \       0x28   0xE007             B.N      ??V0_V3_1
    724            else if ( temp == 3 ) return V3;
   \                     ??V0_V3_3: (+1)
   \       0x2A   0x2803             CMP      R0,#+3
   \       0x2C   0xD104             BNE.N    ??V0_V3_4
   \       0x2E   0x....'....        LDR.W    R0,??DataTable19_6  ;; 0x20002f76        <--------------------- 
   \       0x32   0x8800             LDRH     R0,[R0, #+0]
   \       0x34   0xB280             UXTH     R0,R0            ;; ZeroExt  R0,R0,#+16,#+16
   \       0x36   0xE000             B.N      ??V0_V3_1
    725            else return 0;
   \                     ??V0_V3_4: (+1)
   \       0x38   0x2000             MOVS     R0,#+0
   \                     ??V0_V3_1: (+1)
   \       0x3A   0x4770             BX       LR               ;; return
    726          }
    727      

   \                                 In section .text, align 4, keep-with-next
   \                     ??DataTable19_3:
   \        0x0   0x2000'2E3A        DC32     0x20002e3a

   \                                 In section .text, align 4, keep-with-next
   \                     ??DataTable19_4:
   \        0x0   0x2000'2F6E        DC32     0x20002f6e

   \                                 In section .text, align 4, keep-with-next
   \                     ??DataTable19_5:
   \        0x0   0x2000'2F72        DC32     0x20002f72

   \                                 In section .text, align 4, keep-with-next
   \                     ??DataTable19_6:
   \        0x0   0x2000'2F76        DC32     0x20002f76
    
срелочками показан вопрос - почему компилятор сохранят адрес переменной в отдельной области и можно ли от этого избавитса?
что б получилось что то типа такого

Код: Выделить всё

MOVS     R0,#0x20002e3a
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопрос по IARу и STM32

Сообщение VladislavS »

Нельзя. Компилятор тут не причём. MOV.
Реклама
imsushka
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн окт 01, 2018 09:19:51

Re: Вопрос по IARу и STM32

Сообщение imsushka »

ууууу, тяжелый случай, 32битный проц который не может загрузить 32 бита
на 10кб кода получается 11кб массив адресов. и компилятор не оптимизирует его. в каждой функции свои указатели на одну и туже глобальную переменную !!!!!!

Код: Выделить всё

 10 378 bytes of CODE  memory (+ 11 262 bytes shared)
  2 560 bytes of CONST memory
  1 226 bytes of DATA  memory
это же получается 2ное чтение и кеш не работает = тормоза

а есть MOV32 - можно ли как то заставить компилятор использовать ее ? по объему меньше не будет, но может хоть по скорости улучшится ?

да, и это все компилицца без оптимизации.
если включать оптимизацию по размеру, то получается так

Код: Выделить всё

 6 292 bytes of CODE  memory (+ 8 808 bytes shared)
 2 288 bytes of CONST memory
 1 228 bytes of DATA  memory
но все равно получается что указатели на переменные занимают в 3 раза больше места чем сами переменные !!!!!
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопрос по IARу и STM32

Сообщение VladislavS »

Столько глупостей в одном посте написали, что даже отвечать не хочется. Лучше бы написали что за проц и пример функции, которую надо оптимизировать. Что-то мне подсказывает, что "дело не в бобине."
Реклама
Эиком - электронные компоненты и радиодетали
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Re: Вопрос по IARу и STM32

Сообщение Trully »

...потому что размер шин в АЛУ - 32 бита. Размер инструкции - 32 (или 16) бита. И 32-битная константа просто не помещается в размер инструкции. Поэтому, есть инструкция размером (в этом случае) 16 бит, и есть константа 32 бита, которая отдельно пересылается по команде инструкции. При любом раскладе вам нужно место под хранение кода самой инструкции и место под хранение константы, даже если их объединить в одну инструкцию. С учетом того, что инструкция содержит не только номер команды, но и набор дополнительных флагов условий исполнения. Таков порядок для ARM.
32-битность проца тут как бы не при чем. Он же работает целиком с 32-битным словом? Да.

MOV32 - такой инструкции в наборе команд нет. Это псевдо инструкция компилятора. Представляет собой две 32-битные инструкции mov и movt, разделяя константу по 16 бит. Итого получается 8 байт.
но все равно получается что указатели на переменные занимают в 3 раза больше места чем сами переменные !!!!!
И это очень логично! Что такое указатель? Указатель - это адрес переменной. 32-битный адрес, причем. Даже если переменная всего 8 бит. Поэтому, тут дело не в компиляторе или проце, тут дело в понимании смысла "указатель"
to be or not to be = -1
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопрос по IARу и STM32

Сообщение VladislavS »

Кстати, проблемы со скоростью решаете, а оптимизацию по размеру включаете. Не видите противоречий?
Реклама
imsushka
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн окт 01, 2018 09:19:51

Re: Вопрос по IARу и STM32

Сообщение imsushka »

ну допустим 8080 и Z80 8битные, но оперировать с 16битными непосредственными данными могут
8088 тоже с 8битной шиной и тоже 16 битные данные
80386 32 битные и могут загрузить 32 бита данных непосредственных

что же логично?? адрес переменной я должен загрузить в регистр (32битный) и дальше с ним работать.
а так получается что сначала я загружаю в регистр адрес хранения адреса переменной. и только потом гружу сам адрес.

я просто асмом АРМа не интересовался и не думал что не будет простой команды загрузки непосредсвенных данных, причом похоже что и 16 бит загружать не получиться

насчет скорость и размера. чем меньше команд на операцию тем она быстрее выполняется (без учета циклов). не ?

а проц 103, пока

и что глупого написанно?
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Вопрос по IARу и STM32

Сообщение Мурик »

imsushka писал(а):что же логично?? адрес переменной я должен загрузить в регистр (32битный) и дальше с ним работать.
Вот смотрите, шина данных 32-ух битная. Как на ней одновременно поместится 16-ти битная инструкция и 32-ух битная константа? Это 16 + 32 = 48 бит. Как по 32-ух битной шине данных может одновременно пройти 48 бит? Их нужно разделить на 16 и 32, логично?
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Вопрос по IARу и STM32

Сообщение tonyk »

насчет скорость и размера. чем меньше команд на операцию тем она быстрее выполняется (без учета циклов). не ?
Нет. Например, Z80, Спектрум. Алгоритм очистки экрана. Стандартный подход состоял в использовании LDIR. Для установки одного байта в "0" требовался 21 такт (Если не ошибаюсь). Но если установить указатель стека на начало экрана и записывать в стек регистровую пару, да ещё и зафигачить подряд 32 штуки PUSH, то в итоге получалось почти вдвое быстрей. Хотя размер кода, грубо, вместо 15 байт становился в 5 раз больше.
И компиляторы знают подобные трюки. Для х86 так вообще таких ситуаций вагон, когда вместо одной, но длинной команды, используется несколько коротких. И разница составляла десятки процентов как в сторону повышения суммарной скорости, так и в сторону увеличения размера кода. Поэтому и делают у компиляторов оптимизацию или по скорости, или по размеру кода. Именно по этой причине для каждого файла можно отдельно указывать какую оптимизацию использовать.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопрос по IARу и STM32

Сообщение Reflector »

[uquote="imsushka",url="/forum/viewtopic.php?p=3826867#p3826867"]адрес переменной я должен загрузить в регистр (32битный) и дальше с ним работать.
а так получается что сначала я загружаю в регистр адрес хранения адреса переменной. и только потом гружу сам адрес.[/uquote]
Адрес хранения адреса грузится из флеша, компилятор таблицу с константами размешает рядом с исполняемым кодом, так чтобы для доступа к ним хватило 12-ти битного смещения, потому 32-х битной команды достаточно. Суммарно получается 8 байт, такой-же результат(на M3 и выше) можно получить дважды загружая по 16-ть бит при помощи инструкций MOV и MOVT.
imsushka
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн окт 01, 2018 09:19:51

Re: Вопрос по IARу и STM32

Сообщение imsushka »

[uquote="Мурик",url="/forum/viewtopic.php?p=3826889#p3826889"]
imsushka писал(а):что же логично?? адрес переменной я должен загрузить в регистр (32битный) и дальше с ним работать.
Вот смотрите, шина данных 32-ух битная. Как на ней одновременно поместится 16-ти битная инструкция и 32-ух битная константа? Это 16 + 32 = 48 бит. Как по 32-ух битной шине данных может одновременно пройти 48 бит? Их нужно разделить на 16 и 32, логично?[/uquote]

а как это сделанн в х86?
первая команда, 8бит или 16, определяет код операции, а последующие - операнд. и загружать можно не 1 и не 2 слова шины, хоть 100 слов. те же симд-инструкции в х86 до 20 байт длинной

и даже устроенные так инструкции будут выполнятся быстрее, так как идет просто последовательное чтение памяти, в отличии арма, где сначала загружается команда которая уже загрузит нужные данные

Добавлено after 6 minutes 25 seconds:
[uquote="Reflector",url="/forum/viewtopic.php?p=3826916#p3826916"][uquote="imsushka",url="/forum/viewtopic.php?p=3826867#p3826867"]адрес переменной я должен загрузить в регистр (32битный) и дальше с ним работать.
а так получается что сначала я загружаю в регистр адрес хранения адреса переменной. и только потом гружу сам адрес.[/uquote]
Адрес хранения адреса грузится из флеша, компилятор таблицу с константами размешает рядом с исполняемым кодом, так чтобы для доступа к ним хватило 12-ти битного смещения, потому 32-х битной команды достаточно. Суммарно получается 8 байт, такой-же результат(на M3 и выше) можно получить дважды загружая по 16-ть бит при помощи инструкций MOV и MOVT.[/uquote]

да, я уже понял это, просто при каких то оптимизациях, коипилятор ставит эту таблицу в конце всех функций. и там я вижу кучу ссылок на одну и туже переменную, просто они используются в разных функциях. то есть компилятор не с оптимизировал эти ссылки. и они достаточно сильно разрослись
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопрос по IARу и STM32

Сообщение Reflector »

[uquote="imsushka",url="/forum/viewtopic.php?p=3826921#p3826921"]а как это сделанн в х86?[/uquote]
x86 - это CISC, у него более сложные команды разной длины, а ARM - RISC, там команды простые. Для сложных команд нужно больше кремния и выполняются они дольше, не лучший выбор для мк. Собственно даже современные x86 преобразуют CISC команды в RISC и выполняют уже их, если бы их сейчас разрабатывали с нуля, то естественно x86 были бы RISC изначально со всеми вытекающими...
imsushka
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн окт 01, 2018 09:19:51

Re: Вопрос по IARу и STM32

Сообщение imsushka »

[uquote="Reflector",url="/forum/viewtopic.php?p=3826922#p3826922"][uquote="imsushka",url="/forum/viewtopic.php?p=3826921#p3826921"]а как это сделанн в х86?[/uquote]
x86 - это CISC, у него более сложные команды разной длины, а ARM - RISC, там команды простые. Для сложных команд нужно больше кремния и выполняются они дольше, не лучший выбор для мк. Собственно даже современные x86 преобразуют CISC команды в RISC и выполняют уже их, если бы их сейчас разрабатывали с нуля, то естественно x86 были бы RISC изначально со всеми вытекающими...[/uquote]


risc-v
Инструкции базового набора имеют длину 32 бита с выравниванием на границу 32-битного слова, но в общем формате предусмотрены инструкции различной длины (стандартно — от 16 до 192 бит с шагом в 16 бит) с выравниванием на границу 16-битного слова. Полная длина инструкции декодируется унифицированным способом из её первого 16-битного слова.


20 лет назад, когда трава была зеленее, я занимался дурмарством и делал свой проц. 256 битный с 32 битной шиной.
и загрузку непосредственных данных, правда не 256, а всего 64 бита, я реализовал легко. парой тройкой логических элементов.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопрос по IARу и STM32

Сообщение Reflector »

[uquote="imsushka",url="/forum/viewtopic.php?p=3826929#p3826929"]risc-v[/uquote]
Там есть загрузка 20-ти битной константы в старшую часть регистра, потом к ней можно прибавить 12-ти битную константу, получаются те же 2 инструкции по 32 бита.
imsushka
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн окт 01, 2018 09:19:51

Re: Вопрос по IARу и STM32

Сообщение imsushka »

[uquote="imsushka",url="/forum/viewtopic.php?p=3826929#p3826929"][uquote="Reflector",url="/forum/viewtopic.php?p=3826922#p3826922"][uquote="imsushka",url="/forum/viewtopic.php?p=3826921#p3826921"]а как это сделанн в х86?[/uquote]
risc-v
Инструкции базового набора имеют длину 32 бита с выравниванием на границу 32-битного слова, но в общем формате предусмотрены инструкции различной длины (стандартно — от 16 до 192 бит с шагом в 16 бит) с выравниванием на границу 16-битного слова. Полная длина инструкции декодируется унифицированным способом из её первого 16-битного слова.[/uquote]

это выдрано из документации по риск5. до 192 бит команда , тоесть можно загрузить в регистр 128 бит непосредственных данных одной командой
Trully
Встал на лапы
Сообщения: 118
Зарегистрирован: Вс авг 18, 2019 13:22:01

Re: Вопрос по IARу и STM32

Сообщение Trully »

Ничоси вы такую примитивную штуку раздули до таких масштабов в 192 бита. Топикстартер просто забыл, что есть "указатель на переменную", а развезли аж до проблем 192 бит.
to be or not to be = -1
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: Вопрос по IARу и STM32

Сообщение tonyk »

И тут Остапа понесло...
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Вопрос по IARу и STM32

Сообщение Reflector »

[uquote="imsushka",url="/forum/viewtopic.php?p=3826958#p3826958"]это выдрано из документации по риск5. до 192 бит команда , тоесть можно загрузить в регистр 128 бит непосредственных данных одной командой[/uquote]
И какая это команда? Ее же не трудно выдрать из документации?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Вопрос по IARу и STM32

Сообщение VladislavS »

imsushka, не мешайте компилятору работать! Всё он оптимизирует, если может. Вот пример.

Код: Выделить всё

// Три глобальных переменных
volatile uint32_t x;
volatile uint32_t y;
volatile uint32_t z;

// две функции работающие с ними
uint32_t foo()
{
  z=x+y;
}

uint32_t foo1()
{
  y=z+x;
}
Теперь вызовем эти функции и посмотрим что получилось

Код: Выделить всё

//foo();
        LDR.N    R1,??DataTable2   // Загрузить адрес где лежат x,y,z
        LDR      R2,[R1, #+0]    // читать x
        LDR      R0,[R1, #+4]    // читать y
        ADDS     R2,R0,R2        //  x+y
        STR      R2,[R1, #+8]   //  сохранить z
//foo1();
        LDR      R2,[R1, #+8]   // читать z
        LDR      R0,[R1, #+0]   // читать x
        ADDS     R2,R0,R2       //  x+z
        STR      R2,[R1, #+4]  //  сохранитьy 
На 6 операций доступа к глобальным переменным 32-битный адрес был загружен лишь однажды.
Это я ещё volatile поставил, чтобы доступ к ним реально был, а так бы он вообще всё вусмерть оптимизировал.

PS: Вот ради интереса, покажите стартап и low_level_init(). Сдаётся мне, там ещё поле непаханое по оптимизации.
imsushka
Встал на лапы
Сообщения: 129
Зарегистрирован: Пн окт 01, 2018 09:19:51

Re: Вопрос по IARу и STM32

Сообщение imsushka »

да я это уже понял, все глобальные переменные поставил рядом

просто у меня куча попрограмм, маленьких. и после каждой указатель на начало переменных. и компилятор не оптимизирует это. хотя можно было бы оставить 1 на несколько подпрограмм (функций). в пределах 255 алресов штук 10 попрограмм получается

ну ладно, пролетели
просто я был сильно удивлен отсутсвием простейшей команды
буду дальше ковырять

а в low_level 4 байта занято и startup тоже стандартный
я так шлубоко еще не лазил
там наверно размеры не значительны
Ответить

Вернуться в «ARM»