Easyelectronics.ru

Электроника для всех
Текущее время: 19 ноя 2018, 10:26

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

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

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

_________________
RADIOWOLF.RU


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

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

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


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

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


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


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

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


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

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


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

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

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


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

Зарегистрирован: 07 фев 2011, 21:00
Сообщения: 459
Откуда: Ханты-Мансийск
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
Сообщения: 2527
Откуда: Санкт-Петербург
Чисто для смеха:
a[4] += !(a[3] += !(a[2] += !(a[1] += !(a[0]++))));
Вроде даже компилятор должен соптимизировать до упора (во всяком случае, на 8-битках, на 32 вряд ли сообразит объединить в группы по 32 разряда)... Количество байт правится по вкусу.


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

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 851
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 Кб | Просмотров: 509 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как инкрементить данные в массиве на С
СообщениеДобавлено: 02 апр 2018, 12:54 
Заглядывает иногда

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


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

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 502
Я думаю как то так:
Код:
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 часов


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

Сейчас этот форум просматривают: KEA


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

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

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