Easyelectronics.ru

Электроника для всех
Текущее время: 20 июл 2018, 09:28

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 01 апр 2018, 21:27 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3426
Откуда: Кемеровская область, Киселевск
Ну понятно что вещи эти платформо зависимые. с учетом этого и надо программировать. Просто сам подход непонятный зачем понадобилось инкрементировать массив

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 01 апр 2018, 22:10 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1606
Откуда: Харьков
Oxford писал(а):
Ну понятно что вещи эти платформо зависимые. с учетом этого и надо программировать. Просто сам подход непонятный зачем понадобилось инкрементировать массив

Просто хотел чтоб не парится с переполнением, к примеру не хватило 4 байта добавил пятый, скомпилировал и все хорошо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 01 апр 2018, 23:14 
Старожил

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 444
Откуда: Ханты-Мансийск
Цитата:
h4lf писал(а):
judchin писал(а):
Где-то читал, что по умолчанию в ARM использует прямой порядок байт
это точно? и в каких именно ARM? Я вроде бы обратный в кортексах-М наблюдал... (но они могут оба)


В STM32 (проверил f0, f1, f4, f7, h7) только little-endian. Смотрим RM


Вложения:
stm32f0_memory.png
stm32f0_memory.png [ 68.89 Кб | Просмотров: 447 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 02 апр 2018, 00:28 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 846
ну значит в STM32 только обратный порядок байт (а порядок слов в uint64? это вроде уже должно от компилятора зависеть), а само ядро поддерживает оба. Из M3 Guide:
Цитата:
Both little endian and big endian memory systems are supported.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 02 апр 2018, 00:34 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3681
Откуда: г. Липецк
Вообще то инкрементится не массив, а указатель на него. Без разницы на каком языке.
А уж попадет ли он в физическую память, это забота программиста.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 02 апр 2018, 00:39 
Старожил

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 444
Откуда: Ханты-Мансийск
anakost писал(а):
Вообще то инкрементится не массив, а указатель на него. Без разницы на каком языке.
А уж попадет ли он в физическую память, это забота программиста.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 02 апр 2018, 01:02 
Старожил

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 444
Откуда: Ханты-Мансийск
h4lf писал(а):
ну значит в STM32 только обратный порядок байт (а порядок слов в uint64? это вроде уже должно от компилятора зависеть), а само ядро поддерживает оба. Из M3 Guide:
Цитата:
Both little endian and big endian memory systems are supported.

а ниже в том же документе написано, что за endiannes отвечает 15 бит регистра AIRCR (Application Interrupt and Reset Control Register), который доступен только для чтения. Т.е. как я понимаю производитель самой микросхемы определяет порядок, и поменять его нельзя.
Кстати в Reference Manual описание этого регистра я не нашел.
Show Application Interrupt and Reset Control Register

Я бы с uint64_t все же не заморачивался. Все равно процессор будет делать программный инкремент за два этапа. Мой последний вариант по скорости работы не должен уступить. А в плюсах нет потери трех дополнительных байт для массива и не надо выравнивать массив по границе 8 байт. (Keil по умолчанию выравнивает по границе 4 байта)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 02 апр 2018, 01:17 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2470
Откуда: Санкт-Петербург
Чисто для смеха:
a[4] += !(a[3] += !(a[2] += !(a[1] += !(a[0]++))));
Вроде даже компилятор должен соптимизировать до упора (во всяком случае, на 8-битках, на 32 вряд ли сообразит объединить в группы по 32 разряда)... Количество байт правится по вкусу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 02 апр 2018, 01:55 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 846
judchin писал(а):
Кстати в Reference Manual описание этого регистра я не нашел.
это потому, что он относится к ядру и искать его надо не в RM, а в PM (в PM0215 он точно есть).
judchin писал(а):
а ниже в том же документе написано, что за endiannes отвечает 15 бит регистра AIRCR (Application Interrupt and Reset Control Register), который доступен только для чтения. Т.е. как я понимаю производитель самой микросхемы определяет порядок, и поменять его нельзя.
странно, а у меня написано, что
Цитата:
Indicates endianness for data: 1 for big endian (BE8)
and 0 for little endian. This can only change after a reset.
Т.е. само ядро позволяет менять (но конечно не на ходу), но да, эта возможность зависит от производителя, я так понял. Я смотрю в "The Definitive Guide to the ARM® Cortex-M3 Second Edition"


Вложения:
endianess.png
endianess.png [ 38.86 Кб | Просмотров: 412 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 02 апр 2018, 12:54 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 100
Делаем union массива с uint64. инкремент "целой части" union примерно так ull = (ull + 1) % 0xFFFFFFFFFFull. Порядок байт важен при одновременной прямой работе с "массивной" частью union. Если это нужно - заполняем массив с учётом endiannes - либо от нижних индексов к высшим либо наоборот.
PS: Если-бы 1.04 ещё не прошло можно было-бы и через bit field предложить. ;-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 28 май 2018, 22:35 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 452
Я думаю как то так:
Код:
union data {
     unsigned a:40;
     uint8_t b[5];
} __attribute__ ((packed));

b[0] = b[1] = b[2] = b[3] = b[4] = 0;
a++;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу Пред.  1, 2

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


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

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


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

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

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