STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Oxford",url="/forum/viewtopic.php?p=3901990#p3901990"]Меня это абсолютно не волнует сколько там байт. пусть будет больше значит больше.[/uquote]Блин, ну вроде же конструктивно начинали обсуждение :( Могли бы дальше подумать как это на Си автоматизировать, а вы сразу в бочку.
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Oxford",url="/forum/viewtopic.php?p=3901974#p3901974"]К сожалению, я понимаю что вы хотели сказать что С++ лучше Си, но увы на Си меньше расходов и проще.[/uquote]
При этом ты предлагаешь практически всегда использовать RTOS, даже когда простая пауза нужна, так что количество расходов больше зависит от того как пишешь, а не на чем :)
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="jcxz",url="/forum/viewtopic.php?p=3901979#p3901979"]Вроде бы очевидное решение, но почему-то ST не догадался так сделать. :dont_know:[/uquote]ST задействовал эту операцию под другую возможность. Она позволяет через BSRR одной операцией устанавливать значение в нужных битах порта в любое состояние.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

А то, что в примере VladislavS 4 команды, а у вас - 5 команд (для тех же действий) - конечно не заметили? И что у него все команды 2-байтовые, а у вас первая 4-байтная - тоже не заметили?? 8)
Вы то куда лезите. А кто это у нас там спрятал C++ класс? Ладно ребятишки дальше без меня считайте байты сидите между собой.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1743
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3901997#p3901997"]ST задействовал эту операцию под другую возможность. Она позволяет через BSRR одной операцией устанавливать значение в нужных битах порта в любое состояние.[/uquote]Не понял... :dont_know: Поясните? У BSRR есть ещё какой-то функционал кроме установки/сброса сост.пина?

Добавлено after 1 minute 43 seconds:
[uquote="Oxford",url="/forum/viewtopic.php?p=3901998#p3901998"]Вы то куда лезите. А кто это у нас там спрятал C++ класс? Ладно ребятишки дальше без меня считайте байты сидите между собой.[/uquote]Тут главное - ни за что не признавать свою неправоту, как бы очевидна она ни была. да ужжж...... :dont_know:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Нету у фрискале никакого атомарного тоггле. Что по вашему означает атомарный тоггле?
Там регистр вывода OUT и регистр модификации OMR эквивалент BSRR

К тому же у XMC регистр OMR виртуальный 8- или 16-битная запись ведет себя как 32-битная запись, заполненная нулями.
Последний раз редактировалось Oxford Пн окт 05, 2020 11:58:32, всего редактировалось 1 раз.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1743
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Oxford",url="/forum/viewtopic.php?p=3902003#p3902003"]Нету у фрискале никакого атомарного тоггле.[/uquote]У фрискале - нет, у ST - нет, у Infineon - есть. Я про фрискале вроде и не говорил.... :dont_know:

[uquote="Oxford",url="/forum/viewtopic.php?p=3902003#p3902003"]Что по вашему означает атомарный тоггле?[/uquote]То, что и всегда - непрерываемый. Выполняющийся в одной команде.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Я инфенион и смотрю оговорился просто.
https://www.infineon.com/dgdl/Infineon- ... 44ccd35c20

Ну так OMR (инфенион) это и есть тоггле атомарный, что и BSRR, за один вызов переключит.

Поэтому и спрашиваю что означает для вас Toggle. Переключение бита из 1 в 0 это Toggle?
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="jcxz",url="/forum/viewtopic.php?p=3902000#p3902000"]Не понял... :dont_know: Поясните? У BSRR есть ещё какой-то функционал кроме установки/сброса сост.пина?[/uquote]Смотрите. Есть у меня переменная X. Что в ней я не знаю. Но хочу её состояние вывести на ножки порта. Для простоты возьмём uint8_t X и сопоставим её ножкам PA2-PA9.

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

uint8_t x;
GPIOA->BSRR = (0xFF<<(2+16)) | (x<<2);
В принципе, ножки можно брать любые. В RESET_BIT пишем 1-цу, а в SET_BIT нужное значение. Так как SET имеет приоритет над RESET, то...

Добавлено after 1 minute 54 seconds:
[uquote="Oxford",url="/forum/viewtopic.php?p=3902006#p3902006"]Поэтому и спрашиваю что означает для вас Toggle. Переключение бита из 1 в 0 это Toggle?[/uquote]toggle это переключение состояния выхода на противоположное вне зависимости от текущего состояния.
Мудрый кот
Сообщения: 1743
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Oxford",url="/forum/viewtopic.php?p=3902006#p3902006"]Поэтому и спрашиваю что означает для вас Toggle. Переключение бита из 1 в 0 это Toggle?[/uquote]toggle - переключение из одного состояния (любого) в противоположное.

Добавлено after 1 minute 19 seconds:
[uquote="VladislavS",url="/forum/viewtopic.php?p=3902013#p3902013"]toggle это переключение состояния выхода на противоположное вне зависимости от текущего состояния.[/uquote]Именно так.

[uquote="VladislavS",url="/forum/viewtopic.php?p=3902013#p3902013"]В принципе, ножки можно брать любые. В RESET_BIT пишем 1-цу, а в SET_BIT нужное значение. Так как SET имеет приоритет над RESET, то...[/uquote]Это нетрудно сделать и не используя возможность записи единиц в set и в reset одновременно:
GPIOA->BSRR = (x ^ 0xFF) << 2 + 16 | x << 2;
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Это дополнительные вычисления.
Мудрый кот
Сообщения: 1743
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3902027#p3902027"]Это дополнительные вычисления.[/uquote]Всего на одну команду больше - вместо 3 команд будет 4. Зато +1 дополнительная функция.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Не уверен точно, у AVR- ок каких-то было toggle зарисью в PIN (аналог нашего IDR). Варианты всегда возможны, было бы желание. ST не возжелала :)
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

ST много чего не сделала. Что есть то и юзаешь. Можно выбрать другой камень.
На практике тоггле мне например не требовался. Хотелось бы узнать от ярых праповедников тоггле когда вы это применяете на практике?
А так производительности и флеша хватает чтобы не думать об байтах и тактах.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3901984#p3901984"]Меньше код. Быстрее считывается и соответственно выполняется.[/uquote]
Не портабельно. Старые семейства (F1, F2) умеют только word access.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3902076#p3902076"]Не портабельно.[/uquote]Как напишешь библиотеку так и будет.

[uquote="a5021",url="/forum/viewtopic.php?p=3902076#p3902076"]Старые семейства (F1, F2) умеют только word access.[/uquote]Что мешает применить эту оптимизацию там где она возможна?

Вот пример портабельности.

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

//Настроим PA15 на выход и в единичку
PA_15::mode<PinMode::PushPull_LowSpeed<1>>();
__NOP(); // Разделитель для наглядности
// Подрыгаем ногой
PA_15::clear();
PA_15::set();
PA_15::clear();
Скомпилируем этот код под разные камни. Библиотека с компилятором сами разберутся что и как.
STM32F4
Спойлер

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

//PA_15::mode<PinMode::PushPull_LowSpeed<1>>();
        LDR.N    R0,??main_0      ;; 0x40020003
        LDRB     R1,[R0, #+0]
        AND      R1,R1,#0x3F
        ORR      R1,R1,#0x40
        STRB     R1,[R0, #+0]
        MOV      R2,#-2147450880
        LDRB     R1,[R0, #+12]
        AND      R1,R1,#0x3F
        STRB     R1,[R0, #+12]
        LDRB     R1,[R0, #+8]
        AND      R1,R1,#0x3F
        STRB     R1,[R0, #+8]
        LDRB     R1,[R0, #+2]
        AND      R1,R1,#0x7F
        STRB     R1,[R0, #+2]
        STR      R2,[R0, #+21]
//__NOP();  
        Nop      
//PA_15::clear();
        MOVS     R1,#+128
        STRB     R1,[R0, #+24]
//PA_15::set();
        STRB     R1,[R0, #+22]
//PA_15::clear();
        STRB     R1,[R0, #+24]
STM32F1
Спойлер

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

//PA_15::mode<PinMode::PushPull_LowSpeed<1>>();
        LDR.W    R5,??main_0      ;; 0x40010804
        LDR      R0,[R5, #+0]
        BIC      R0,R0,#0xF0000000
        ORR      R0,R0,#0x20000000
        STR      R0,[R5, #+0]
        MOV      R1,#-2147450880
        STR      R1,[R5, #+12]
//__NOP();  
        Nop      
//PA_15::clear();
        MOV      R0,#-2147483648
        STR      R0,[R5, #+12]
//PA_15::set();
        MOV      R1,#+32768
        STR      R1,[R5, #+12]
//PA_15::clear();
        STR      R0,[R5, #+12]
STM32L0. У него учтено Errata: 2.1.1 Writing in byte mode to the GPIOx_OTYPER register does not work
Спойлер

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

//PA_15::mode<PinMode::PushPull_LowSpeed<1>>();
        MOVS     R1,#+63
        LDR      R0,??main_0      ;; 0x50000003
        LDRB     R2,[R0, #+0]
        ANDS     R2,R2,R1
        MOVS     R3,#+64
        ORRS     R3,R3,R2
        STRB     R3,[R0, #+0]
        LDRB     R2,[R0, #+12]
        ANDS     R2,R2,R1
        STRB     R2,[R0, #+12]
        LDRB     R2,[R0, #+8]
        ANDS     R1,R1,R2
        STRB     R1,[R0, #+8]
        ADDS     R0,R0,#+1
        LDR      R1,[R0, #+0]
        LDR      R2,??main_0+0x4  ;; 0xffff7fff
        ANDS     R2,R2,R1
        STR      R2,[R0, #+0]
        LDR      R1,??main_0+0x8  ;; 0x80008000
        STR      R1,[R0, #+20]
        SUBS     R0,R0,#+1
//__NOP();
        Nop      
//PA_15::clear();
        MOVS     R1,#+128
        STRB     R1,[R0, #+24]
//PA_15::set();
        STRB     R1,[R0, #+22]
//PA_15::clear();
        STRB     R1,[R0, #+24]
Угадайте какой
Спойлерmdr1986ve8(1)

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

//PA_15::mode<PinMode::PushPull_LowSpeed<1>>();
        LDR.N    R0,??DataTable1  ;; 0x40080008
        MOV      R1,#+32768
        STR      R1,[R0, #+8]
        STR      R1,[R0, #+48]
        STR      R1,[R0, #+76]
        STR      R1,[R0, #+60]
        STR      R1,[R0, #+68]
        MOV      R2,#+1073741824
        STR      R2,[R0, #+80]
        MOV      R3,#-2147483648
        STR      R3,[R0, #+88]
        MOV      R2,#-268435456
        STR      R2,[R0, #+36]
        STR      R1,[R0, #+0]
//__NOP();
        Nop      
//PA_15::clear();
        STR      R1,[R0, #+4]
//PA_15::set();
        STR      R1,[R0, #+0]
//PA_15::clear();
        STR      R1,[R0, #+4]
Добавлено after 4 minutes 4 seconds:
[uquote="Oxford",url="/forum/viewtopic.php?p=3902034#p3902034"]Хотелось бы узнать от ярых праповедников тоггле когда вы это применяете на практике?[/uquote]Где вы в лёгкой и непринуждённой беседе ярых проповедников встретили? Я вот так применяю. Можно?

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

void SysTick_Handler()
{
  LED::Toggle(); 
}
Мудрый кот
Сообщения: 1743
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Oxford",url="/forum/viewtopic.php?p=3902034#p3902034"]На практике тоггле мне например не требовался. Хотелось бы узнать от ярых праповедников тоггле когда вы это применяете на практике?[/uquote]"На практике" атомарный toggle иногда полезен например для пинания WDT из разных задач без необходимости блокировок. И вообще - везде где нужно переключить пин атомарно.
Да и просто - аппаратно реализованная функция уменьшает число требуемых программных тактов. Всегда лучше когда какая-то функция есть.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3902093#p3902093"]Что мешает применить эту оптимизацию там где она возможна?[/uquote]
Ничего не мешает. Точно так же, как ничего не вдохновляет. Слишком невелик эффект.
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

[uquote="jcxz",url="/forum/viewtopic.php?p=3902266#p3902266"][uquote="Oxford",url="/forum/viewtopic.php?p=3902034#p3902034"]На практике тоггле мне например не требовался. Хотелось бы узнать от ярых праповедников тоггле когда вы это применяете на практике?[/uquote]"На практике" атомарный toggle иногда полезен например для пинания WDT из разных задач без необходимости блокировок. И вообще - везде где нужно переключить пин атомарно.
Да и просто - аппаратно реализованная функция уменьшает число требуемых программных тактов. Всегда лучше когда какая-то функция есть.[/uquote]

В каком плане пинание WDT? Там же просто число записываешь, пох из какой задачи идет запись. Где еще нужно?

Атомарный доступ нужен только в случае применения ОС когда есть многопоточность и в случае если оба потока работают с периферией через read-modify-write. Но, на практике я не рекомендую так программировать, это очень плохо. Случаи эти редкие очень. У ОС есть свои механизмы синхронизации потоков для работы с общей периферией.

Поэтому есть два подхода программирования микроконтроллеров с операционной системой и без. Оба подхода кардинально отличаются и требуют разной практики программирования.

Просто нужно программировать вещи сложнее чем GPIO порт и не байты считать и такты, а думать головой над алгоритмами. Еще ни разу не упирался в нехватку ресурсов, к тому же линейка STM32 очень широкая есть из чего выбрать.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Мудрый кот
Сообщения: 1743
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Oxford",url="/forum/viewtopic.php?p=3902321#p3902321"]В каком плане пинание WDT? Там же просто число записываешь, пох из какой задачи идет запись. Где еще нужно?[/uquote]Какое "число"? Разговор о чём идёт? О пине. Даже чайнику должно быть ясно, что пином (внешним сигналом) пинается внешний WDT. А значит о нём и речь.

[uquote="Oxford",url="/forum/viewtopic.php?p=3902321#p3902321"]У ОС есть свои механизмы синхронизации потоков для работы с общей периферией.[/uquote]Я вообще то и писал - если есть атомарный toggle пина, то никакие дополнительные механизмы синхронизации для переключения состояния пина - не нужны. Оно и так уже атомарно. В том и плюс.

[uquote="Oxford",url="/forum/viewtopic.php?p=3902321#p3902321"]Просто нужно программировать вещи сложнее чем GPIO порт и не байты считать и такты, а думать головой над алгоритмами.[/uquote]Вот и думайте. 8)

PS: Если вам не нужен toggle - не используйте, никто не заставляет. Зачем срач на пустом месте разводить?
Ответить

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