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

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

Сообщение Сергей Саныч » 11 ноя 2019, 08:30

Вопрос по программированию МК серии 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, которые делают это за один такт.
Как заставить компилятор их использовать? Может, макросы какие есть? Или придется осваивать ассемблерные вставки?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 8841
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2766
Медальки:

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

Сообщение MX_Master » 11 ноя 2019, 08:47

если не планируете портировать код на другие платформы, то ASM вставка будет самой быстрой
Аватара пользователя
MX_Master
Мастер
 
Сообщения: 5856
Зарегистрирован: 27 июн 2015, 19:45
Откуда: Алма-Ата
Репутация: 2609
Медальки:
Настоящее имя: Миша

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

Сообщение Сергей Саныч » 11 ноя 2019, 09:06

Вопрос снимается, ибо
selected processor does not support Thumb mode `ssat r0,#12,r0'
:(
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 8841
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2766
Медальки:

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

Сообщение N1X » 11 ноя 2019, 09:25

Сергей Саныч писал(а):ибо

А если на разных регистрах? Вообще странно, т.к. команда есть и в Cortex-M3 и в Cortex-M4...
Аватара пользователя
N1X
Мастер
 
Сообщения: 3548
Зарегистрирован: 16 фев 2015, 21:19
Откуда: Беларусь, Гомель
Репутация: 1608
Настоящее имя: Владимир

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

Сообщение Сергей Саныч » 11 ноя 2019, 09:35

N1X писал(а):Вообще странно, т.к. команда есть и в Cortex-M3 и в Cortex-M4...
У меня Cortex-M0 (STM32F072).
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 8841
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2766
Медальки:

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

Сообщение MX_Master » 11 ноя 2019, 11:12

Пора, Сергей Саныч.. пора переходить хотя б на M3 :hehehe:
Там как раз 4 таймера. На трёх побегут аппаратные шаги ;)
Аватара пользователя
MX_Master
Мастер
 
Сообщения: 5856
Зарегистрирован: 27 июн 2015, 19:45
Откуда: Алма-Ата
Репутация: 2609
Медальки:
Настоящее имя: Миша

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

Сообщение N1X » 11 ноя 2019, 11:16

В М3 один таймер - SysTick, все остальное к нему отношения не имеет :)
Аватара пользователя
N1X
Мастер
 
Сообщения: 3548
Зарегистрирован: 16 фев 2015, 21:19
Откуда: Беларусь, Гомель
Репутация: 1608
Настоящее имя: Владимир

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

Сообщение MX_Master » 11 ноя 2019, 11:22

окей F1
Аватара пользователя
MX_Master
Мастер
 
Сообщения: 5856
Зарегистрирован: 27 июн 2015, 19:45
Откуда: Алма-Ата
Репутация: 2609
Медальки:
Настоящее имя: Миша

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

Сообщение Сергей Саныч » 11 ноя 2019, 12:30

MX_Master писал(а):Пора, Сергей Саныч.. пора переходить хотя б на M3
М0 выбран по экономическим соображениям (предполагаются довольно крупные партии, где цена каждого компонента имеет значение).
Ведущаяся разработка не имеет никакого отношения к ранее упоминавшемуся контроллеру (хотя тот тоже на STM32F072), а также к ШД и к ЧПУ.
MX_Master писал(а):окей F1
Вот как раз переездом с F100 и занимаюсь.
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 8841
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2766
Медальки:

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

Сообщение MX_Master » 11 ноя 2019, 12:52

Чем будет заниматься будущее устройство? Минимальные требования какие? Посмотрел сейчас таблицу цен. Дешевле F072 (М0) встречаются не только М3, но и М4. Конечный выбор зависит от задачи.
Аватара пользователя
MX_Master
Мастер
 
Сообщения: 5856
Зарегистрирован: 27 июн 2015, 19:45
Откуда: Алма-Ата
Репутация: 2609
Медальки:
Настоящее имя: Миша

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

Сообщение uralpt » 11 ноя 2019, 20:14

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

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

Сообщение MX_Master » 11 ноя 2019, 21:03

Перемещаться можно и пешком :) Но все предпочитают автотранспорт
Аватара пользователя
MX_Master
Мастер
 
Сообщения: 5856
Зарегистрирован: 27 июн 2015, 19:45
Откуда: Алма-Ата
Репутация: 2609
Медальки:
Настоящее имя: Миша

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

Сообщение Vitalii » 11 ноя 2019, 21:16

Когда производитель писал HAL, он не знал вашу задачу... HAL это дополнительный слой абстракции для упрощения, а любое упрощение связанно с потерей, в случае с миром микроконтроллеров - потерей контроля и эффективности.
Банальная программа написанная на HAL может занимать значительно больше места в контроллере чем на ASM.
Мы живём в мире, когда все закидывают мощьностями, современный браузер "съедает" оперативной памяти в 2.5 Гб, к слову на моем первом компьютере этой памяти всего было 256 Мб.
Но для критических задач, люди которые могут писать для микроконтроллеров правильно, ещё долго будут востребованными.
Vitalii
Опытный
 
Сообщения: 128
Зарегистрирован: 08 янв 2017, 05:18
Откуда: Россия, Ульяновск
Репутация: 70
Настоящее имя: Vitaliy

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

Сообщение Сергей Саныч » 11 ноя 2019, 21:24

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

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

Сообщение Сергей Саныч » 11 ноя 2019, 21:33

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

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

Сообщение UAVpilot » 11 ноя 2019, 21:38

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

Мы живем в мире, где рабочее время квалифицированного специалиста, в данном случае программиста, стоит дороже любых железок.

Надеюсь никто не думает, что например для работы обычного USB 4G модема требуются ресурсы двух ядер с отдельным Linux'ом на каждом? А оно именно на таких ресурсах и работает! :)

Сергей Саныч писал(а):Не говоря уже о том, что многие hal-функции Cube несут отпечаток "индусского" стиля программирования.

Кстати, а можно пример этого стиля из HAL?..
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
UAVpilot
Мастер
 
Сообщения: 20306
Зарегистрирован: 17 апр 2012, 14:58
Откуда: Москва
Репутация: 4856
Заслуга: c781c134843e0c1a3de9
Медальки:
Настоящее имя: Сергей

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

Сообщение Сергей Саныч » 11 ноя 2019, 22:05

UAVpilot писал(а):Мы живем в мире, где рабочее время квалифицированного специалиста, в данном случае программиста, стоит дороже любых железок.
я, конечно, не столь квалифицированный спец, но "борьба" с библиотеками hal отнимает у меня куда больше времени, чем написание и отладка собственных функций. Которые делают именно и только то, что мне надо и значительно быстрее.
UAVpilot писал(а):Кстати, а можно пример этого стиля из HAL?..
А как еще назвать ситуацию, когда простая инициализация периферии занимает порядка десятка кбайт?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Сергей Саныч
Мастер
 
Сообщения: 8841
Зарегистрирован: 30 май 2012, 14:20
Откуда: Тюмень
Репутация: 2766
Медальки:

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

Сообщение MX_Master » 11 ноя 2019, 22:13

Кубик и HAL - не про экономию ресурсов, они про экономию времени начинающего прогера.
Аватара пользователя
MX_Master
Мастер
 
Сообщения: 5856
Зарегистрирован: 27 июн 2015, 19:45
Откуда: Алма-Ата
Репутация: 2609
Медальки:
Настоящее имя: Миша

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

Сообщение UAVpilot » 11 ноя 2019, 22:56

Сергей Саныч писал(а):я, конечно, не столь квалифицированный спец, но "борьба" с библиотеками hal отнимает у меня куда больше времени, чем написание и отладка собственных функций.

А что там сложного-то? Она очень грамотно и логично организована. Я вон даже документацию на неё не изучал, просто просмотрел по диагонали пяток начальных страниц и описание пары функций. Там по названиям переменных и функций всё про них замечательно понять можно. Я и сам таким методом пользуюсь.

Сергей Саныч писал(а):А как еще назвать ситуацию, когда простая инициализация периферии занимает порядка десятка кбайт?

А не надо называть, надо пользоваться плодами цивилизации - современными мощными и не дорогими МК, компиляторами с сильным интеллектом в плане оптимизации, библиотеками, позволяющими без изменений компилить код под любой МК из серии.
И всё таки хотелось бы какой-то конкретный пример, чтоб можно было разобрать "по косточкам". Да и про десятки килобайт полагаю преувеличение, разве что с включенными отладкой и printf'ами. Во всяком случае у меня в нескольких проектах полностью на HAL так не получается. Например инициализация UART в F1xx - код занимает 262 байта (по карте памяти) с выключенной оптимизацией. Причем для инициализации всех имеющихся UART будет использовать этот-же самый код.

MX_Master писал(а):Кубик и HAL - не про экономию ресурсов, они про экономию времени начинающего прогера.

Любого прогера. Чем профессиональнее прогер, тем дороже стоит его время. Например если я в каком-то пректе TI буду пользоваться не рекомендованными библиотеками/фрейворками, а писать оптимальный код "на регистрах", то у меня просто не примут работу, даже если весь код проекта будет написан только мной - просто потому, что кому-то другому в нём будет сложнее разобраться.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
UAVpilot
Мастер
 
Сообщения: 20306
Зарегистрирован: 17 апр 2012, 14:58
Откуда: Москва
Репутация: 4856
Заслуга: c781c134843e0c1a3de9
Медальки:
Настоящее имя: Сергей

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

Сообщение selenur » 12 ноя 2019, 09:59

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

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

Когда программирование было лишь хобби я старался экономить каждый байтик, но в реальной работе такое просто невозможно...
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Аватара пользователя
selenur
Почётный участник
Почётный участник
 
Сообщения: 4297
Зарегистрирован: 21 авг 2013, 19:44
Откуда: Новый Уренгой
Репутация: 1510
Медальки:
Настоящее имя: Сергей


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

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

Зарегистрированные пользователи: 1240, aftaev, arisov77, Андрей Г., Bing [Bot], Brynet83, calabr, dimedved, eekot, Enot_1, Google [Bot], Leo_1943, MGG, mikehv, Okser, Prav, svm, tsurika, Vitalii, Yandex [bot]

Reputation System ©'