Easyelectronics.ru

Электроника для всех
Текущее время: 28 апр 2017, 07:22

Часовой пояс: UTC + 5 часов



    • Изготовление печатных плат. Примерные цены: 10 штук 2-слоя 100*100mm 8.21$ или около ~470 рублей
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 20 ] 
Автор Сообщение
 Заголовок сообщения: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 14:17 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4187
Откуда: Киев
Здраствуйте!
Не занимался (и не планирую скоро) АРМами. Не хочу лезть в даташиты, хотя там ответ наверняка есть. Но в проектах работаю с контроллером ПЛК100 от фирмы ОВЕН, построенном на 32-разрядном АРМе от Атмела.
И вот какая возникла идея. Зачем оговаривать разные типы целочисленных переменных? В той системе программирования, что используется (КоДеСис), есть BOOL, BYTE, WORD, DWORD, INT, DINT и т.д. Преобразование обычно явное, дурацкими такими операторами типа DWORD_TO_WORD. НО каков смысл объявлять короткие типы?
В моих проектах как правило запас ресурсов просто ошеломляющий. Например, программа на 180 К - уже серьезная такая взрослая программа, занимает меньше 10 % от допустимого объема. То же с ОЗУ, там еще больший запас. Выходит - укорачивать представление в памяти вовсе ни к чему.
Но запас быстродействия уже не так велик. Поэтому и вопрос: а обрабатывает ли АРМ-процессор короткие и длинные типы данных одними и теми же командами? Есть ли прогрыш в скорости обработки, если я вместо 1-байтных переменных буду нагло использовать во всей проге только 2-хбайтные? А 4-хбайтные?
Ну, что касается REAL - DREAL, то скорее всего разница есть...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 16:30 
Старожил
Аватара пользователя

Зарегистрирован: 09 ноя 2010, 11:05
Сообщения: 1976
Откуда: Казань
тоже особо не вчитывался, но думаю для 32-х разрядного проца проще работать с 32 битными данными нежели с 8 битными. так что выигрыш в скорости от использования 32 бит будет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 16:37 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
За все армы не скажу, а только за Кортекс-М3. Есть инструкции записи/чтения по 8, 16 и 32 бита, с этим нет проблем. НО ввиду того что в раме ничего делать не умеет - вся обработка в регистрах, следовательно после загрузки/перед записью да и вообще в процессе работы накладываются малополезные в плане производительности маски для обработки переполнений и прочей фигни, которая делается аппаратно для 32-битных значений.
Пример: инструкции сложения только для 32-битных регистров
Вложение:
RGINDEX-44.png
RGINDEX-44.png [ 156.27 Кб | Просмотров: 12192 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 17:59 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Вообще-то давно известно, что не зависимо от архитектуры, обработка данных оптимальна, если данные кратны разрядности процессора. Всё остальное - лишние операции.
Так что если надо работать с 8 битными данными на 32х разрядном процессоре - используйте смело integer, компилятор сам всё сделает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 19:58 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4187
Откуда: Киев
Не все понял. Вы оба говорите вроде как не о проигрыше от перехода к многобайтным переменным, а о выигрыше от использования только 4-байтных целочисленных перееменных. Я думал, что объявление всех и вся двойными словами (32 бита) может не ухудшить быстродействие или мало ухудшить...

amx писал(а):
Есть инструкции записи/чтения по 8, 16 и 32 бита, с этим нет проблем. НО ввиду того что в раме ничего делать не умеет - вся обработка в регистрах

А в регистрах все 32-разрядное? То есть все Source & Destination в твоей табличке - исключительно 32-разрядные?
Если так, то при обработке 8-битной переменной ее может и вытянут из памяти быстрее (хотя там же конвейер есть - так что не факт, что быстрее), а потом дополнят до 32 разрядов и так и будут обрабатывать. В конце отрежут 24 разряда сверху и запихнут в память (или просто запихнут 1 байт, если компилятор такой умный).

А как понимать
ploop писал(а):
используйте смело integer, компилятор сам всё сделает

Подтверждает ли это, что смысла вообще иметь в проге байтовые переменные нет? Я, конечно, не говорю о стрингах. Речь идет просто о переменных, которые укладываются в диапазон 255 (ну, скажем, индексы в небольших массивах).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 20:19 
Старожил
Аватара пользователя

Зарегистрирован: 14 июн 2011, 14:22
Сообщения: 335
drvlas писал(а):
Подтверждает ли это, что смысла вообще иметь в проге байтовые переменные нет? Я, конечно, не говорю о стрингах. Речь идет просто о переменных, которые укладываются в диапазон 255 (ну, скажем, индексы в небольших массивах).
... все зависит от конкретной задачи ... ИМХО если есть желание оптимизировать по скорости выполнения - можно переписать часто используемые процедуры на ассемблере, а забить память лишними нулями - стоит оно того?

ploop писал(а):
Вообще-то давно известно, что не зависимо от архитектуры, обработка данных оптимальна, если данные кратны разрядности процессора. Всё остальное - лишние операции.
...не для Cortex-M3 ... вообще-то поэтому и слепили "ТУМБУ-2", что-бы не переживать на этот счет и инструкции str rx,[rx],#4 и strb rx,[rx],#1 выполнятся за одинаковое время, хотя последняя работает с байтом, так что раздувать переменные не всегда имеет смысл. Для чистого - ARM, правда, все несколько хуже ...

PS. Кстати ARM и Cortex-M3 в этом плане различны - для ARM важно выравнивание а Cortex-M3 оно по-барабану.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 20:38 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4187
Откуда: Киев
ChipKiller писал(а):
если есть желание оптимизировать по скорости выполнения - можно переписать часто используемые процедуры на ассемблере, а забить память лишними нулями - стоит оно того?

Вероятно, я плохо пояснил. Нет желания оптимизировать по скорости.

А есть желание уменьшить число типов данных в программе. А именно: все целочисленные переменные размером 1, 2 или 4 байта - сделать 4-байтными. Зачем? А вот зачем.

У меня много т.н. "параметров", т.е. переменных, с которыми может работать пользователь. И эти параметры, а точнее - переменные, хранящие их значения, имеют различные типы - от практически булевых до двойных целых и вещественных. Многие процедуры работы с этими переменными получают на входе указатель на нее и тип данных - а дальше приходится делать нечто подобное Си-шному SWITCH по типу. Чем меньше типов, тем меньше веток в переключателе. Это раз.

Кроме того, часто-густо в операторах присвоения приходится иметь дело с разными переменными - и, если типы не совпадают, то приходится использовать явное преобразование (там язык такой, строгий к типам). А оно еще и громоздкое в записи. Значительно проще было бы не преобразовывать - а! значит лучше иметь одинаковые типы. Это два.

И вообще, если оказывается. что тип BYTE абсолютно ничем не лучше типа WORD, а тот, в свою очередь, не лучше DWORD - то какое право на жизнь имеют эти "огрызки" нормального 32-разрядного слова? Это уже два с половиной :)

Таким образом, никакой оптимизации во взрослом понимании этого слова. Только красивше тексты программ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 21:39 
Старожил

Зарегистрирован: 03 мар 2010, 14:10
Сообщения: 1514
Откуда: Беларусь, Минск
ChipKiller писал(а):
PS. Кстати ARM и Cortex-M3 в этом плане различны - для ARM важно выравнивание а Cortex-M3 оно по-барабану.
Очень даже не по барабану. Если переменная не выровнена - он её прочитает, вот только за большее время, или сгенерит прерывание, если сделаны соответствующие настройки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 21:58 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4187
Откуда: Киев
Коллеги, я не против, чтобы вы здесь перетелри только вам понятные нУансы. Но хотелось бы в сухом остатке получить все же ответ: так есть ли смысл оставлять 1- или 2-байтные переменные в программе для 32-разрядного АРМа? Ваш ответ я, не расплескивая, отнесу на форум автоматчиков, людей не столь просвещенных в вопросах тонкой разницы между ARM и Cortex. Посему ответ желательно понятный :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 28 окт 2011, 22:07 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2010, 13:27
Сообщения: 2382
Откуда: Тамбовская обл.
Цитата:
...не для Cortex-M3 ... вообще-то поэтому и слепили "ТУМБУ-2", что-бы не переживать на этот счет и инструкции str rx,[rx],#4 и strb rx,[rx],#1 выполнятся за одинаковое время, хотя последняя работает с байтом, так что раздувать переменные не всегда имеет смысл. Для чистого - ARM, правда, все несколько хуже ...


Цитата:
Подтверждает ли это, что смысла вообще иметь в проге байтовые переменные нет? Я, конечно, не говорю о стрингах. Речь идет просто о переменных, которые укладываются в диапазон 255 (ну, скажем, индексы в небольших массивах).


С учетом вышеприведённого комментария, и так как я не работал с ARM, а только теоретизирую, то не позволю себе что-то конкретно советовать. Могу только сказать, как бы я сделал: доверился компилятору на первых порах, а дальше, по мере углубления всё само уляжется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 29 окт 2011, 01:08 
Администратор
Аватара пользователя

Зарегистрирован: 16 янв 2010, 06:09
Сообщения: 6173
Откуда: Челябинск
Разве у кортекса маски на малобайтные типы на аппаратные? Он в любом раскладе это преобразование за один такт делать должен.

А вообще да, если по ОЗУ нет затыков, то юзай как минимальный размер разрядность ядра и все.

_________________
Хозяин дома


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 29 окт 2011, 01:58 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4187
Откуда: Киев
DI HALT писал(а):
А вообще да, если по ОЗУ нет затыков, то юзай как минимальный размер разрядность ядра и все.

Ну, я так и донес до автоматчиков. Теперь интересно, вскинутся ли тамошние гуру от такой наглости - все в DOUBLE WORD или в DOUBLE INTEGER объявлять :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 29 окт 2011, 03:32 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3944
drvlas, смею предположить, что байт и слово могут быть полезны в случае, когда в переменной в принципе не должно никак оказаться число, превышающее 8 или 16 бит (наверное, редкая ситуация, переполнение и всё такое...).

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

если разрастающаяся память не волнует и не страшны переполнения - нет причин не юзать только один тип.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 29 окт 2011, 12:01 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4187
Откуда: Киев
Ink писал(а):
и кстати, а кодесис компилит в нативный код арма? или там виртуальная машина?

ХТОБСКАЗАЛ... Не знаю. И КДС представляет собой такое IDE, что никому и в голову не приходит лезть в АСМ. Отладка там довольно удобная, все на лету можно делать.
Похрамывают в КДС, причем совершенно неожиданно, как для такой классной системы, всякие глупые мелочи. Например, редактор в текстовых языках (всего там 6 языков) использует пропорциональный шрифт. Уроды! Очень бесит. И вообще знакогенерация какая-то *банутая. Открывающая скобка почти не видна, если за ней не пробел. Точка такая узкая, что с перепою хер выделишь... Ну, и так далее.
А уж перемещение окошка в глобальном поиске - это капец на всю голову! Открываешь глобальный поиск. Начинаешь просматривать найденные вхождения, жмешь кнопочку типа НЕКСТ, и на каком-то шаге окошко йопс! - сместилось. И нажимаешь уже ОТМЕНА. СКОКА матов наслушался мой бедный комп на этой фиче!

Думаю, тебе что-то может подсказать тот факт, что КДС очень нацелена на переносимость. Причем целевая платформа задается при создании проекта - а при смене может выкинуться фортель с потерей конфигурации ввода-вывода. Поэтому переносимость не такая уж обалденная, ИМХО. Я работаю на одном ПЛК.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 04 июн 2015, 19:27 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 346
ё 2011 год...
Пришлось массагу удалить.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Работа с короткими типами данных
СообщениеДобавлено: 17 ноя 2015, 02:10 
Только пришел

Зарегистрирован: 15 ноя 2015, 06:25
Сообщения: 8
Откуда: Россия
Проблема в том, что работа хотя и внутри AutoCAD, но с БД. Поэтому "базовых знаний" кстати, неплохо было бы уточнить - что сие значит может оказаться просто недостаточно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 11 фев 2017, 18:29 
Свой человек

Зарегистрирован: 07 фев 2017, 01:12
Сообщения: 35
В общем, тип данных, это на самом деле полная чушь (можно это так назвать, но немножко не так ;)) который на самом то деле нужен только компилятору. Самому же ядру, пофигу какой тип данных, он не понимает такого. Он понимает только реестр, то есть место, куда записались данные (ячейка памяти). А вот уже сама битность, это и размер именно вот этой, одной ячейки памяти. То есть, если у нас 32 битная архитектура, то в одну ячейку мы можем записать только 32 бита, не больше, не меньше (то есть, 4 байта). Если у нас 8 битная архитектура, то можем мы записать только 8 бит, не больше и не меньше (то есть, 1 байт). Сразу наверное вопрос навешивается: А как же быть, если мы в 32-ух битную систему хочем записать только число до 255 (8 бит)? А вот здесь и самое интересно, то, что самый младший байт будет записан, так как нужно, а все остальные будут просто записаны нулями.

Чтобы было более понятно, давайте будем условно разбирать на 8 битах.

К примеру, давайте возьмем ти данных BOOLEAN (true/false или же 1/0). Вот как будет это предоставлено в ячейке памяти:

TRUE (1) = 0b00000001
FALSE (0) = 0b00000000

А вот как это работает на C:

Код:
#define TRUE 0x01
#define FALSE 0x00


или можно еще через ENUM

Код:
typedef enum {
  false = 0,
  true = 1
} bool;


И того, банальный булеан тип, который вроде бы, должен занимать всего один бит, занимает целый байт в 8-ми битной системе (так как это одна ячейка памяти). А в 32-ух битной будет занимать целых 4 байта!!!

Давайте возьмем еще один пример, это число до 15 (младший полубайт), то есть, для хранения которого нам нужно только 4 бита. Самый банальный пример, это когда вы работаете с каким-то enum, чтобы контролировать тип, или состояние:

Код:
typedef enum {
  EngineStateDisabled = 0x00,
  EngineStateWait = 0x01,
  EngineStateWork = 0x02,
  EngigeStateError = 0x03
} EngineState;


Вот как это будет предоставлено в памяти:

Код:
EngineStateDisabled = 0b00000000
EngineStateWait = 0b00000001
EngineStateWork = 0b00000010
EngigeStateError = 0b00000011


Как видим, на самом деле, для хранения нам нужно только два бита, но не целых восем. Но увы, в ячейке будет записано все 8 бит, просто лишние будут записаны нулями.

Есть более проблемная задача, это когда в 8-ми битном процессоре нам нужно оперировать чсилами более 255 (то есть, для хранения которых нужно более 1 байта). Что же ж тогда? А сложного ничего, просто число в таком случае разбивается на два или более байт и записывается отдельно. При работе с ними, мы знаем, где какой байт был записан и уже по отдельности сравниваем, вычитаем, или делаем то что нам нужно. Самый банальный пример такой работы, это 16-ти битный таймер на 8-ми битных процессорах (ATtiny 2313 к примеру).

Так все же, вопрос стоял в типах данных, зачем они?

Они нужны только компилятору, для того, чтобы четко определить что за чем идет, какие типы данных используются, какие их размеры, чтобы корректо скомпилировать, зарезервировать память и разложить все это по той архитектуре с который вы работаете. Не хотите использовать, не используйте, хотите, можете создавать хоть 100500 своих дополнительных типов. На скорость работы и на размер памяти (ну кривые руки тут не в счет ;)) это вообще никак влиять не будет.

Чтобы было более понятно, давайте рассмотрим пример:

Код:
uint8_t motorStatus = 0x01;

if (motorStatus) {
  // Some action
}


будет полностью аналогичен

Код:
typedef enum {
  MotorDisabled = 0x00,
  MotorEnabled = 0x01
} MotorStatus;

MotorStatus motorStatus = MotorEnabled;

if (motorStatus == MotorEnabled) {
  // Some action
}


и компилятор их скомпилит с идентичным бинарником, хотя, мы использовали совсем другой тип данных! Но, размеры этих данных полностью соответствуют.

Часто, разработчики, которым немножко урезают руки по памяти и по архитектуре (дороговизна микропроцессоров), пишут код на 8-ми битных процессорах, но при этом используют весь потенциал одной ячейки памяти. Делается это очень просто. Есть к примеру у нас BOOLEAN, который реально в памяти занимает 1 байт. Но, зная, где какой бит хранится, можно легко использовать каждый бит для отдельного флага. Банальный пример такой работы - это реестры микропроцессора. Мы, зная, где находится тот или инной флаг, и только в него записываем, или с него читаем.

P.S. Если Вам не жалко денег на более дорогие процессоры, с хорошим куском ОЗУ и ПЗУ, тогда не проблема, можете смело использовать все что угодно, и забить болт. Но иногда, бывают случаи, когда нету возможности использовать роскошь, вот тогда уже и прибегают к более мелким оптимизациям памяти и ресурсов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 11 фев 2017, 20:41 
Свой человек

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 137
Процессор АРМ обращается к памяти по словно(32-бит), вне зависимости от того работаете ли вы с байтом, двумя или четырьмя. Команды процессора 32-х битные, в thumb - режиме 16-ти битные и выборка происходит по две команды (все равно адресация 32-х битная). То есть если вы обращаетесь в байтом режиме к адресу 0x0003 то аппаратно будет все равно набран адрес 0x0000, а операция которую вы выполняете будет проводится с четвертым байтом слова. Таким образом, работаете ли вы с байтом, двумя или четырьмя - на производительность это никак не отразится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 11 фев 2017, 22:20 
Старожил
Аватара пользователя

Зарегистрирован: 29 май 2010, 18:46
Сообщения: 4187
Откуда: Киев
Прикольно, да... Я уже почти перестал работать с Кодесис (только старьіе проектьі поддерживаю), вообще от МК отхожу, оставляя их только для души. И тут вдруг такая помощь! Ай да молодцьі. И так подробненько, ага. Аж я понял.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с короткими типами данных
СообщениеДобавлено: 12 фев 2017, 01:35 
Свой человек

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 137
А если не секрет "от МК отходите", на на что переходите ?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB