реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
TAutomatic
сообщение Jun 2 2012, 12:36
Сообщение #16


Участник
*

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



Цитата(prottoss @ Jun 2 2012, 15:20) *
Вам же выше уже говорили про __packed. Создаете структуру с требуемым набором данных. Сообщаете компилятору, что нужно ее упаковать и готово.

Подождите, я Вам также и возразил. Пакед относится к структурам, а не к базовым типам данных. А Вы утверждаете ниже, что и к базовым типам тоже применимо. А приводите в пример все же структуры. Давайте отделим мух от котлет. Со структурами все понятно.
Базовые типы упаковать как можно? есть у вас ответ? Если у меня есть в разных программных модулях глобальные переменные, но в пределах видимости определенных модулей, на кой их мне сносить в одну гигантскую структуру? Это что- удобно? А вот что бы переменные были упакованы - тоже необходимо. Эффективность работы с такими переменными-второй вопрос. Первый - размер в ОЗУ.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2012, 12:43
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(TAutomatic @ Jun 2 2012, 15:53) *
Подскажите метод, как упаковать?
Код
unsigned char A;
unsigned long B;
unsigned char C;

что бы получилось занятыми в памяти не 12 байт, а 6 байт?
Буду весьма благодарен.

Сами решили не пробовать даже?
Код
unsigned char a;
__packed unsigned long b;
unsigned char c;
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 2 2012, 12:54
Сообщение #18


Участник
*

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



Цитата(aaarrr @ Jun 2 2012, 15:43) *
Сами решили не пробовать даже?
Код
unsigned char a;
__packed unsigned long b;
unsigned char c;

Дело не в том, что решил или нет. Дело в том, что я не на работе. А на домашнем компе рабочих программ принципиально не имею. Но в первый рабочий день обязательно испробую. Но меня чисто теоретически гложат смутные сомнения, что дает этот квалификатор применимо к одной строчке? В моем представлении, это должна быть какая-то либо глобальная директива на всю программу, либо на программный модуль, либо на некую секцию данных. Только тогда он будет работать. Но если вы утверждаете, остается попробовать и убедиться....
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 2 2012, 12:56
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Jun 2 2012, 18:43) *
Код
unsigned char a;
__packed unsigned long b;
unsigned char c;
Наверное все же
Код
__packed unsigned char a;
unsigned long b;
__packed  unsigned char c;
?
Хотя я сам такой ерундой не баловался sm.gif


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2012, 13:05
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Jun 2 2012, 16:56) *
Наверное все же

Нет. Какой смысл паковать char, если он и так упакован по определению?

Цитата(TAutomatic @ Jun 2 2012, 16:54) *
Но меня чисто теоретически гложат смутные сомнения, что дает этот квалификатор применимо к одной строчке?

Позволит разместить переменную без выравнивания. Глобально подобные вещи не практикуются, т.к. такой подход просто убьет производительность.
Аккуратно размещать данные, чтобы не было перерасхода на padding'и, программист должен самостоятельно.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 2 2012, 13:10
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Jun 2 2012, 19:05) *
Нет. Какой смысл паковать char, если он и так упакован по определению?
Я почему то думал, что компилятор два "char" ('a' и 'c') упакует в одно 32-бит слово, а 'b' поместит в другое.

Но вот работа с этими самыми 'a' и 'c' - это очевидно - будет достаточно медленна.


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2012, 13:28
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Char может быть расположен как угодно - на скорости это не скажется. А вот short, int и т.п. лучше выравнивать, что компилятор и делает по умолчанию.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 2 2012, 13:50
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Jun 2 2012, 19:28) *
Char может быть расположен как угодно - на скорости это не скажется. А вот short, int и т.п. лучше выравнивать, что компилятор и делает по умолчанию.
Стоп-стоп. Что то я Вас не понимаю... Зачем выравнить 'int' если он по умолчанию и так ляжет в 32-бит слово??? То же самое относится к типу 'long'. Для 32-бит систем эти типы одинаковы по размерности.
А вот как раз с 8/16-бит переменными ('char' и 'short') сложности по производительности.
Допустим, вы объявили три переменные трех разных типов:
Код
__packed char a;
__packed short b;
__packed long c;

С переменной 'c' и так все ясно, она 32-бит и компилятор положит ее в память по выровненному 32-бит адресу.
С переменными 'а' и 'c' начинаются сложности. Компилятор положит их в 32-бит ячейку вместе. Т.е. у одной из переменных, в зависимости от решения компилятора будет не выровненный адрес. У какой - не известно sm.gif Все зависит от интеллекта компилятора... Возможно, я заблуждаюсь?

Цитата(aaarrr @ Jun 2 2012, 19:28) *
Char может быть расположен как угодно - на скорости это не скажется.

Код
__paced short a;
__packed char i;

for(i = 0; i++; i < MAXCYCLE)
{  
   ....
}

Интересно, скажется ли на производительности цикла то, в каком байте 32-бит слова будет расположена переменная 'i'? В младшем из 4-х байтов или в 3-ем?


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 2 2012, 14:02
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(prottoss @ Jun 2 2012, 17:50) *
С переменной 'c' и так все ясно, она 32-бит и компилятор положит ее в память по выровненному 32-бит адресу.

Нет, ведь мы позволили разместить ее как угодно (__packed).

Цитата(prottoss @ Jun 2 2012, 17:50) *
С переменными 'а' и 'c' начинаются сложности. Компилятор положит их в 32-бит ячейку вместе. Т.е. у одной из переменных, в зависимости от решения компилятора будет не выровненный адрес. У какой - не известно sm.gif Все зависит от интеллекта компилятора... Возможно, я заблуждаюсь?

Объясните мне, как у char'а размерностью один байт может быть не выравнен адрес?
Если вы объявили переменную как __packed, компилятор по определению работает с ней как с не выравненной, несмотря на реальный адрес.

Цитата(prottoss @ Jun 2 2012, 17:50) *
Интересно, скажется ли на производительности цикла то, в каком байте 32-бит слова будет расположена переменная 'i'? В младшем из 4-х байтов или в 3-ем?

Разумеется, нет.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 2 2012, 14:23
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(aaarrr @ Jun 2 2012, 20:02) *
Объясните мне, как у char'а размерностью один байт может быть не выравнен адрес?
Все, от перегрева на солнце, я погнал. sm.gif Извините. Вы, безусловно, были правы.


--------------------
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 2 2012, 18:40
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(TAutomatic @ Jun 2 2012, 16:54) *
Но меня чисто теоретически гложат смутные сомнения, что дает этот квалификатор применимо к одной строчке?

Чтобы сомнения не терзали, предлагаю обращаться к первоисточнику. Понятно, что это скучно и не позволяет поговорить "за жизнь", но информацию даёт на ура.
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 5 2012, 05:51
Сообщение #27


Участник
*

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



Цитата(aaarrr @ Jun 2 2012, 16:05) *
Нет. Какой смысл паковать char, если он и так упакован по определению?


Позволит разместить переменную без выравнивания. Глобально подобные вещи не практикуются, т.к. такой подход просто убьет производительность.
Аккуратно размещать данные, чтобы не было перерасхода на padding'и, программист должен самостоятельно.

Первый мой рабочий день новой недели позволяет мне Вам сказать спасибо. Действительно, квалификатор пакует, убедился своими глазами. Честно говоря, как для меня, документация KEIL на свою среду не очень удобна. Наверно, дело привычки. Сразу в хелпе, что идет со средой не разобраться. На сайте кажется даже более удобно. Но это лично мое мнение, нет повода для споров. А вам, aaarrr еще раз спасибо.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jun 5 2012, 11:40
Сообщение #28


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Я бы предложил не заниматься всякой фигнёй. Особенно если нет твёрдого понимания, что вообще происходит.
__packed, конечно, экономит память, но заметно сказывается на объеме программы (на не-кортексах) и на производительности (на любых армах).

Кейл (в частности, 4.14 с включенным оптимизатором) достаточно догадлив, чтобы собрать данные в одну кучу.

Код
volatile char var_a;
volatile int var_b;
volatile char var_c;
int main(void)
{
    var_a = IOPIN0;
    var_b = IOPIN1;
    var_c = var_a + var_b;
    IOPIN0 = var_c;
    while (1);
}


Код
    var_a                                    0x40000000   Data           1  main.o(.data)
    var_c                                    0x40000001   Data           1  main.o(.data)
    var_b                                    0x40000004   Data           4  main.o(.data)


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение Jun 5 2012, 16:57
Сообщение #29


Участник
*

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



Цитата(esaulenka @ Jun 5 2012, 14:40) *
Я бы предложил не заниматься всякой фигнёй. Особенно если нет твёрдого понимания, что вообще происходит.
__packed, конечно, экономит память, но заметно сказывается на объеме программы (на не-кортексах) и на производительности (на любых армах).

Кейл (в частности, 4.14 с включенным оптимизатором) достаточно догадлив, чтобы собрать данные в одну кучу.


А я бы постеснялся давать такие советы. Я думаю, на "месте" виднее, "фигня или не фигня". Для кого-то аккуратность распределения памяти, а для кого-то фигня. Но давать такого рода советы вместо технических - отсутствие воспитания. А насчет твердого понимания - это наверно из соседней темы? :-)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 5 2012, 20:08
Сообщение #30


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(esaulenka @ Jun 5 2012, 14:40) *
Кейл (в частности, 4.14 с включенным оптимизатором) достаточно догадлив, чтобы собрать данные в одну кучу.
Код
    var_a                                    0x40000000   Data           1  main.o(.data)
    var_c                                    0x40000001   Data           1  main.o(.data)
    var_b                                    0x40000004   Data           4  main.o(.data)

Кейлу следовало бы быть более тщательным в своей "догадливости" и разместить данные в порядке: var_b, var_a, var_c. Т. е. без разрыва, который в Вашем примере имеет место быть.
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th June 2025 - 11:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016