|
Размер unsigned int или int Keil4.5 |
|
|
|
Jun 2 2012, 11:17
|
Участник

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

|
Добрый день, коллеги. Месяц использую LPC1768 и только сейчас с "ужасом" заметил, что под переменные unsigned int и int компилятор отводит по 4 байта. Использую среду Keil 4.5 и постоянно плююсь даже не по причине ее скудости, а по причине неудобности документации на нее и компилятор. Как установить "нормальный" размер этих типов данных размером в 2 байта? И второй вопрос. Я был уверен, что в Cortex-M3 отсутствует необходимость выравнивания разноразмерных типов данных. Об этом написано тутТем не менее, у себя в реале я этого не вижу. Если за однобайтовой переменной следует четырехбайтовая, то она все равно выравнивается по границе 32 разрядного слова, тоесть остается неиспользуемый промежуток в 3 байта. Что тут не так?
|
|
|
|
|
 |
Ответов
|
Jun 7 2012, 06:18
|
Участник

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

|
Цитата(andrewlekar @ Jun 7 2012, 07:45)  Ребята, я вас умоляю, не делайте так в рабочем коде. Придёт после вас человек и не поймёт нифига, что вы там наоптимизировали. А при чем тут придет и не поймет  Я беру к себе на работу только тех, кто способен понимать и разобраться. Тогда и Вы ответьте на вопрос: зачем тогда столько "фишек" и примочек в компиляторе? Вы этим не пользуетесь? Я пользуюсь. И максимально, что бы был максимально эффективный код, или максимально эффективное решение задачи или еще что-то в этом роде, но максимально эффективное. Почему публика привратно в основном понимает эту суть. если я спросил насчет упаковки переменных, почему -т о в основном у публики сложилось сразу впечатление, что я возьму тупо все данные упакую в кирпич. И начались советы по поводу эффективности такого использования и т.д. и т.п. Ребята, я не собираюсь так делать  Во всяком случае ко всему подряд и без разбора "на всякий случай". Просто иногда гдето-то в определенном месте в связи с определенными условиями нужно применить такой метод. И не более. Речь не идет о како-то глобальности. Если Вы не пользуетесь всеми инструментами, которые вам дает средство разработки, Вы либо невысокой квалификации специалист, либо не можете предложить самое эффективное решение задачи, что собственно тоже говорит о квалификации. Все, что правильно понимается и правильно применяется- никак не отражается на рабочем коде в подавляющем большенстве случаев. И почти все так называемые "глюки" контроллеров или среды - это глюки того, кто не в полной мере этим владеет. Низкая квалификация. Цитата(ViKo @ Jun 7 2012, 08:53)  Герберд Шилдт. Полный справочник по C. (в электронном виде не имею на русском языке, в книжке на русском еще понятнее). Page 144 - 145 Все правильно, спасибо за цитату  Теперь попытаюсь Вам концептуально разъяснить в чем дело. Язык С был создан в эпоху микропроцессоров, у которых память была сегментирована. Это процессоры чуть до Intel286 и 386 и в том числе эти процессоры. Так вот, что бы получить доступ к исполнительному адресу, нужно было еще опереровать с сегментным регистром. Вполне вероятно, что два массива по 10 байт оказались бы на границе сегмента. Физически это последовательные адреса, но вот логические уже нет. И тогда последовательное обращение к 20 байтам на самом деле бы привело не к обращению к двум последовательным массивам, а в пределах одного секмента 64кБ. Давайте жить реалиями сегняшнего дня. В основном все уже имеют дело с микроконтроллерами с линейным адресным пространством. В пределах этого пространства компилятор не занимается перестановкой переменных и оптимизацией их размещения, если на то нет особых инструкций, указаний и т. д. Тоесть, компилятор оптимизирует код с обязательным требованием сохранения его идентичности по функционалу исходному коду и не занимается оптимизацией памяти данных
|
|
|
|
|
Jun 7 2012, 07:22
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861

|
Цитата(TAutomatic @ Jun 7 2012, 10:18)  Давайте жить реалиями сегняшнего дня. В основном все уже имеют дело с микроконтроллерами с линейным адресным пространством. В пределах этого пространства компилятор не занимается перестановкой переменных и оптимизацией их размещения, если на то нет особых инструкций, указаний и т. д. Тоесть, компилятор оптимизирует код с обязательным требованием сохранения его идентичности по функционалу исходному коду и не занимается оптимизацией памяти данных С первой частью заявления не соглашусь. Пространство хоть и линейно, но это не гарантирует одинаковое время доступа и одинаковое количество инструкций для доступа в ряде случаев. Соответственно оптимизатор вполне может перетасовать данные, если это обоснованно и даст какой-то профит. Более того, при определенных настройках тот же GCC может перекладывать данные из секции .data в .bss
--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
|
|
|
|
|
Jun 7 2012, 08:16
|
Участник

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

|
Цитата(Dron_Gus @ Jun 7 2012, 10:22)  С первой частью заявления не соглашусь. Пространство хоть и линейно, но это не гарантирует одинаковое время доступа и одинаковое количество инструкций для доступа в ряде случаев. Соответственно оптимизатор вполне может перетасовать данные, если это обоснованно и даст какой-то профит.
Более того, при определенных настройках тот же GCC может перекладывать данные из секции .data в .bss Послушайте, чесговоря нет времени на такого рода диспут, но когда пишут совершенно непонятные для меня вещи, хочется всегда спросить: откуда вы это взяли?!!! Ну откуда вы взяли что время доступа может быть разны, если переменные размещаются в ОЗУ? Мы же не ведем речь о переменных и сразу о константах, которые размещаются в адресном пространстве кода? Ну я вот хочу знать того, чего не знаю. Покажите мне не на пальцах, а на конкретном примере. И еще, какие такие настройки компилера позволят две однородные переменные без инициализации на стадии линковки или обе с инициализацией, расположенные в одном программном модуле последовательно друг за другом разнести по разным секциям? Пожете показать, как Вы это делаете?
|
|
|
|
|
Jun 7 2012, 09:08
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(TAutomatic @ Jun 7 2012, 14:16)  Ну откуда вы взяли что время доступа может быть разны, если переменные размещаются в ОЗУ? Мы же не ведем речь о переменных и сразу о константах, которые размещаются в адресном пространстве кода? Ну я вот хочу знать того, чего не знаю. Покажите мне не на пальцах, а на конкретном примере. Позвольте встрять?  Кроме внутреннего ОЗУ, к контроллеру может быть подцеплено внешнее, с другим временем доступа. Даже если есть только внутреннее, то в некоторых процессорах есть разные RAM с разным быстродействием, расположенные на разных шинах. Или, к примеру: внутреннее ОЗУ разбито на банки (непрерывно расположенные в адресном пространстве), и одна из переменных - в одном банке, другая - в другом, а во второй банк как раз идёт интенсивное DMA (с приоритетом контроллера DMA) - здесь разница во времени доступа может быть ОЧЕНЬ большой. Даже если банки ОЗУ в несмежных областях - линкер (при соотв. опциях) может разбить выходные секции на неск. несмежных областей. Для каких-то областей может быть включено/выключено кеширование. Или (типичная оптимизация IAR for ARM): функция работает с неск. статическими переменными - IAR заносит в некий базовый регистр указатель на область памяти, которая включает большую часть этих переменных и адресует их через этот базовый + смещение, а одна переменная - далеко от остальных, разрядности смещения не хватает и для обращения к ней компилятору приходится вставлять доп. инструкции загрузки адреса этой переменной в регистр - соответственно доступ к этой переменной будет дольше. Перетасовка переменных оптимизатором - это большой гуд. ПО не должно привязываться к взаимному расположению переменных (конечно это не касается внутри структур).
|
|
|
|
|
Jun 7 2012, 09:40
|
Участник

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

|
Цитата(jcxz @ Jun 7 2012, 12:08)  Позвольте встрять?  Кроме внутреннего ОЗУ, к контроллеру может быть подцеплено внешнее, с другим временем доступа. Даже если есть только внутреннее, то в некоторых процессорах есть разные RAM с разным быстродействием, расположенные на разных шинах. Или, к примеру: внутреннее ОЗУ разбито на банки (непрерывно расположенные в адресном пространстве), и одна из переменных - в одном банке, другая - в другом, а во второй банк как раз идёт интенсивное DMA (с приоритетом контроллера DMA) - здесь разница во времени доступа может быть ОЧЕНЬ большой. Даже если банки ОЗУ в несмежных областях - линкер (при соотв. опциях) может разбить выходные секции на неск. несмежных областей. Перетасовка переменных оптимизатором - это большой гуд. ПО не должно привязываться к взаимному расположению переменных (конечно это не касается внутри структур). Рабята, ну я Вас умаляю...  Ну Вы что, читать не умеете? Я же ясно написал, две переменные, одинаково объявленные и т.д. Вам, что, все это пустой звук или есть просто желание поговорить?  Две переменные, объявленные одинаково уж точно не могут попасть одна во внутреннее ОЗУ, вторая во внешнее, что бы иметь разное время доступа. Ну кто этого не понимает? Все остальное и комментировать нет смысла. Вам уже aaarrr выше в этой теме написал - размещение переменных, в том числе акккуратность этого размещения- это задача программиста. И я в этом согласен. А вот аккуратностью размещения кода занимается компилятор, а затем оптимизатор. Об этом даже в Википедии почитать можно. Там нет ни слова об оптимизации данных. Судя по-всему, никто из написавших выше никогда не проверял, что же реально компилятор и оптимизатор творят с переменными, но, основываясь на каком то внутреннем понимании этого процесса  пытается утверждать, что так оно и есть.
|
|
|
|
Сообщений в этой теме
TAutomatic Размер unsigned int или int Keil4.5 Jun 2 2012, 11:17 ohmjke Размер int равен размеру машинного слова. В данном... Jun 2 2012, 11:27 TAutomatic Цитата(ohmjke @ Jun 2 2012, 14:27) Размер... Jun 2 2012, 11:33 aaarrr Цитата(TAutomatic @ Jun 2 2012, 15:17) Ка... Jun 2 2012, 11:30 TAutomatic Цитата(aaarrr @ Jun 2 2012, 14:30) Исполь... Jun 2 2012, 11:43  TAutomatic Получается, все же есть в <stdint.h> - short... Jun 2 2012, 11:47  aaarrr Цитата(TAutomatic @ Jun 2 2012, 15:43) Пе... Jun 2 2012, 11:49   TAutomatic Цитата(aaarrr @ Jun 2 2012, 14:49) А вы п... Jun 2 2012, 11:53    prottoss Цитата(TAutomatic @ Jun 2 2012, 17:53) По... Jun 2 2012, 12:20     TAutomatic Цитата(prottoss @ Jun 2 2012, 15:20) Вам ... Jun 2 2012, 12:36    aaarrr Цитата(TAutomatic @ Jun 2 2012, 15:53) По... Jun 2 2012, 12:43     TAutomatic Цитата(aaarrr @ Jun 2 2012, 15:43) Сами р... Jun 2 2012, 12:54      scifi Цитата(TAutomatic @ Jun 2 2012, 16:54) Но... Jun 2 2012, 18:40     prottoss Цитата(aaarrr @ Jun 2 2012, 18:43) Кодuns... Jun 2 2012, 12:56      aaarrr Цитата(prottoss @ Jun 2 2012, 16:56) Наве... Jun 2 2012, 13:05       prottoss Цитата(aaarrr @ Jun 2 2012, 19:05) Нет. К... Jun 2 2012, 13:10       TAutomatic Цитата(aaarrr @ Jun 2 2012, 16:05) Нет. К... Jun 5 2012, 05:51 ohmjke ЦитатаМашинное слово — машиннозависимая и платформ... Jun 2 2012, 11:37 ohmjke Написали же, 2 байтовый это short. Jun 2 2012, 11:45 ohmjke short он не из stdint.h, а просто является частью ... Jun 2 2012, 11:50 ivainc1789 Не хотел создавать новую тему... Можно ли спросить... Jun 2 2012, 12:21 ohmjke Цитата(ivainc1789 @ Jun 2 2012, 16:21) Не... Jun 2 2012, 12:26 prottoss Цитата(ivainc1789 @ Jun 2 2012, 18:21) За... Jun 2 2012, 12:30 aaarrr Char может быть расположен как угодно - на скорост... Jun 2 2012, 13:28 prottoss Цитата(aaarrr @ Jun 2 2012, 19:28) Char м... Jun 2 2012, 13:50  aaarrr Цитата(prottoss @ Jun 2 2012, 17:50) С пе... Jun 2 2012, 14:02   prottoss Цитата(aaarrr @ Jun 2 2012, 20:02) Объясн... Jun 2 2012, 14:23 esaulenka Я бы предложил не заниматься всякой фигнёй. Особен... Jun 5 2012, 11:40 TAutomatic Цитата(esaulenka @ Jun 5 2012, 14:40) Я б... Jun 5 2012, 16:57 IgorKossak Цитата(esaulenka @ Jun 5 2012, 14:40) Кей... Jun 5 2012, 20:08  Dron_Gus Цитата(IgorKossak @ Jun 6 2012, 00:08) Ке... Jun 5 2012, 20:24 TAutomatic Цитата(esaulenka @ Jun 5 2012, 14:40) Я б... Jun 6 2012, 04:53  ViKo Цитата(TAutomatic @ Jun 6 2012, 07:53) На... Jun 6 2012, 05:33   TAutomatic Цитата(ViKo @ Jun 6 2012, 08:33) Вставил ... Jun 6 2012, 06:22    demiurg_spb Цитата(TAutomatic @ Jun 6 2012, 09:22) вд... Jun 6 2012, 06:30    IgorKossak Цитата(TAutomatic @ Jun 6 2012, 09:22) А ... Jun 6 2012, 06:44    ViKo Цитата(TAutomatic @ Jun 6 2012, 09:22) А ... Jun 6 2012, 08:43     TAutomatic Цитата(ViKo @ Jun 6 2012, 11:43) У переме... Jun 6 2012, 12:31      ViKo Цитата(TAutomatic @ Jun 6 2012, 15:31) Я ... Jun 6 2012, 13:05       TAutomatic Цитата(ViKo @ Jun 6 2012, 16:05) Я провер... Jun 6 2012, 13:48 ViKo Проверил с тремя __packed. Так я не пробовал.
... Jun 6 2012, 14:01 TAutomatic Цитата(ViKo @ Jun 6 2012, 17:01) Проверил... Jun 6 2012, 14:07     Dron_Gus Цитата(jcxz @ Jun 7 2012, 13:08) Позвольт... Jun 7 2012, 09:20      demiurg_spb Цитата(TAutomatic @ Jun 7 2012, 12:40) Дв... Jun 7 2012, 10:02      jcxz Цитата(TAutomatic @ Jun 7 2012, 15:40) Ра... Jun 7 2012, 10:10      AHTOXA Цитата(TAutomatic @ Jun 7 2012, 15:40) Ра... Jun 7 2012, 10:17       TAutomatic Цитата(AHTOXA @ Jun 7 2012, 13:17) Может,... Jun 7 2012, 10:27  ViKo Цитата(TAutomatic @ Jun 7 2012, 09:18) Вс... Jun 7 2012, 10:26   TAutomatic Цитата(ViKo @ Jun 7 2012, 13:26) Вы не о ... Jun 7 2012, 10:33    ViKo Цитата(TAutomatic @ Jun 7 2012, 13:33) См... Jun 7 2012, 10:58     TAutomatic Цитата(ViKo @ Jun 7 2012, 13:58) При любо... Jun 7 2012, 16:40 ViKo Герберд Шилдт. Полный справочник по C. (в электрон... Jun 7 2012, 05:53 andrewlekar ЦитатаА при чем тут придет и не поймет rolleyes.gi... Jun 7 2012, 06:40 TAutomatic Цитата(andrewlekar @ Jun 7 2012, 09:40) В... Jun 7 2012, 07:04 exeron Какой упоротый попался... Вам уже цитату из Шилдта... Jun 7 2012, 10:33 KRS Вообще то для того что бы расположить глобальные о... Jun 7 2012, 20:19 TAutomatic Цитата(KRS @ Jun 7 2012, 23:19) Вообще то... Jun 8 2012, 04:44  demiurg_spb Цитата(TAutomatic @ Jun 8 2012, 07:44) Со... Jun 8 2012, 07:11  KRS Цитата(TAutomatic @ Jun 8 2012, 08:44) Ед... Jun 8 2012, 09:44 esaulenka Дурацкий вопрос: union-то зачем? Вполне достаточно... Jun 8 2012, 09:59 KRS Цитата(esaulenka @ Jun 8 2012, 13:59) Дур... Jun 8 2012, 12:19 brag В Cortex-M3 выравнивание можно сказать, всегда нуж... Jun 9 2012, 05:44 TAutomatic Цитата(brag @ Jun 9 2012, 08:44) Я всегда... Jun 9 2012, 15:47 brag Вешаем обработчик на исключение UsageFault, а в не... Jun 9 2012, 16:34 TAutomatic Цитата(brag @ Jun 9 2012, 19:34) Вешаем о... Jun 9 2012, 18:34
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|