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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3901984#p3901984"]Меньше код. Быстрее считывается и соответственно выполняется.[/uquote]
Не портабельно. Старые семейства (F1, F2) умеют только word access.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 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(); 
}
Реклама
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Oxford",url="/forum/viewtopic.php?p=3902034#p3902034"]На практике тоггле мне например не требовался. Хотелось бы узнать от ярых праповедников тоггле когда вы это применяете на практике?[/uquote]"На практике" атомарный toggle иногда полезен например для пинания WDT из разных задач без необходимости блокировок. И вообще - везде где нужно переключить пин атомарно.
Да и просто - аппаратно реализованная функция уменьшает число требуемых программных тактов. Всегда лучше когда какая-то функция есть.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 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
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 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 - не используйте, никто не заставляет. Зачем срач на пустом месте разводить?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Так у STM32 нет toggle, если бы у бабушки был х.й, она бы была дедушкой.
у инфениона тоже хотелось бы увидеть где эта возможность
И если используется ОС повторяю у нее свои механизмы синхронизации есть и не надо париться над всякими записями атомарными, GPIO не самое сложное. Программируется легко. А вот к примеру SPI расшарить на несколько потоков вот это уже другое дело.
Инженер R@D

Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="a5021",url="/forum/viewtopic.php?p=3902309#p3902309"]Ничего не мешает. Точно так же, как ничего не вдохновляет. Слишком невелик эффект.[/uquote]
Для одного пина невелик, а для группы пинов? Из относительно недавнего была тема про семисегментники в которой пытались работать с любыми пинами, в результате все свелось к массиву с адресами портов и номеров пинов который перебирается в цикле... Или была тема про опрос кнопок висящих на любых пинах, там автор докатился до использования вариативных макросов и это определенно не очень помогло. Когда пинов несколько, то количество возможных оптимизаций резко увеличивается и перебрать их на стадии компиляции можно только на C++, в таком случае разница в производительности может отличаться сразу на порядок.
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

Господа, есть вопрос. Перешил stm32discovery в j-link, в keil все отлично работает, но появилась необходимость использования openocd и вот тут никак не могу заставить подключится. Может есть у кого подобный опыт, ткните в настройки.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вроде как драйвер другой нужен. Через zidag переключается.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

[uquote="jcxz",url="/forum/viewtopic.php?p=3902005#p3902005"][uquote="Oxford",url="/forum/viewtopic.php?p=3902003#p3902003"]Нету у фрискале никакого атомарного тоггле.[/uquote]У фрискале - нет, у ST - нет, у Infineon - есть. Я про фрискале вроде и не говорил.... :dont_know:[/uquote]
Слегка пооффтоплю на тему toggle: у PIC18, даже таком старом как 14К50, уже есть команда bit toggle:
BTG рег, бит.
Всё, ухожу 8)
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Zhuk72",url="/forum/viewtopic.php?p=3902514#p3902514"]Слегка пооффтоплю на тему toggle: у PIC18, даже таком старом как 14К50, уже есть команда bit toggle:
BTG рег, бит.[/uquote]
У этой команды точно доступ к регистрам портов есть?
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Вот дались вам эти тоглы. На STM8 оно есть [BCPL dst, #pos (pos=0..7)] и порты можно дергать, только толку-то.

[uquote="Reflector",url="/forum/viewtopic.php?p=3902446#p3902446"]Для одного пина невелик, а для группы пинов?[/uquote]
На десяти пинах сэкономили десять байт? Это называется экономия?
Друг Кота
Аватара пользователя
Сообщения: 25899
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="Reflector",url="/forum/viewtopic.php?p=3902561#p3902561"]У этой команды точно доступ к регистрам портов есть?[/uquote] У Микрочипа порты находятся в общем пространстве ОЗУ и все без исключения команды к регистрам портов применимы как к любому адресу ОЗУ.
Тоггл есть в PIC18 и в PIC24/dsPIC33. Эта команда относится к RMW-инструкциям.
Последний раз редактировалось КРАМ Вт окт 06, 2020 14:45:55, всего редактировалось 1 раз.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1231
Зарегистрирован: Ср янв 29, 2014 08:41:31
Откуда: Баку

Сообщение Zhuk72 »

Reflector,
СпойлерИзображение
Каждый имеет право на свое личное ошибочное мнение.

У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Контактная информация:
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

довесом к предыдущей странице
накомпилил кейл, f103, (надергано, т.е. не все одна за другой)
одна str - положить линию, одна str - взвести. Инф. о бите внутри 16 бит самой инструкции,
статичная инф. может "запаковываться" на уровне компиляции.
Спецам здесь ничего нового.
Спойлер#define LCD_WR Pin_15
#define LCD_WR1 GPIOC->BSRR = LCD_WR
#define LCD_WR0 GPIOC->BRR = LCD_WR
GPIOB->BSRR = (0x00FF0000 | x);
LCD_WR0;__NOP();LCD_WR1;__NOP();LCD_WR0;__NOP();LCD_WR1;

4E34 LDR r6,[pc,#208] ; DCW 0x1000,0x4001
2401 MOVS r4,#0x01
03E0 LSLS r0,r4,#15
F445057F ORR r5,r5,#0xFF0000
F8C95000 STR r5,[r9,#0x00]
6170 STR r0,[r6,#0x14]
BF00 NOP
6130 STR r0,[r6,#0x10]
BF00 NOP
6170 STR r0,[r6,#0x14]
BF00 NOP
6130 STR r0,[r6,#0x10]
Опытный кот
Аватара пользователя
Сообщения: 819
Зарегистрирован: Вт окт 23, 2012 13:17:25
Откуда: Прокопьевск

Сообщение Oxford »

Ну само собой компилятор анализирует код.
Инженер R@D

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

Сообщение VladislavS »

a797945, по генерируемому коду всё хорошо. А вот по стилю программирования есть вопросы на подумать. LCD_WR - константа, а LCD_WR1 уже целый кусок кода. Код был бы более читаем, если бы макроопределение константы выглядело константой, а действие как-то в виде функции LCD_WR1(); оформлено.
СпойлерИнтересно, никто не прискачет с криками "непортабельно"? BRR не у всех STM32 есть. :)
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Вт дек 29, 2015 11:33:49

Сообщение pavell »

[uquote="VladislavS",url="/forum/viewtopic.php?p=3902496#p3902496"]Вроде как драйвер другой нужен. Через zidag переключается.[/uquote]
UPD Все так и оказалось, проблема была с самой утилитой Zadig, скачал новую - все заработало
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

... в виде функции LCD_WR1()...
а если не хочу чтоб вызывалась - оформить как static inline
правильно понимаю?
ну что ж, правила так правила
хотя с непривычки, в данном случае, кажется избыточным.
Ответить

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