|
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
|
|
Что за тип данных uint32_t?30.07.2019, 22:34. Показов 40480. Ответов 171
Метки нет (Все метки)
0
|
|
| 30.07.2019, 22:34 | |
|
Ответы с готовыми решениями:
171
Как побитово скопировать uint32_t в float, минуя при этом выделения uint32_t в оперативную память
Скажите пожалуйста, что это за тип данных?! |
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
|||||||||
| 16.08.2019, 10:36 | |||||||||
|
Впрочем, даже если бы он делал то, что вы думаете - изредка таки приходится передавать формат из переменной. Вот например семисегментный индикатор. У него есть выводы сегментов A, B, C,...H. Чтобы вывести на него цифру, надо зажечь определенную комбинацию сегментов. Например, для '4' это B, C, F, G. Для ускорения доступа введем ограничение, что все выводы относятся к одному порту (запись значения в порт это 1 инструкция, а запись всех битов независимо - 32 инструкции, иногда это критично). Совсем хорошо было бы расположить сегменты последовательно, скажем, A=PA0, B=PA1, C=PA2 и т.д. но разводку чипа иногда делают достаточно... экзотично. А разводку индикатора делают ...экзотичной... вообще всегда. Поэтому для удобства разводки платы бывает удобно поменять некоторые выводы местами, например, A=PB2, B=PB0, C=PB7 и т.д. Надеюсь, проблема понятна? Так вот, как дать понять универсальной библиотеке какие именно биты порта соответствуют определенным сегментам. На практике задача еще сложнее
Во-первых, индикаторы бывают с общим катодом и с общим анодом, то есть включаются либо подачей лог.1 либо лог.0, это тоже хорошо бы сообщить библиотеке.
Во-вторых, семисегментники по отдельности используются редко. Чаще они сдвоенные, строенные, счетверенные и т.д. При этом выводы сегментов А у всех разрядов соединены на одну линию, выводы В - не другую и т.д. А выбор разряда осуществляется выбором общего анода/катода. Собственно для отображения числа используется так называемая динамическая индикация. То есть включаем первый разряд, выставляем число. Ждем какое-то время. Включаем следующий разряд, выставляем число. Снова ждем. И т.д. Таким образом, помимо сегментов надо еще управлять разрядами. Тоже с выбором полярности! Если интересно, в свое время я эту задачу решил. Могу даже кинуть ссылку, правда она на другой форум, но что-нибудь придумаю. Естественно, код на Си с кучей макросов. . Я смотрю, тема разработки под конроллеры вам не близка. Так может, не стоит продолжать? Мне-то не сложно, но вы рискуете наговорить глупостей, просто по незнанию матчасти.
0
|
|||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||
| 16.08.2019, 11:45 | |||||
|
Что до предупреждений, их наличие зависит от настроек компилятора. И да, я компилировал код "сунь main в printf". Как уже было сказано выше, без pedantic ключа все прекрасно компилируется и запускается. Как написано на каждом заборе, AVR-компилятор отображает порты на восьмибитовые переменные PORTA, PORTB, PORTC... Этой абстракции уже более чем достаточно чтобы свести вашу задачу к PORTB=bitMask, где каждому биту маски соответствует ножка на плате. Задача формирования самой маски никакого отношения к портам уже не имеет. Когда вы спрашивали про абстракции, я полагал что вам оператора присваивания мало и нужно навесить на порт десяток библиотечных функций. Вот от этого ответ и танцует - пилите объект Port, пихайте в него свои библиотечные функции, если обращаться к объекту напрямую неудобно, делайте ссылки. А если вам надо просто читать-писать единичные биты, ну так дальше дергайте PORTB напрямую.
0
|
|||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
||||||||||||||||
| 16.08.2019, 15:53 | ||||||||||||||||
|
Уже по объявлению void myScanf(char*,...)=delete; видно что они не имеет ни малейшего шанса скомпилироваться.Если С++ заявляет совместимость с Си, он вынужден тащить совместимость с Си и всеми библиотеками Си. Ну либо вкручивать эмуляцию, но это уже совсем извращение. выглядеть может, например, так
Но вот сам принцип именования линий я использую именно в таком виде: порт, бит, уровень Сразу скажу, макросы по использованию такой записи достаточно неочевидные в написании. Вот в использовании все просто:
0
|
||||||||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||||||
| 16.08.2019, 16:51 | ||||||||||
|
Ну а VLA взялось из "тащить все возможные рудименты". Извините, "рудиментов" помимо Flexible Array Members и VLA не вспоминается. Ну, разве что еще невозможность копировать массивы.
0
|
||||||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
|||||||||||||||||
| 17.08.2019, 01:18 | |||||||||||||||||
|
Компилятор не будет мешать вам выстрелить себе в ногу. Максимум - предупредит, что это опасно. Но если вы ему прямым текстом сказали "стреляй!" - он выполнит. Вот в Си он активно используется и вписывается в идеологию, поэтому там рудиментом не является. Еще в вашем примере явное дублирование настроек плюс ошибка копипаста: объявляете сегменты на 5 и 6, а маску на 0 и 5, причем в другом месте. Хорошо, для примера код вывода любой цифры. На макросах, естественно:
Я не ожидаю, что вы оцените ассемблерный код, в который развернется мой вариант. Но посмотрите хотя бы на Си-шный: насколько вам, как непрофессионалу, будет легко в нем разобраться, исправить какую-то ошибку или изменить настройки. Сумеете ли, хотя бы теоретически (практически без знания архитектуры шансов все равно нет), написать более понятный код без существенной потери быстродействия? На всякий случай: код опять демонстрационный, в реальности он посложнее, хотя общая суть и читаемость примерно те же. Добавлено через 14 минут P.S. Ладно спор на счет классификации языков: это классический спор о вкусе фломастеров. Ладно спор о традициях именования типов и функций в Си (ну хз, вроде все факты на лицо. Уж насколько использование подобных сокращений удобно или хотя бы оправдано - другой вопрос). Я даже могу понять упорство в отстаивании позиции "С++ лучше Си" (хотя этот спор как бы не в тему). Но вам действительно интересно спорить по поводу программирования контроллеров? Причем не имея опыта в этой области, исходя только из общих соображений. Нет, если действительно интересно, и вы таким образом узнаете что-то новое (я тоже так иногда делаю) то это можно только поддерживать. Если же это спор ради спора, то лучше все-таки прекратить.
0
|
|||||||||||||||||
|
Неэпический
|
||||||
| 17.08.2019, 01:32 | ||||||
|
COKPOWEHEU, думаю, на C++ можно без проблем добиться такого синтаксиса и asm-код будет аналогичным:
(1 << SHIFT) | (...) и ~(x) возьмут на себя шаблоны.В результате будет такой же массив с теми же кодами.
0
|
||||||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
||
| 17.08.2019, 01:39 | ||
|
Поэтому на самом деле говорить о точной совместимости не приходится. P.S. Что интересно, Clang в C++ пытается реализовывать полноценные С-шные VLA. То есть в С++ коде VLA-расширения ведут себя по-разному в Clang и в GCC.
0
|
||
|
Неэпический
|
|||||||
| 17.08.2019, 02:05 | |||||||
0
|
|||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||
| 17.08.2019, 02:27 | ||||||
|
И да, про то что в Си якобы есть контроль типов заливал отнюдь не я. Теперь пошли на попятную "ну да, можно double* в const char* совать, без явного каста типов. Но это не баг, а фича"? Ассемблерный код оценил. 11 тактов из 13 уходят на "инлайн для слабаков". 10 байт памяти уходят на "атрибут PROGMEM для слабаков". Выкидываем массив в RO флеш, инлайним функцию и не морочим голову. Добавлено через 4 минуты
0
|
||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
|||||||||
| 17.08.2019, 10:16 | |||||||||
|
Из 13 тактов 6 уходит на сохранение-восстановление регистров если инлайн по какой-то причине невозможен (это же прямым текстом написано было). Еще 4 такта - на вычисление адреса (какой смысл писать функцию, умеющую выводить только одну цифру, где и кому это может понадобиться?!). Еще 2 - чтение из ОЗУ в регистр (если использовать PROGMEM, инструкция ld заменится на lpm и станет на 1 такт длиннее) и 1 на вывод в регистр.
0
|
|||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||
| 17.08.2019, 11:54 | ||||||
|
Как уже указывали выше, противоречие в том что стандарт Си запрещает Implicit conversions const char*->int*. Только, сишный компилятор по умолчанию игнорирует сишный же стандарт. И прекрасно кушает даже преобразования 123->указатель. Воистину, чудесен язык, носителям которого требуется подобное. Делать ldi ZH, high( seg_codes ) по каждому чиху не нужно. Компилятор должен стремиться один раз сохранить адрес в регистр (их же там целых 32). Делать adc ZH, r1 тем более не нужно. Выровняйте адрес на 8 байт и никаких переносов в старший разряд не будет. (Что будет если к ZL прибавят больше восьмерки? Выход за границы массива и UB). Ну ок, три такта на все про все. Суть то не меняется - оптимизацию кода включать надо.
0
|
||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
|||||||||||
| 17.08.2019, 14:10 | |||||||||||
|
Плюс подобные функции часто встраивают в прерывания, где компилятор не имеет права полагаться на какие-либо регистры.
0
|
|||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||||||
| 17.08.2019, 16:23 | |||||||||||
|
Возвращаясь к теме - чтобы перепутать scanf и sscanf достаточно банальной опечатки. Нормальные люди вводят в код ограничения, от опечаток страхующие. Например, "называйте функцию str_scanf". Сишникам же вместо этого отключают даже те ограничения, которые в их же стандарте и прописаны. Например, запрет неявного каста double*->int*. Ну и что это, если не банальное ретроградство?
По восьмерке - в голове перепутались семь сегментов и десять цифр. Ок, поправка, выравнивание на 16 байт. И уже десять раз было сказано: совместимости ни в ту, ни в другую сторону никто не обещал. Более-менее работающая совместимость это личная блажь авторов gcc.
0
|
|||||||||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
||||||||||
| 17.08.2019, 18:41 | ||||||||||
|
0
|
||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||
| 17.08.2019, 19:46 | |||||
|
Ну вот только не надо заливать что сишники ни разу не искали в своем коде опечатку в одну букву. Плюсовики искали, перловцы искали, одни сишники никогда опечаток не делают. Структуры нужны чтоб не писать class{public:. Сырые указатели нужны для реализации потрохов умных. Без них придется все в компилятор захардкорить. Собственно, и VLA пытаются утащить по соображениям удобства плюсовиков. Но пока не утащили, его поддержка - блажь конкретного компилятора. Разжевано. Каждая цифра кодируется 32-битовой маской. Реально в моем примере используются только 16 бит соответствующих PORTA и PORTC. То есть, половина маски не используется. Поэтому, маска пилится на четыре байта, которые распихиваются по отдельным массивам. Потом приходит компилятор, говорит "массивом для PORTB никто не пользуется" и выкидывает его. Экономия! А вот как вы тоже самое провернете на макросах я слабо себе представляю. Разве что ручками будете объявлять четыре практически идентичных массива.
0
|
|||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
||||||||||
| 18.08.2019, 09:31 | ||||||||||
|
На счет "разума программиста" не трактуйте неправильно. В Си совершенно законно неявное приведение типов вроде int *arr=malloc(10), язык предполагает что программист может делать все, что компилятор способен распознать. Хочет использовать хаки, основанные на UB - его право. Более высокоуровневые языки обычно бьют за такое по рукам.RAMPX, RAMPY, RAMPZ это вообще не РОН, это регистры ввода-вывода, в них даже нельзя писать напрямую. Что ж, вперед, продемонстрируйте как будете пихать адрес куда-то кроме регистровых пар X, Y, Z. Что-то вроде ld r2, r16.
0
|
||||||||||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
||
| 18.08.2019, 09:36 | ||
void * -> int *, которое в Си действительно "совершенно законно". Неявные приведения иных несвязанных указательных типов в Си совершенно НЕзаконны. Не ясно, о каком "компилятор способен распознать" вы ведете речь.
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||
| 18.08.2019, 10:04 | |||||
|
По классам да, надо было уже признать идею private по умолчанию неудачной и сделать наоборот. Но пока не признали, выкручиваемся с struct. По умным указателям - если их захардкорить, потеряется возможность кастомные аллокаторы прикрутить. И нет, хаки основанные на UB незаконны ни в Си, ни в плюсах. Вы путаете UB с implementation defined.
0
|
|||||
|
4150 / 2728 / 433
Регистрация: 09.09.2017
Сообщений: 12,099
|
||||||||||||||
| 18.08.2019, 17:41 | ||||||||||||||
|
под "способен распознать" я имею в виду "способен скомпилировать", не важно с каким количеством UB и прочего. Переполнение целых - UB или ID? Как бы незаконно, но полезно Разыменование нулевого указателя?
0
|
||||||||||||||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,416
|
|||
| 18.08.2019, 18:16 | |||
void * присутствует в С с самого первого стандарта. "void* не было вообще" - это эпоха туманных эскизов языка.В языке С попытка неявное приведения несвязанных типов указателей - это constraint violation, сразу грубая ошибка. Никакого "способен распознать" или "способен скомпилировать" тут нет и быть не может. Как уже было не раз сказано, ни в С, ни в С++, не допускается неявное приведение таких указателей.
0
|
|||
| 18.08.2019, 18:16 | |
|
std::vector<int> Что это за тип данных?
Восьмибитный тип переменной (что за тип, но не BYTE и не CHAR?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|