WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Базилюк
Нашел транзистор. Понюхал.
Сообщения: 159
Зарегистрирован: Чт сен 19, 2024 19:18:28

Re: WinAvr в вопросах и ответах

Сообщение Базилюк »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4630662#p4630662"][
чему равно ab ? .[/uquote]
Изображение
Зависит от компилятора. Неявное приведение типов.

Здесь видно, что для записи и извлечения чисел a и b используется 16-битные инструкции, а для сохранения результата их суммирования - уже 32-битная инструкция.
Изображение
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: WinAvr в вопросах и ответах

Сообщение OKF »

При чём здесь компилятор! Переполнение разрядности uint16_t происходит. Всего то.
Базилюк
Нашел транзистор. Понюхал.
Сообщения: 159
Зарегистрирован: Чт сен 19, 2024 19:18:28

Re: WinAvr в вопросах и ответах

Сообщение Базилюк »

Причем здесь переполнение разрядности, если у Си вообще нет разрядности :) Он работает с типами и он способен производить неявные преобразования типов, даже если оба слагаемых равны 0. Если в языке определен тип бОльшей разрядности, то он и будет использован в результате. Вот тут видно:

Изображение Изображение

В изначальном примере переменная результата суммирования имеет тип uint32_t, а значит, именно в нее будет записываться сумма и без обрезки на 16 битах. Если происходит обрезка, значит, компилятор какой-то "особенный".
Вероятно, автор того пример имел ввиду другой случай - когда переменная слева представлена в меньшей разрядности, чем промежуточные результаты вычислений аргументов. То есть, когда выражение имеет несколько операторов, и промежуточный результат операций превышает разрядность переменной итогового результата. Да, тут может случиться обрезка, и возможно придется явно указывать тип промежуточных вычислений.

[uquote="Jack_A",url="/forum/viewtopic.php?p=4630560#p4630560"]е - интересно бы послушать того, кто выдаёт новые сложные изделия хотя бы раз в месяц - ему точно без С++ никак :) - и где этот рынок, заваленный льющимся потоком новьём?
r][/uquote]
А послушайте новости по зомбоящику на Соловей-ТВ :) Будете поражены до глубины души, что страна развивается быстрее, чем Китай и "всё чисто российское" выдается "на гора", всё просто завалено "чисто российскими разработками"! :) И это просто чудо - ведь всего за два года из полного "ничего", из чисто потребительской страны она стала самой технологичной и быстроразвивающейся. Ура, товарищи, ура! (тут всем надо кидать шапки вверх и аплодировать несмолкаемо!)
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: WinAvr в вопросах и ответах

Сообщение OKF »

Дядя. Ты суммируешь 16-битное целое без знака с другим таким же. А уже потом результат приводишь к 32-битному целому без знака. ВСЕ компиляторы работают по стандарту. Нет каких то "особенных".
Базилюк
Нашел транзистор. Понюхал.
Сообщения: 159
Зарегистрирован: Чт сен 19, 2024 19:18:28

Re: WinAvr в вопросах и ответах

Сообщение Базилюк »

Но я ведь показал результат на скринах выше - два числа используют инструкцию ldrh для 16-биного числа, но результат сохраняется инструкцией str для 32-битного числа.
Ну и какие проблемы? Поведение компилятора задается его настройками. Там прописаны диапазоны чисел для типов, а используемые инструкции зависят от разрядности вычислительного ядра.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: WinAvr в вопросах и ответах

Сообщение Jack_A »

Спойлер[uquote="OKF",url="/forum/viewtopic.php?p=4630729#p4630729"]своё время нужно беречь. Ведь можешь ещё чем то полезным заняться.)[/uquote]
А я ничего больше не умею :) Паять и писать программы. Можно - выращиванием картошки, но это для меня - серпом по гландам. :o
Изображение
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: WinAvr в вопросах и ответах

Сообщение Adrift »

[uquote="OKF",url="/forum/viewtopic.php?p=4630861#p4630861"]Ты суммируешь 16-битное целое без знака с другим таким же. А уже потом результат приводишь к 32-битному целому без знака. ВСЕ компиляторы работают по стандарту. Нет каких то "особенных".[/uquote]
Стандарт говорит компилятору все что не влазит в int сначала приводить к int:

Код: Выделить всё

uint16_t a = 40000, b = 30000;
uint32_t ab = (int)a + (int)b;
На ПК и 16/32-х битных мк int 32-х битный и естественно получится 70000, а на 8-ми битках int может быть 16-ти битным, тогда uint16_t в int16_t не помещается и компилятор оставляет типы без изменений.
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: WinAvr в вопросах и ответах

Сообщение OKF »

[uquote="Jack_A",url="/forum/viewtopic.php?p=4630897#p4630897"]
СпойлерА я ничего больше не умею :) Паять и писать программы. Можно - выращиванием картошки, но это для меня - серпом по гландам. :o
[/uquote]
Так а я картошку и не имел ввиду.) Паять и писать, но только другое, для себя.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение ARV »

int может быть разным, но int16_t обязан быть 16-битным даже на однобитных процессорах (если таковые C99 поддерживают, конечно)!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Базилюк
Нашел транзистор. Понюхал.
Сообщения: 159
Зарегистрирован: Чт сен 19, 2024 19:18:28

Re: WinAvr в вопросах и ответах

Сообщение Базилюк »

...так же как и инт32 - 32-битным! :) Это - фиксированные типы. Там в описаниях этих интов в компиле дается конкретный диапазон чисел для каждого типа
Аватара пользователя
Eats
Потрогал лапой паяльник
Сообщения: 309
Зарегистрирован: Сб фев 18, 2023 21:51:01
Откуда: Санкт-Петербург

Re: WinAvr в вопросах и ответах

Сообщение Eats »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4630517#p4630517"]Обычно хватает ЯВУ и знаний, как тот или иной код должен работать и как он компилится в асм.[/uquote]Ой, вот только не надо называть Си языком высокого уровня! Во-первых, он и создавался-то как язык среднего уровня, типа весьма продвинутого макроассемблера. А во-вторых, как только вы пишете что-то типа:

Код: Выделить всё

PORTB |= 0x03 компилится (-О1) в три команды - IN, ORI, OUT
PORTB |= 0x01;PORTB |= 0x02; - в две команды SBI
так сразу же опускаетесь на низкий уровень, ибо не ЯВУшное это дело — ногами портов дрыгать. Программист должен понимать и постоянно помнить, что PORTB — это не переменная в ОЗУ, а какая-то периферия, и в ней может быть всё не так, как в ОЗУ, вплоть до того, что записал одно, а считал другое.
Я уже говорила - Язык Си - он мазохист. И получает цифровое удовольствие, когда программист стреляет себе в ногу.
uint16_t a = 40000, b = 30000;
uint32_t ab = a + b;
чему равно ab ?
Правильный ответ : 4464.
Ну так правильный же! Что в нём неправильного? Надо просто помнить, что это язык среднего уровня. :-)

[uquote="OKF",url="/forum/viewtopic.php?p=4630556#p4630556"]Беда в том что Асм он под конкретную архитектуру, его не перенесёшь куда то.[/uquote]Just_Fluffy, вот здесь товарищ правильно пишет. И строчки типа PORTB|=0x01 — они тоже под конкретную архитектуру, их не перенесёшь куда-то, скажем, даже на соседнюю тиньку 24/44/84, у которой порта В почти нет (от него всего один бит, и он не только не нулевой , но даже и не первый), а есть только А. На самом деле этот вопрос чуть шире, чем градация между низким и высоким уровнем. Я как-то давненько говорил, что задачи бывают вычислительные и управленческие. Для вычислительных прекрасно подходят ЯВУ. А вот управленческие задачи на ЯВУ не решить без прибегания к низкому уровню, отсюда и костыли в Си для дрыгания ногами периферии. Отсюда же и радостные лозунги о предпочтительности ассемблера.

[uquote="Adrift",url="/forum/viewtopic.php?p=4630958#p4630958"]Стандарт говорит компилятору все что не влазит в int сначала приводить к int:[/uquote]Нет в стандарте фразы "все что не влазит". Напротив, стандарт предписывает вести вычисления с равным приоритетом слева направо, то есть начинать с типа первого операнда, а он в примере Белой и Пушистой 16-разрядный. А у неё ещё и второй такой же. А приведение к типу результата будет выполняться только после завершения вычисления всей строки, когда результат уже будет усечён до 16 разрядов, то есть от него останется 4 тыщи с копейками. Поэтому переопределение типа (uint32_t) в этом примере достаточно дать только первому операнду. А вот расширения стандарта были всякие разные, их всех и не упомнишь.
Всего доброго.
Евгений.
Базилюк
Нашел транзистор. Понюхал.
Сообщения: 159
Зарегистрирован: Чт сен 19, 2024 19:18:28

Re: WinAvr в вопросах и ответах

Сообщение Базилюк »

Хех. Даже на Питоне можно ногами дрыгать, нет на это политического запрета.
На языке Си дрыгание ногами организовано как запись числа по указанному адресу. Поэтому, разделять языки на уровни только по признаку доступа к ногам или иной периферии МК - не совсем верно.
Вот например, ардуинщики (С++) используют digitalWrite - библиотечную функцию. Можно сказать, что С++ это язык высокого уровня, так? Хорошо, а если я напишу на этом же языке напрямую доступ к регистру портов - тогда это уже будет язык какого уровня - низкого?
костыли в Си для дрыгания ногами периферии
А что там не так? Например, в ARM-архитектуре вообще нет инструкций для прямого управления портами или иной периферией. Там вообще хоть на ассемблере, хоть на С/С++, хоть на Питоне - но сначала будет чтение из указанного адреса (ldr) во внутренние регистры ядра, затем модификация, и только затем запись (str) в указанный адрес.
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: WinAvr в вопросах и ответах

Сообщение Adrift »

[uquote="Eats",url="/forum/viewtopic.php?p=4631180#p4631180"]Нет в стандарте фразы "все что не влазит". Напротив, стандарт предписывает вести вычисления с равным приоритетом слева направо, то есть начинать с типа первого операнда, а он в примере Белой и Пушистой 16-разрядный. А у неё ещё и второй такой же. А приведение к типу результата будет выполняться только после завершения вычисления всей строки, когда результат уже будет усечён до 16 разрядов, то есть от него останется 4 тыщи с копейками. Поэтому переопределение типа (uint32_t) в этом примере достаточно дать только первому операнду. А вот расширения стандарта были всякие разные, их всех и не упомнишь.[/uquote]
Нет, к int типы приводятся до выполнения операции сложения, иначе бы 250 + 10, если оба числа были типа uint8_t, дало в результате 4, а не 260. Если первый операнд привести к uint32_t, то второй тоже приведется к нему же, т.к. типы должны быть одинаковыми, а int, даже 32-х битный, уже uint32_t и к нему приводить нельзя. Так что не обязательно к uint32_t приводить именно первый операнд, достаточно чтобы такого типа был хотя бы один из них.

Добавлено after 6 minutes 21 second:
[uquote="Базилюк",url="/forum/viewtopic.php?p=4631221#p4631221"]Например, в ARM-архитектуре вообще нет инструкций для прямого управления портами или иной периферией.[/uquote]
В новых кортексах кастомные инструкции есть, например, в Raspberry Pi Pico 2 к паре M33 прикрутили три вида таких инструкций, в том числе как раз для портов )
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: WinAvr в вопросах и ответах

Сообщение Jack_A »

Ну вот. Смотрю я, какие страсти творятся на этом Си, притянутом к маааленьким камешкам МК, и говорю себе: "Никого ни в чём убеждать не надо, бо бесполезно. Но как ты всё-таки был прав, старина Жека, когда выбрал для программирования язык, на котором получишь hex, исполняющий то, что ты написал, а не что взбрело в бо'шку компайлеру, причём даже без Warning".
Аминь. "Я ухожу" ©
Спойлер... из темы - не подумайте плохого :)
А то ещё ++ (классы, обекты, наследование для МК, у которого ОЗУ... 128байт. Ой, щаз упаду от смеха, держите меня трое :shock: )
Изображение
Базилюк
Нашел транзистор. Понюхал.
Сообщения: 159
Зарегистрирован: Чт сен 19, 2024 19:18:28

Re: WinAvr в вопросах и ответах

Сообщение Базилюк »

Давно я не держал в руках микроконтроллера со 128 байтами ОЗУ :) В последний раз это было лет... ну лет эдак 15 назад наверно :) ага, я помню ПИК16Ф84А у которого было вообще насколько на минималках всё, что акромя ассемблера ничего и не надо было. Но жизть то худо-бедно вперед идет, нынешние объемы ОЗУ в 1000 и более раз больше.

Напрасны у вас предубеждения, что на Си что-то не то получается. Навалять фигни на том же ассемблере куда проще, чем на Си.
Я вот знавал одного господина, который хотел прогать STM32H743 непременно на ассемблере. Си он не хотел изучать по религиозным причинам. Ну и че, за пару лет мучений осилил лишь немного по таймерам и какой-то мелочи еще.

И между прочим, если "си-плюсами" правильно пользоваться, то оверхэда в потреблении оперативки не возникает. Ведь не обязательно же под любой чих создавать объект. А классы - это по большей части объединение в одну группу. То есть, когда не создаешь объект класса и когда все методы в классе - static, то лишняя оперативка и не потребляется.
OKF
Это не хвост, это антенна
Сообщения: 1385
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: WinAvr в вопросах и ответах

Сообщение OKF »

[uquote="Базилюк",url="/forum/viewtopic.php?p=4631392#p4631392"]Давно я не держал в руках микроконтроллера со 128 байтами ОЗУ :) В последний раз это было лет... ну лет эдак 15 назад наверно :) ага, я помню ПИК16Ф84А у которого было вообще насколько на минималках всё, что акромя ассемблера ничего и не надо было. Но жизть то худо-бедно вперед идет, нынешние объемы ОЗУ в 1000 и более раз больше.[/uquote]
Это предубеждение, что для мелких камней нужен только Асм. Не так давно писал человеку на Си для PIC10F200. Фигня конечно. Пару кнопок, светодиод, пассивный пьезо(!), сон(!). Просматривая листинг, подумал что на Асме было бы тоже самое.)

Код: Выделить всё

//Program space        used   1AEh (   430) of   200h words   ( 84.0%)
//Data space           used    15h (    21) of    18h bytes   ( 87.5%)
Базилюк
Нашел транзистор. Понюхал.
Сообщения: 159
Зарегистрирован: Чт сен 19, 2024 19:18:28

Re: WinAvr в вопросах и ответах

Сообщение Базилюк »

Ну в древности я такое на ассемблере делал и покомпактнее. Вообще, в те далекие годы люди умудрялись упихивать в дохленькие ПИКи столько функционала. Когда ножек у МК было мало, мультиплексировали светодиоды с кнопками, интерфейс ЖКД WH1602 с клавиатурой, светодиоды во встречно-параллельном подключении.
Сейчас я навряд ли буду страдать такими извратами. А некоторое время назад, до полупроводникового кризиса 2020-го, дешевле было взять STM32F030F4, чем PIC10F200. Цена СТМ-ки даже в дорогущем Чип-Дипе была 40 руб, а с алиэкспресса так и того дешевле.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: WinAvr в вопросах и ответах

Сообщение Jack_A »

Не надо меня агитироваь за См - я его нежно люблю :) и написа'л на нём много, пока не пересел на Дельфи. Но - на РС-шном. МК мне было как-то сподручней на асме.
Впрочем, это - уже история :o
Изображение
Базилюк
Нашел транзистор. Понюхал.
Сообщения: 159
Зарегистрирован: Чт сен 19, 2024 19:18:28

Re: WinAvr в вопросах и ответах

Сообщение Базилюк »

Да без проблем! Полностью поддерживаю ваше направление и горячо рекомендую ассемблер для STM32H743, потому что это прям то, что доктор прописал! :)
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: WinAvr в вопросах и ответах

Сообщение Jack_A »

Иронию оценил. Увы, хоть я и выписал себе от Алика ST-шную тестовую платку и ST-Link, но заняться этим уже силов нет, и стимула. Добить бы как-то оставшиеся Тиньки, и то было бы хорошо.
Изображение
Ответить

Вернуться в «AVR»