Например TDA7294

Форум РадиоКот • Просмотр темы - Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пт дек 19, 2025 11:58:21

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 292 ]     ... , , , 10, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вс дек 13, 2020 02:18:31 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2089
Рейтинг сообщения: 0

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вс дек 13, 2020 03:44:07 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Это там https://github.com/AVI-crak/gpio_one
Материалы для создания таблиц не включены в проект, не хватало чтобы меня ещё и за них пинали.
Глянул краем глаза. Попинаю.
1. Вот это вот совсем плохо.
Код:
zap_GPIO_TypeDef* GPIOx = (void*)0x40020000 + init.port;
Это магическое число запросто может быть 0x50000000 у некоторых контроллеров. Она же определена в заголовочном файле контроллера, надо пользоваться. Ну и с приведение типов надо что-то делать.

2. Состояние пина в PushPull режиме это тоже часть конфигурации. Почему на него забито? Должно быть три опции: 0, 1 и "не трогать".

3. RM говорит, что lock() это
Код:
GPIOx->LCKR = (1 << 16) | (1 << init.pin);
GPIOx->LCKR = 1 << init.pin;
GPIOx->LCKR = (1 << 16) | (1 << init.pin);
GPIOx->LCKR;


ЗЫ: А с народным f103 что будем делать?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вс дек 13, 2020 13:55:53 
Прорезались зубы
Аватар пользователя

Карма: 2
Рейтинг сообщений: 14
Зарегистрирован: Сб янв 09, 2016 15:51:17
Сообщений: 202
Рейтинг сообщения: 0
Reflector писал(а):
Вот это вот совсем плохо.

Это плохо споткнулось на stm32l552xx - там вообще всё переделано. Ну даа, нужно подключать внешнее, чтобы работало везде и всегда (кроме F1). Но на данный момент до этого далеко.

Народный f103 оптимизировать нет смысла: это намного сложнее - и практически с нуля, накопилась критическая масса публикаций в инете - которую невозможно пробить. Даже победив дракона - героя никто не заметит, а может даже затопают в суматохе.

Reflector писал(а):
Состояние пина в PushPull

Ну дык к это относится к работе выхлопа на верхнем и нижнем транзисторе, но в любом случае это выхлоп. А вот не выхлоп - обозначен для выбора.

_________________
sRtoS


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вс дек 13, 2020 15:56:54 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Ну не знаю, раз уж взялись за пин, то лучше полностью состояние задать, чем лочить его. И какая может быть трудность у F1 с его 4 битами конфигурации на пин в одном регистре?

Залочить, кстати, если есть список пинов, это одна команда.
Спойлер
Код:
using PINS = PinList<PB4, PB3, PA1, PA4, PA7, PB1, PB8, PB15>;
PINS::lock();
        LDR.N    R1,??main_0      ;; 0x4800001c
        LDR.N    R0,??main_0+0x4  ;; 0x10092
        STR      R0,[R1, #+0]
        MOVS     R2,#+146
        STR      R2,[R1, #+0]
        STR      R0,[R1, #+0]
        MOVW     R2,#+33050
        LDR      R0,[R1, #+0]
        LDR.N    R0,??main_0+0x8  ;; 0x1811a
        STR      R0,[R1, #+1024]
        STR      R2,[R1, #+1024]
        STR      R0,[R1, #+1024]
        LDR      R0,[R1, #+1024]

Или вот так, сразу три порта лочим, легко и непринуждённо.
Спойлер
Код:
PinList<GpioA<>,GpioB<>,GpioC<>>::lock();
        LDR.N    R1,??main_0      ;; 0x4800001c
        LDR.N    R0,??main_0+0x4  ;; 0x1ffff
        STR      R0,[R1, #+0]
        MOVW     R2,#+65535
        STR      R2,[R1, #+0]
        STR      R0,[R1, #+0]
        LDR      R3,[R1, #+0]
        STR      R0,[R1, #+1024]
        STR      R2,[R1, #+1024]
        STR      R0,[R1, #+1024]
        LDR      R3,[R1, #+1024]
        STR      R0,[R1, #+2048]
        STR      R2,[R1, #+2048]
        STR      R0,[R1, #+2048]
        LDR      R0,[R1, #+2048]
Вот тут цикл просится в оптимизацию :)


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пн дек 14, 2020 10:31:01 
Прорезались зубы
Аватар пользователя

Карма: 2
Рейтинг сообщений: 14
Зарегистрирован: Сб янв 09, 2016 15:51:17
Сообщений: 202
Рейтинг сообщения: 0
Трудность с F1 в том что кубик не даёт полноценный рапорт, а вводить всё это дело руками - рехнуться можно. (это я про своё решение)
Лок нужен по другим причинам, не связанных с безопасностью. Точнее это даже почти правило, всё сто статично - должно лочится.

_________________
sRtoS


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пн дек 14, 2020 22:21:20 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS, еще вопрос.
И так ваш метод:
Код:
PinList<PC7, PC6, PC5, PC4, PC3, PA0, PA1, PA5> pins1;
PinList<PB1, PB2, PB3, PB4, PB5, PD5> pins2;

Теперь, плиз, в цикле, будем записывать, ни знаю как у вас правильно, но
Код:
a = 0;
b = 0;
while (1)
      {
      pins1 = a++;
      pins2 = b++;
      }
При объявлении pins1 и pins2 у вас создается таблица, массив, соответственно будет два массива.
На текущий момент нет способа узнать длину массива, соответственно будет две функции записи.

Покажите получившийся ассемблер?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пн дек 14, 2020 22:49:00 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2089
Рейтинг сообщения: 0
При объявлении pins1 и pins2 у вас создается таблица, массив, соответственно будет два массива.

Нет там никаких массивов, они есть у меня, но только для инициализации и как один из вариантов, потому что иногда скорость важнее размера. Для присваивания скорость важнее гораздо чаще, потому обходимся без массивов, хотя добавить можно, даже с автоматической подстановкой более компактного варианта.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пн дек 14, 2020 23:03:50 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Теперь, плиз, в цикле,
Зачем тут две переменных-счётчика?
При объявлении pins1 и pins2 у вас создается таблица, массив, соответственно будет два массива.
Ничего не создастся. Вообще. Совсем. Только код записи в порты.
На текущий момент нет способа узнать длину массива, соответственно будет две функции записи.
Какого массива? О чём вы?
Покажите получившийся ассемблер?
Завтра, компьютер на работе оставил.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 00:12:34 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2089
Рейтинг сообщения: 0
Завтра, компьютер на работе оставил.

Покажу пока как это может быть с массивами и циклами, набросал буквально за 20 мин:
Код:
ldr r5, [pc, #168]
add.w r6, r5, #12
mov r1, r4
mov r0, r5
bl 0x24000214
mov r1, r4
mov r0, r6
adds r4, #1
bl 0x24000214
b.n 0x240015f6

Два массива выглядят так:
Код:
05 01 00 23 24 25 26 27 FF
35 15 14 13 12 11 FF

Ну и сама функция существующая в единственном экземпляре которая получает на вход такой массив и записываемое значение:
Спойлер
Код:
push {r4, r5, lr}
subs r0, #1
mov.w r4, #65536
ldrb.w r3, [r0, #1]!
cmp r3, #255
beq.n 0x24000242
and.w r5, r3, #15
lsrs r3, r3, #4
and.w r2, r1, #1
lsrs r1, r1, #1
lsls r3, r3, #10
orrs r2, r4
add.w r3, r3, #1476395008
lsls r2, r5
add.w r3, r3, #131072
str r2, [r3, #24]
b.n 0x2400021c
pop {r4, r5, pc}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 08:58:36 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Для F3 оптимизация по скорости
Спойлер
Код:
PinList<PC7, PC6, PC5, PC4, PC3, PA0, PA1, PA5> pins1;
PinList<PB1, PB2, PB3, PB4, PB5, PD5> pins2;
for(auto i=0;;i++)
        MOVS     R0,#+0
        LDR.N    R1,??DataTable1_4  ;; 0x48000018
{
//  pins1=i;
??main_0:
        AND      R2,R0,#0xF8
        ORR      R2,R2,#0xF80000
        STR      R2,[R1, #+2048]
        AND      R3,R0,#0x2
        LSLS     R2,R0,#+5
        AND      R2,R2,#0x20
        ORRS     R3,R3,R2
        UBFX     R4,R0,#+2,#+1
        ORRS     R3,R4,R3
        ORR      R3,R3,#0x230000
        STR      R3,[R1, #+0]
//  pins2=i;
        ORR      R2,R2,#0x200000
        AND      R3,R0,#0x3E
        RBIT     R3,R3
        LSRS     R3,R3,#+25
        AND      R3,R3,#0x3E
        ORR      R3,R3,#0x3E0000
        STR      R3,[R1, #+1024]
        STR      R2,[R1, #+3072]
//}
        ADDS     R0,R0,#+1
        B.N      ??main_0


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 09:03:45 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS писал(а):
Зачем тут две переменных-счётчика?
Я считаю что если одна переменная, то будет оптимизация.
Еще раз, плиз, две переменные в цикле while.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 10:37:49 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Я считаю что если одна переменная, то будет оптимизация.
Не будет никакой разницы, кроме глупого расхода одного РОН.
Еще раз, плиз, две переменные в цикле while.
Спойлер
Код:
//auto a=0;
        MOVS     R0,#+0
//auto b=0;
        MOVS     R1,#+0
        LDR.N    R2,??DataTable1_4  ;; 0x48000018
//while(1)
//{
//  pins1=a++;
??main_0:
        MOV      R3,R0
        AND      R4,R3,#0xF8
        ORR      R4,R4,#0xF80000
        STR      R4,[R2, #+2048]
        LSLS     R5,R3,#+5
        AND      R5,R5,#0x20
        AND      R4,R3,#0x2
        ORRS     R5,R4,R5
        UBFX     R3,R3,#+2,#+1
        ORRS     R5,R3,R5
        ORR      R5,R5,#0x230000
        STR      R5,[R2, #+0]
//  pins2=b++;
        MOV      R3,R1
        AND      R4,R3,#0x3E
        RBIT     R4,R4
        LSRS     R4,R4,#+25
        AND      R4,R4,#0x3E
        LSLS     R3,R3,#+5
        ORR      R4,R4,#0x3E0000
        AND      R3,R3,#0x20
        STR      R4,[R2, #+1024]
        ORR      R3,R3,#0x200000
        ADDS     R0,R0,#+1
        ADDS     R1,R1,#+1
        STR      R3,[R2, #+3072]
//}
        B.N      ??main_0

Компилятор тут тупанул - не объединил переменные. Но вина, скорее, программиста.

GCC, кстати, допёр, что надо объединить переменные
Спойлер
Код:
20000410:   4d14         ldr   r5, [pc, #80]   ; (20000464 <main+0x58>)
20000412:   4c15         ldr   r4, [pc, #84]   ; (20000468 <main+0x5c>)
20000414:   f8df e054    ldr.w   lr, [pc, #84]   ; 2000046c <main+0x60>
20000418:   2100         movs   r1, #0
2000041a:   f04f 4c90    mov.w   ip, #1207959552   ; 0x48000000
2000041e:   0148         lsls   r0, r1, #5
20000420:   f000 0020    and.w   r0, r0, #32
20000424:   f3c1 0280    ubfx   r2, r1, #2, #1
20000428:   f001 0702    and.w   r7, r1, #2
2000042c:   f001 033e    and.w   r3, r1, #62   ; 0x3e
20000430:   4302         orrs   r2, r0
20000432:   fa93 f3a3    rbit   r3, r3
20000436:   0e5b         lsrs   r3, r3, #25
20000438:   f001 06f8    and.w   r6, r1, #248   ; 0xf8
2000043c:   433a         orrs   r2, r7
2000043e:   f003 033e    and.w   r3, r3, #62   ; 0x3e
20000442:   f446 0678    orr.w   r6, r6, #16252928   ; 0xf80000
20000446:   f442 120c    orr.w   r2, r2, #2293760   ; 0x230000
2000044a:   f443 1378    orr.w   r3, r3, #4063232   ; 0x3e0000
2000044e:   f440 1000    orr.w   r0, r0, #2097152   ; 0x200000
20000452:   61ae         str   r6, [r5, #24]
20000454:   3101         adds   r1, #1
20000456:   f8cc 2018    str.w   r2, [ip, #24]
2000045a:   61a3         str   r3, [r4, #24]
2000045c:   f8ce 0018    str.w   r0, [lr, #24]
20000460:   e7dd         b.n   2000041e <main+0x12>
20000462:   bf00         nop
20000464:   48000800    .word   0x48000800
20000468:   48000400    .word   0x48000400
2000046c:   48000c00    .word   0x48000c00


ARMClang
Спойлер
Код:
0x08000790 4912      LDR           r1,[pc,#72]  ; @0x080007DC
0x08000792 2000      MOVS          r0,#0x00
0x08000794 2200      MOVS          r2,#0x00
0x08000798 F00203F8  AND           r3,r2,#0xF8
0x0800079C F0020402  AND           r4,r2,#0x02
0x080007A0 F5030378  ADD           r3,r3,#0xF80000
0x080007A4 F8C13800  STR           r3,[r1,#0x800]
0x080007A8 F3C20380  UBFX          r3,r2,#2,#1
0x080007AC 4423      ADD           r3,r3,r4
0x080007AE F0000420  AND           r4,r0,#0x20
0x080007B2 3020      ADDS          r0,r0,#0x20
0x080007B4 4423      ADD           r3,r3,r4
0x080007B6 F503130C  ADD           r3,r3,#0x230000
0x080007BA 600B      STR           r3,[r1,#0x00]
0x080007BC F002033E  AND           r3,r2,#0x3E
0x080007C0 3201      ADDS          r2,r2,#0x01
0x080007C2 FA93F3A3  RBIT          r3,r3
0x080007C6 0E5B      LSRS          r3,r3,#25
0x080007C8 F5031378  ADD           r3,r3,#0x3E0000
0x080007CC F8C13400  STR           r3,[r1,#0x400]
0x080007D0 F5041300  ADD           r3,r4,#0x200000
0x080007D4 F8C13C00  STR           r3,[r1,#0xC00]
0x080007D8 E7DE      B             0x08000798
0x080007DA BF00      NOP           
0x080007DC 0018      DCW           0x0018
0x080007DE 4800      DCW           0x4800


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 17:26:47 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS писал(а):
Компилятор тут тупанул - не объединил переменные. Но вина, скорее, программиста.
Нет, не тупанул, правильно сделал.
К примеру на pins1 весит индикатор какой-то лсд не важно, а на pins2 светодиоды.
Как их можно объединить и для чего?
А что это за строка?
Код:
LDR.N    R2,??DataTable1_4  ;; 0x48000018


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 18:11:36 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Нет, не тупанул, правильно сделал.
Тупанул ещё как. В pins1 и pins2 всегда записывается одинаковое значение. GCC это смог просчитать и выкинул одну переменную. У GCC, правда, какое-то хроническое неумение объединять доступ со смещением от разных базовых адресов.

Как их можно объединить и для чего?
Ну так же как я в С-коде объединил. Так же как GCC это сделал в результате компиляции. Для оптимизации. Я бы ещё на его месте предупреждение "user fool" выдавал.

А что это за строка?
Код:
LDR.N    R2,??DataTable1_4  ;; 0x48000018
Загрузка константы из памяти по адресу ??DataTable1_4. В комментарии компилятор показал что это константа 0x48000018 (скорее всего &GPIOA->BSRR).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 18:51:30 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS писал(а):
Тупанул ещё как. В pins1 и pins2 всегда записывается одно и то же значение.
Нет, не тупанул.
Цикл while говорит компилятору что pins1 и pins2 будет использоваться многократно, значит нельзя оптимизировать.
А то что записывается одно и то же значение - это чисто случай, надо было а=10 а в=0, были бы разные значения.
А в С-коде тот же GCC используется, а ну да в иаре другой, свой какой-то.

Ну да ладно, что я хотел, то я получил.

С++ конечно красиво, но все создается на этапе компиляции и как выяснилось, плохая возможность отладки.
Что бы, найти ошибку, что то исправить, надо колупать целый класс, и что там в классе написано, да еще и связано с другими.
Увы, примеров и там и тут навалом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 19:10:06 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
надо было а=10 а в=0, были бы разные значения.
Что значит "были бы"? Если бы у бабушки был хрен... Компилировался конкретный код, в котором вы сами написали a=0 и b=0. Компилятор это не увидел, а значит тупанул.
С++ конечно красиво, но все создается на этапе компиляции
Ну надо же, превратить в недостаток бесспорное достоинство. И, по секрету, чтобы что-то просчитывалось на этапе компиляции надо приложить немалые усилия.
и как выяснилось, плохая возможность отладки.
Кем выяснилось? Когда выяснилось? Много вы С++ кода отладили?
Что бы, найти ошибку, что то исправить, надо колупать целый класс, и что там в классе написано, да еще и связано с другими.
Зачем? Воспринимайте класс как библиотечную функцию. Один раз написал, оттестировал и пользуйся как чёрным ящиком. Чего в него лазить? Вот вы написали код с pins1 и pins2 не зная что внутри и всё правильно сработало. А глупость с а=0 и b=0 без всяких классов сморозили.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 19:26:09 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2089
Рейтинг сообщения: 0
С++ конечно красиво, но все создается на этапе компиляции и как выяснилось, плохая возможность отладки.

Показывай реализацию для своих двух списков на С, желательно с инициализацией портов, она ведь тоже нужна, а мы оценим как там обстоят дела с отладкой. Потом поменяй пины на другие и продемонстрируй насколько легко получившийся код использовать повторно :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 19:48:40 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS, Reflector, уважаемые, мне 51 год, скоро 52 будет, на кой х мне это сдалось? Я уже "там" место себе забронировал.
Мне всего раз потребовалось 40 входов и 40 выходов, и то это на 80С31 лет так 30 назад.
Идите учите молодых, ах да забыл, молодые же в ардуино играют.
Если и начинать изучать С++ это надо начинать с буквы А и года 4 зубрить.

А мне уже лень, я в лучше в танки поиграю.

PS: Reflector, вот вам на С реализация, правда для AVR контроллеров
Спойлер
Код:
typedef struct{
   volatile uint8_t * port;
   uint8_t            or;
} port_pin;

#define FLASH __flash

#define pn(p,b) {&PORT ## p, _BV(b)}

const FLASH port_pin pins[] = {
  pn(A,3),
  pn(C,5),
  pn(B,4),
  pn(C,6)
};

const FLASH port_pin pin_ns[] = {
  pn(D,1)
};

void port_write (volatile const FLASH port_pin *p, uint8_t a, uint8_t data)
{   uint8_t s=1;
      for(uint8_t i=0; i<a; i++, s<<=1){
      if (data & s)
         *p->port |= p->or;
         else
            *p->port &= ~(p->or);
      p++;
   }
}


port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00001101);
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00000101);
port_write (pins, sizeof(pins)/sizeof(port_pin), 0);

port_write (pin_ns, sizeof(pin_ns)/sizeof(port_pin), 1);
port_write (pin_ns, sizeof(pin_ns)/sizeof(port_pin), 0);

Как хотите так и трясите, я трясти не буду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Вт дек 15, 2020 23:55:15 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Идите учите молодых
А мы этим и занимаемся. Почему мы должны куда-то уходить? Вам не нужно - проходите мимо.
вот вам на С реализация,
C есть С. Что-то вроде того что Reflector по приколу с массивами показал. Только у него массивы упакованы лучше и их руками не надо делать. Единственный вопрос вызывает вот это место
Код:
*p->port |= p->or;
Сможет ли компилятор тут sbi поставить или будет неэффективная команда записи в память? Я думаю второе.
Код:
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00001101);
С PinList это бы скомпилировплось в последовательность из пяти команд sbi и сbi. Представляете разницу в скорости для и так небыстрой AVR-ки?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Ср дек 16, 2020 03:11:00 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 256
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2089
Рейтинг сообщения: 0
C есть С. Что-то вроде того что Reflector по приколу с массивами показал. Только у него массивы упакованы лучше и их руками не надо делать.

Вчера показал, сегодня уже этот код удалил как не выдерживающий конкуренции, а сам он был простейший и отладка будет соответствующая :) Зато аналогичный подход для инициализации наоборот развил, теперь нет функции проверки дубликатов, эта задача легла на функцию инициализации которая и так в цикле читает данные пинов из массива. В сборке без проверок 7-й бит режима отвечает за лок, а для отладочной сборки лочить пины незачем, там этот бит отвечает за проверку дубликатов, плюс FF в конце тоже нет, все массивы стали короче на два байта:
Код:
PinList<PA1, PA6, PA5, PD14, PB9> pins;
pins.init<PinMode::AF_PushPull, AF5>();
PA5::init<PinMode::PullUp>();
GpioB<0xFF00>::init<PinMode::OpenDrain_MediumSpeed_PullUp>();
pins.mode<PinMode::PushPull, PinMode::PullDown, 3, PinMode::Floating>();
pins.modeInline<PinMode::AF_PushPull, AF5>();

Init() - это тот же mode(), но с проверкой дубликатов, если она включена, а modeInline() вместо массива работает напрямую c регистрами. Для этого кода получаем:
Код:
ldr r0, [pc, #704]
bl 0x24000c2c
ldr r0, [pc, #704]
bl 0x24000c2c
ldr r0, [pc, #700]
bl 0x24000c2c
ldr r0, [pc, #700]
bl 0x24000c2c

ldr r1, [pc, #696] ; modeInline() инитит 12 регистров, с учетом RMW - это ~50 инструкций
movw r0, #10248
movw r2, #15372
......
strh r2, [r3, #36]

Также получим два сообщения об ошибках:
Код:
Error: PA5 is Reused!
Error: PB9 is Reused!


Добавлено after 2 hours 57 minutes 46 seconds:
Если и начинать изучать С++ это надо начинать с буквы А и года 4 зубрить.

Удалил в сишной реализации бесполезный typedef для структуры, заменил все
Код:
sizeof(pins)/sizeof(port_pin)

на
Код:
std::size(pins)

И уже пишешь на C++, для сравнения начать изучать STM32 после AVR так просто не получится :)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 292 ]     ... , , , 10, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y