Не портабельно. Старые семейства (F1, F2) умеют только word access.
STM32 новичку в ARM что к чему
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3901984#p3901984"]Меньше код. Быстрее считывается и соответственно выполняется.[/uquote]
Не портабельно. Старые семейства (F1, F2) умеют только word access.
Не портабельно. Старые семейства (F1, F2) умеют только word access.
- Реклама
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="a5021",url="/forum/viewtopic.php?p=3902076#p3902076"]Не портабельно.[/uquote]Как напишешь библиотеку так и будет.
[uquote="a5021",url="/forum/viewtopic.php?p=3902076#p3902076"]Старые семейства (F1, F2) умеют только word access.[/uquote]Что мешает применить эту оптимизацию там где она возможна?
Вот пример портабельности.
Скомпилируем этот код под разные камни. Библиотека с компилятором сами разберутся что и как.
STM32F4STM32F1
STM32L0. У него учтено Errata: 2.1.1 Writing in byte mode to the GPIOx_OTYPER register does not workУгадайте какой
Добавлено after 4 minutes 4 seconds:
[uquote="Oxford",url="/forum/viewtopic.php?p=3902034#p3902034"]Хотелось бы узнать от ярых праповедников тоггле когда вы это применяете на практике?[/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]Спойлер
Код: Выделить всё
//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]Спойлер
Код: Выделить всё
//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][uquote="Oxford",url="/forum/viewtopic.php?p=3902034#p3902034"]Хотелось бы узнать от ярых праповедников тоггле когда вы это применяете на практике?[/uquote]Где вы в лёгкой и непринуждённой беседе ярых проповедников встретили? Я вот так применяю. Можно?
Код: Выделить всё
void SysTick_Handler()
{
LED::Toggle();
}- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[uquote="Oxford",url="/forum/viewtopic.php?p=3902034#p3902034"]На практике тоггле мне например не требовался. Хотелось бы узнать от ярых праповедников тоггле когда вы это применяете на практике?[/uquote]"На практике" атомарный toggle иногда полезен например для пинания WDT из разных задач без необходимости блокировок. И вообще - везде где нужно переключить пин атомарно.
Да и просто - аппаратно реализованная функция уменьшает число требуемых программных тактов. Всегда лучше когда какая-то функция есть.
Да и просто - аппаратно реализованная функция уменьшает число требуемых программных тактов. Всегда лучше когда какая-то функция есть.
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="VladislavS",url="/forum/viewtopic.php?p=3902093#p3902093"]Что мешает применить эту оптимизацию там где она возможна?[/uquote]
Ничего не мешает. Точно так же, как ничего не вдохновляет. Слишком невелик эффект.
Ничего не мешает. Точно так же, как ничего не вдохновляет. Слишком невелик эффект.
[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 очень широкая есть из чего выбрать.
Да и просто - аппаратно реализованная функция уменьшает число требуемых программных тактов. Всегда лучше когда какая-то функция есть.[/uquote]
В каком плане пинание WDT? Там же просто число записываешь, пох из какой задачи идет запись. Где еще нужно?
Атомарный доступ нужен только в случае применения ОС когда есть многопоточность и в случае если оба потока работают с периферией через read-modify-write. Но, на практике я не рекомендую так программировать, это очень плохо. Случаи эти редкие очень. У ОС есть свои механизмы синхронизации потоков для работы с общей периферией.
Поэтому есть два подхода программирования микроконтроллеров с операционной системой и без. Оба подхода кардинально отличаются и требуют разной практики программирования.
Просто нужно программировать вещи сложнее чем GPIO порт и не байты считать и такты, а думать головой над алгоритмами. Еще ни разу не упирался в нехватку ресурсов, к тому же линейка STM32 очень широкая есть из чего выбрать.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Реклама
- Сообщения: 1846
- Зарегистрирован: Вт авг 15, 2017 10:51:13
[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]Вот и думайте.
PS: Если вам не нужен toggle - не используйте, никто не заставляет. Зачем срач на пустом месте разводить?
[uquote="Oxford",url="/forum/viewtopic.php?p=3902321#p3902321"]У ОС есть свои механизмы синхронизации потоков для работы с общей периферией.[/uquote]Я вообще то и писал - если есть атомарный toggle пина, то никакие дополнительные механизмы синхронизации для переключения состояния пина - не нужны. Оно и так уже атомарно. В том и плюс.
[uquote="Oxford",url="/forum/viewtopic.php?p=3902321#p3902321"]Просто нужно программировать вещи сложнее чем GPIO порт и не байты считать и такты, а думать головой над алгоритмами.[/uquote]Вот и думайте.
PS: Если вам не нужен toggle - не используйте, никто не заставляет. Зачем срач на пустом месте разводить?
Так у STM32 нет toggle, если бы у бабушки был х.й, она бы была дедушкой.
у инфениона тоже хотелось бы увидеть где эта возможность
И если используется ОС повторяю у нее свои механизмы синхронизации есть и не надо париться над всякими записями атомарными, GPIO не самое сложное. Программируется легко. А вот к примеру SPI расшарить на несколько потоков вот это уже другое дело.
у инфениона тоже хотелось бы увидеть где эта возможность
И если используется ОС повторяю у нее свои механизмы синхронизации есть и не надо париться над всякими записями атомарными, GPIO не самое сложное. Программируется легко. А вот к примеру SPI расшарить на несколько потоков вот это уже другое дело.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="a5021",url="/forum/viewtopic.php?p=3902309#p3902309"]Ничего не мешает. Точно так же, как ничего не вдохновляет. Слишком невелик эффект.[/uquote]
Для одного пина невелик, а для группы пинов? Из относительно недавнего была тема про семисегментники в которой пытались работать с любыми пинами, в результате все свелось к массиву с адресами портов и номеров пинов который перебирается в цикле... Или была тема про опрос кнопок висящих на любых пинах, там автор докатился до использования вариативных макросов и это определенно не очень помогло. Когда пинов несколько, то количество возможных оптимизаций резко увеличивается и перебрать их на стадии компиляции можно только на C++, в таком случае разница в производительности может отличаться сразу на порядок.
Для одного пина невелик, а для группы пинов? Из относительно недавнего была тема про семисегментники в которой пытались работать с любыми пинами, в результате все свелось к массиву с адресами портов и номеров пинов который перебирается в цикле... Или была тема про опрос кнопок висящих на любых пинах, там автор докатился до использования вариативных макросов и это определенно не очень помогло. Когда пинов несколько, то количество возможных оптимизаций резко увеличивается и перебрать их на стадии компиляции можно только на C++, в таком случае разница в производительности может отличаться сразу на порядок.
- Сообщения: 56
- Зарегистрирован: Вт дек 29, 2015 11:33:49
Господа, есть вопрос. Перешил stm32discovery в j-link, в keil все отлично работает, но появилась необходимость использования openocd и вот тут никак не могу заставить подключится. Может есть у кого подобный опыт, ткните в настройки.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="jcxz",url="/forum/viewtopic.php?p=3902005#p3902005"][uquote="Oxford",url="/forum/viewtopic.php?p=3902003#p3902003"]Нету у фрискале никакого атомарного тоггле.[/uquote]У фрискале - нет, у ST - нет, у Infineon - есть. Я про фрискале вроде и не говорил....
[/uquote]
Слегка пооффтоплю на тему toggle: у PIC18, даже таком старом как 14К50, уже есть команда bit toggle:
BTG рег, бит.
Всё, ухожу
Слегка пооффтоплю на тему toggle: у PIC18, даже таком старом как 14К50, уже есть команда bit toggle:
BTG рег, бит.
Всё, ухожу
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Zhuk72",url="/forum/viewtopic.php?p=3902514#p3902514"]Слегка пооффтоплю на тему toggle: у PIC18, даже таком старом как 14К50, уже есть команда bit toggle:
BTG рег, бит.[/uquote]
У этой команды точно доступ к регистрам портов есть?
BTG рег, бит.[/uquote]
У этой команды точно доступ к регистрам портов есть?
- Сообщения: 6457
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Вот дались вам эти тоглы. На STM8 оно есть [BCPL dst, #pos (pos=0..7)] и порты можно дергать, только толку-то.
[uquote="Reflector",url="/forum/viewtopic.php?p=3902446#p3902446"]Для одного пина невелик, а для группы пинов?[/uquote]
На десяти пинах сэкономили десять байт? Это называется экономия?
[uquote="Reflector",url="/forum/viewtopic.php?p=3902446#p3902446"]Для одного пина невелик, а для группы пинов?[/uquote]
На десяти пинах сэкономили десять байт? Это называется экономия?
[uquote="Reflector",url="/forum/viewtopic.php?p=3902561#p3902561"]У этой команды точно доступ к регистрам портов есть?[/uquote] У Микрочипа порты находятся в общем пространстве ОЗУ и все без исключения команды к регистрам портов применимы как к любому адресу ОЗУ.
Тоггл есть в PIC18 и в PIC24/dsPIC33. Эта команда относится к RMW-инструкциям.
Тоггл есть в PIC18 и в PIC24/dsPIC33. Эта команда относится к RMW-инструкциям.
Последний раз редактировалось КРАМ Вт окт 06, 2020 14:45:55, всего редактировалось 1 раз.
Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
довесом к предыдущей странице
накомпилил кейл, f103, (надергано, т.е. не все одна за другой)
одна str - положить линию, одна str - взвести. Инф. о бите внутри 16 бит самой инструкции,
статичная инф. может "запаковываться" на уровне компиляции.
Спецам здесь ничего нового.
#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]
накомпилил кейл, 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]
Ну само собой компилятор анализирует код.
Инженер R@D
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
Telegram чат: https://t.me/radiowolf или в поиске приложения @radiowolf. Личка:@cncoxford
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
a797945, по генерируемому коду всё хорошо. А вот по стилю программирования есть вопросы на подумать. LCD_WR - константа, а LCD_WR1 уже целый кусок кода. Код был бы более читаем, если бы макроопределение константы выглядело константой, а действие как-то в виде функции LCD_WR1(); оформлено.

Спойлер
Интересно, никто не прискачет с криками "непортабельно"? BRR не у всех STM32 есть.- Сообщения: 56
- Зарегистрирован: Вт дек 29, 2015 11:33:49
[uquote="VladislavS",url="/forum/viewtopic.php?p=3902496#p3902496"]Вроде как драйвер другой нужен. Через zidag переключается.[/uquote]
UPD Все так и оказалось, проблема была с самой утилитой Zadig, скачал новую - все заработало
UPD Все так и оказалось, проблема была с самой утилитой Zadig, скачал новую - все заработало
... в виде функции LCD_WR1()...
а если не хочу чтоб вызывалась - оформить как static inline
правильно понимаю?
ну что ж, правила так правила
хотя с непривычки, в данном случае, кажется избыточным.
а если не хочу чтоб вызывалась - оформить как static inline
правильно понимаю?
ну что ж, правила так правила
хотя с непривычки, в данном случае, кажется избыточным.


