Страница 1 из 1

Ограничение значения целого числа с насыщением в 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, которые делают это за один такт.
Как заставить компилятор их использовать? Может, макросы какие есть? Или придется осваивать ассемблерные вставки?

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

Добавлено: 11 ноя 2019, 08:47
MX_Master
если не планируете портировать код на другие платформы, то ASM вставка будет самой быстрой

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

Добавлено: 11 ноя 2019, 09:06
Сергей Саныч
Вопрос снимается, ибо
selected processor does not support Thumb mode `ssat r0,#12,r0'
:(

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

Добавлено: 11 ноя 2019, 09:25
N1X
Сергей Саныч писал(а):ибо
А если на разных регистрах? Вообще странно, т.к. команда есть и в Cortex-M3 и в Cortex-M4...

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

Добавлено: 11 ноя 2019, 09:35
Сергей Саныч
N1X писал(а):Вообще странно, т.к. команда есть и в Cortex-M3 и в Cortex-M4...
У меня Cortex-M0 (STM32F072).

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

Добавлено: 11 ноя 2019, 11:12
MX_Master
Пора, Сергей Саныч.. пора переходить хотя б на M3 :hehehe:
Там как раз 4 таймера. На трёх побегут аппаратные шаги ;)

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

Добавлено: 11 ноя 2019, 11:16
N1X
В М3 один таймер - SysTick, все остальное к нему отношения не имеет :)

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

Добавлено: 11 ноя 2019, 11:22
MX_Master
окей F1

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

Добавлено: 11 ноя 2019, 12:30
Сергей Саныч
MX_Master писал(а):Пора, Сергей Саныч.. пора переходить хотя б на M3
М0 выбран по экономическим соображениям (предполагаются довольно крупные партии, где цена каждого компонента имеет значение).
Ведущаяся разработка не имеет никакого отношения к ранее упоминавшемуся контроллеру (хотя тот тоже на STM32F072), а также к ШД и к ЧПУ.
MX_Master писал(а):окей F1
Вот как раз переездом с F100 и занимаюсь.

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

Добавлено: 11 ноя 2019, 12:52
MX_Master
Чем будет заниматься будущее устройство? Минимальные требования какие? Посмотрел сейчас таблицу цен. Дешевле F072 (М0) встречаются не только М3, но и М4. Конечный выбор зависит от задачи.

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

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

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

Добавлено: 11 ноя 2019, 21:03
MX_Master
Перемещаться можно и пешком :) Но все предпочитают автотранспорт

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

Добавлено: 11 ноя 2019, 21:16
Vitalii
Когда производитель писал HAL, он не знал вашу задачу... HAL это дополнительный слой абстракции для упрощения, а любое упрощение связанно с потерей, в случае с миром микроконтроллеров - потерей контроля и эффективности.
Банальная программа написанная на HAL может занимать значительно больше места в контроллере чем на ASM.
Мы живём в мире, когда все закидывают мощьностями, современный браузер "съедает" оперативной памяти в 2.5 Гб, к слову на моем первом компьютере этой памяти всего было 256 Мб.
Но для критических задач, люди которые могут писать для микроконтроллеров правильно, ещё долго будут востребованными.

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

Добавлено: 11 ноя 2019, 21:24
Сергей Саныч
uralpt писал(а):И работает так как надо, ведь все базовые функции есть в библиотеках, а они писались как раз для оптимизации? И вряд ли получится оптимизировать код лучше, чем это сделал производитель, написав HAL?
Это не так. Производитель стремился к универсальности и переносимости, принося в жертву быстродействие и компактность кода. Не говоря уже о том, что многие hal-функции Cube несут отпечаток "индусского" стиля программирования. Лично я пользуюсь Кубом только для начальной инициализации - она у STM достаточно заморочная.

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

Добавлено: 11 ноя 2019, 21:33
Сергей Саныч
MX_Master писал(а):Чем будет заниматься будущее устройство? Минимальные требования какие? Посмотрел сейчас таблицу цен. Дешевле F072 (М0) встречаются не только М3, но и М4. Конечный выбор зависит от задачи.
Как-нибудь в другой раз. Мало ли что где встречается. Выбор сделан по комплексу параметров, не только по цене.

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

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

Надеюсь никто не думает, что например для работы обычного USB 4G модема требуются ресурсы двух ядер с отдельным Linux'ом на каждом? А оно именно на таких ресурсах и работает! :)
Сергей Саныч писал(а):Не говоря уже о том, что многие hal-функции Cube несут отпечаток "индусского" стиля программирования.
Кстати, а можно пример этого стиля из HAL?..

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

Добавлено: 11 ноя 2019, 22:05
Сергей Саныч
UAVpilot писал(а):Мы живем в мире, где рабочее время квалифицированного специалиста, в данном случае программиста, стоит дороже любых железок.
я, конечно, не столь квалифицированный спец, но "борьба" с библиотеками hal отнимает у меня куда больше времени, чем написание и отладка собственных функций. Которые делают именно и только то, что мне надо и значительно быстрее.
UAVpilot писал(а):Кстати, а можно пример этого стиля из HAL?..
А как еще назвать ситуацию, когда простая инициализация периферии занимает порядка десятка кбайт?

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

Добавлено: 11 ноя 2019, 22:13
MX_Master
Кубик и HAL - не про экономию ресурсов, они про экономию времени начинающего прогера.

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

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

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

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

Когда программирование было лишь хобби я старался экономить каждый байтик, но в реальной работе такое просто невозможно...