Ограничение значения целого числа с насыщением в STM32

Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Ограничение значения целого числа с насыщением в STM32

Сообщение Сергей Саныч »

Вопрос по программированию МК серии STM32.
Задача: Имеется переменная (int16 со знаком). Может принимать значения от -2^12 до 2^12-1 (-2048..2047). Но иногда по ряду причин может и выскакивать за эти пределы, что недопустимо.
Поэтому требуется вписать ее в соответствующие рамки (ограничить с насыщением).
Конечно, можно написать что-то вроде

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

if(a > 2047) a = 2047;
if(a < -2048) a = -2048;
либо

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

a = (a > 2047) ? 2047 : a;
a = (a < -2048) ? -2048 : a;
Но всё это выглядит как-то дубовато, учитывая наличие в МК команд SSAT и USAT, которые делают это за один такт.
Как заставить компилятор их использовать? Может, макросы какие есть? Или придется осваивать ассемблерные вставки?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение MX_Master »

если не планируете портировать код на другие платформы, то ASM вставка будет самой быстрой
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Сергей Саныч »

Вопрос снимается, ибо
selected processor does not support Thumb mode `ssat r0,#12,r0'
:(
Чудес не бывает. Бывают фокусы.
Аватара пользователя
N1X
Мастер
Сообщения: 3653
Зарегистрирован: 16 фев 2015, 21:19
Репутация: 1645
Настоящее имя: Владимир
Откуда: Беларусь, Гомель
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение N1X »

Сергей Саныч писал(а):ибо
А если на разных регистрах? Вообще странно, т.к. команда есть и в Cortex-M3 и в Cortex-M4...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Сергей Саныч »

N1X писал(а):Вообще странно, т.к. команда есть и в Cortex-M3 и в Cortex-M4...
У меня Cortex-M0 (STM32F072).
Чудес не бывает. Бывают фокусы.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение MX_Master »

Пора, Сергей Саныч.. пора переходить хотя б на M3 :hehehe:
Там как раз 4 таймера. На трёх побегут аппаратные шаги ;)
Аватара пользователя
N1X
Мастер
Сообщения: 3653
Зарегистрирован: 16 фев 2015, 21:19
Репутация: 1645
Настоящее имя: Владимир
Откуда: Беларусь, Гомель
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение N1X »

В М3 один таймер - SysTick, все остальное к нему отношения не имеет :)
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение MX_Master »

окей F1
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Сергей Саныч »

MX_Master писал(а):Пора, Сергей Саныч.. пора переходить хотя б на M3
М0 выбран по экономическим соображениям (предполагаются довольно крупные партии, где цена каждого компонента имеет значение).
Ведущаяся разработка не имеет никакого отношения к ранее упоминавшемуся контроллеру (хотя тот тоже на STM32F072), а также к ШД и к ЧПУ.
MX_Master писал(а):окей F1
Вот как раз переездом с F100 и занимаюсь.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение MX_Master »

Чем будет заниматься будущее устройство? Минимальные требования какие? Посмотрел сейчас таблицу цен. Дешевле F072 (М0) встречаются не только М3, но и М4. Конечный выбор зависит от задачи.
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение uralpt »

пока ТС не отвечает, могу спросить у профи -
мне очень редко нужен STM, обычно ардуинки выше крыши,
но зачем такие сложности? Пишу в Кейле, он отлично понимает Си... в нем достаточно операторов для округления... потом в Кубе определяю лапки, шью и все работает. И работает так как надо, ведь все базовые функции есть в библиотеках, а они писались как раз для оптимизации? И вряд ли получится оптимизировать код лучше, чем это сделал производитель, написав HAL? И если это можно сделать за один такт, то наверняка эта функция уже прописана.
Наверное, что-то не понимаю?
ps. для понимания моего опыта нужно сказать, что смог поморгать светодиодиком, ЦАП-АЦП-ШИМ, но вот с LCD образовался непобедимый затык. Не нашлось достойной библиотеки :)) забил.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение MX_Master »

Перемещаться можно и пешком :) Но все предпочитают автотранспорт
Vitalii
Опытный
Сообщения: 163
Зарегистрирован: 08 янв 2017, 05:18
Репутация: 77
Настоящее имя: Vitaliy
Откуда: Россия, Ульяновск
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Vitalii »

Когда производитель писал HAL, он не знал вашу задачу... HAL это дополнительный слой абстракции для упрощения, а любое упрощение связанно с потерей, в случае с миром микроконтроллеров - потерей контроля и эффективности.
Банальная программа написанная на HAL может занимать значительно больше места в контроллере чем на ASM.
Мы живём в мире, когда все закидывают мощьностями, современный браузер "съедает" оперативной памяти в 2.5 Гб, к слову на моем первом компьютере этой памяти всего было 256 Мб.
Но для критических задач, люди которые могут писать для микроконтроллеров правильно, ещё долго будут востребованными.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Сергей Саныч »

uralpt писал(а):И работает так как надо, ведь все базовые функции есть в библиотеках, а они писались как раз для оптимизации? И вряд ли получится оптимизировать код лучше, чем это сделал производитель, написав HAL?
Это не так. Производитель стремился к универсальности и переносимости, принося в жертву быстродействие и компактность кода. Не говоря уже о том, что многие hal-функции Cube несут отпечаток "индусского" стиля программирования. Лично я пользуюсь Кубом только для начальной инициализации - она у STM достаточно заморочная.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Сергей Саныч »

MX_Master писал(а):Чем будет заниматься будущее устройство? Минимальные требования какие? Посмотрел сейчас таблицу цен. Дешевле F072 (М0) встречаются не только М3, но и М4. Конечный выбор зависит от задачи.
Как-нибудь в другой раз. Мало ли что где встречается. Выбор сделан по комплексу параметров, не только по цене.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Serg »

Vitalii писал(а):Мы живём в мире, когда все закидывают мощьностями, современный браузер "съедает" оперативной памяти в 2.5 Гб, к слову на моем первом компьютере этой памяти всего было 256 Мб.
Мы живем в мире, где рабочее время квалифицированного специалиста, в данном случае программиста, стоит дороже любых железок.

Надеюсь никто не думает, что например для работы обычного USB 4G модема требуются ресурсы двух ядер с отдельным Linux'ом на каждом? А оно именно на таких ресурсах и работает! :)
Сергей Саныч писал(а):Не говоря уже о том, что многие hal-функции Cube несут отпечаток "индусского" стиля программирования.
Кстати, а можно пример этого стиля из HAL?..
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2857
Откуда: Тюмень
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Сергей Саныч »

UAVpilot писал(а):Мы живем в мире, где рабочее время квалифицированного специалиста, в данном случае программиста, стоит дороже любых железок.
я, конечно, не столь квалифицированный спец, но "борьба" с библиотеками hal отнимает у меня куда больше времени, чем написание и отладка собственных функций. Которые делают именно и только то, что мне надо и значительно быстрее.
UAVpilot писал(а):Кстати, а можно пример этого стиля из HAL?..
А как еще назвать ситуацию, когда простая инициализация периферии занимает порядка десятка кбайт?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
MX_Master
Мастер
Сообщения: 7460
Зарегистрирован: 27 июн 2015, 19:45
Репутация: 3086
Настоящее имя: Михаил
Откуда: Алматы
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение MX_Master »

Кубик и HAL - не про экономию ресурсов, они про экономию времени начинающего прогера.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение Serg »

Сергей Саныч писал(а):я, конечно, не столь квалифицированный спец, но "борьба" с библиотеками hal отнимает у меня куда больше времени, чем написание и отладка собственных функций.
А что там сложного-то? Она очень грамотно и логично организована. Я вон даже документацию на неё не изучал, просто просмотрел по диагонали пяток начальных страниц и описание пары функций. Там по названиям переменных и функций всё про них замечательно понять можно. Я и сам таким методом пользуюсь.
Сергей Саныч писал(а):А как еще назвать ситуацию, когда простая инициализация периферии занимает порядка десятка кбайт?
А не надо называть, надо пользоваться плодами цивилизации - современными мощными и не дорогими МК, компиляторами с сильным интеллектом в плане оптимизации, библиотеками, позволяющими без изменений компилить код под любой МК из серии.
И всё таки хотелось бы какой-то конкретный пример, чтоб можно было разобрать "по косточкам". Да и про десятки килобайт полагаю преувеличение, разве что с включенными отладкой и printf'ами. Во всяком случае у меня в нескольких проектах полностью на HAL так не получается. Например инициализация UART в F1xx - код занимает 262 байта (по карте памяти) с выключенной оптимизацией. Причем для инициализации всех имеющихся UART будет использовать этот-же самый код.
MX_Master писал(а):Кубик и HAL - не про экономию ресурсов, они про экономию времени начинающего прогера.
Любого прогера. Чем профессиональнее прогер, тем дороже стоит его время. Например если я в каком-то пректе TI буду пользоваться не рекомендованными библиотеками/фрейворками, а писать оптимальный код "на регистрах", то у меня просто не примут работу, даже если весь код проекта будет написан только мной - просто потому, что кому-то другому в нём будет сложнее разобраться.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Ограничение значения целого числа с насыщением в STM32

Сообщение selenur »

UAVpilot писал(а):Мы живем в мире, где рабочее время квалифицированного специалиста, в данном случае программиста, стоит дороже любых железок.
Вот тут соглашусь, в последние годы часто приходится опираться на критерий быстрой разработки с применением готовых библиотек, фреймворков, и если в результате работа устраивает заказчика, то ему все равно, как написан код (мне конечно хотелось-бы сделать всё куда оптимальнее, и д.р.) но за это время никто платить не хочет, или ждать дольше, пока будет сделано оптимально.

Когда программирование было лишь хобби я старался экономить каждый байтик, но в реальной работе такое просто невозможно...
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Ответить

Вернуться в «Оффтоп»