Например TDA7294

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

Текущее время: Пт дек 26, 2025 21:46:07

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


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



Начать новую тему Ответить на тему  [ Сообщений: 293 ]     ... , , , 12, , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Чт дек 17, 2020 22:49:12 
Поставщик валерьянки для Кота

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

Потестил немного на 32-х пиновом списке. Стандартная версия быстрее твоей в 11 раз, а если пины более-менее упорядочить, то получим еще значительное ускорение. Моя медленная реализация, с BSRR и одним байтом на пин, быстрее в 1.6 раза.


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Reflector, да это даже как-то неспортивно - соревноваться с пишущими в BSRR через |=.


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

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
Reflector, за-то без всяких там классов и 3-4 страниц не известно какого кода.
Но пока сравнить не с чем, вашего кода, а особенно кода VladislavS я не видел.

Пока похоже только на болтовню, может и ни какого кода не существует.


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Вам же открытым текстом написали КАК.
Хоть бы через BSRR сделали.

Вот этот ваш код
Код:
if (data & s)
  *p->port |= p->or;
else
  *p->port &= ~(p->or);
можно сократить в три раза.

В ветке про асм стыдно не знать, что доступ к BSRR и BRR можно через один указатель получить.

как-то неспортивно - соревноваться с пишущими в BSRR через |=.


Дай голодному рыбу и он насытится на день. Научи его ловить рыбу и он будет сыт всю жизнь.

Скомпилируйте свой код, посмотрите листинг, найдите в нём слабое место, исправьте. Вот тогда будет польза.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
СообщениеДобавлено: Пт дек 18, 2020 06:52:08 
Мудрый кот

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS, я не знал что в этот регистр можно просто писать, все равно это ни чего не меняет, чуть-чуть не считается.

Ладно, на F030 это не зачем, там всего один пин В1, и тот занят уже.


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
В три раза это не чуть-чуть. Хотя, если это вам не надо, то мне и подавно.


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

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
Да, действительно в три раза, даже в четыре раза, было 197us стало 49us.


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Держу пари, это ещё не всё.


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

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

В теме "STM32 новичку..." VladislavS приводил пример класса TSimplePort специально для тебя, с комментариями, а в классе была фактически одна функция преимущественно пишущая в BRR/BSRR:
Код:
  static inline void toggle()
  {
    if constexpr (PM == 0xFFFF)
      base()->ODR = ~base()->ODR;
    else
      if constexpr (countSetBits(PM)==1)
        if(base()->ODR & PM) base()->BRR = PM; else base()->BSRR = PM;
      else
        base()->BSRR = (PM << 16) | (~base()->ODR & PM);
  }

Это помимо обсуждения BSRR в той-же теме...


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Посмотрел во что же этот ужас от Dimon456 выливается. Листинг того что было
Спойлер
Код:
//  210 void port_write (const port_pin *p, uint8_t a, k_bit data)
//  211 {   k_bit s=1;
_Z10port_writePK8port_pinhy:
        PUSH     {R4-R9,LR}
        MOV      R12,R0
        MOV      R4,R1
        MOV      R0,R2
        MOV      R1,R3
        MOVS     R6,#+1
        MOVS     R7,#+0
//  212       for(uint8_t i=0; i<a; i++, s<<=1){
        MOVS     R2,#+0
        MOV      R3,R4
        B.N      ??port_write_0
//  213       if (data & s)
??port_write_1:
        LDR      LR,[R12, #+0]
        LDR      R9,[R12, #+4]
        LDR      R8,[LR, #+0]
        AND      R4,R0,R6
        ANDS     R5,R1,R7
        ITTE     EQ
        CMPEQ    R4,#+0
        BICEQ    R4,R8,R9
        ORRNE    R4,R9,R8
//  214          *p->port|= p->_or;
//  215          else
//  216             *p->port &= ~(p->_or);
//  217       p++;
//  218    }
        LSLS     R7,R7,#+1
        ORR      R7,R7,R6, LSR #+31
        STR      R4,[LR, #+0]
        ADD      R12,R12,#+8
        ADDS     R2,R2,#+1
        LSLS     R6,R6,#+1
??port_write_0:
        UXTB     R4,R2
        CMP      R4,R3
        BCC.N    ??port_write_1
//  219 }
        POP      {R4-R9,PC}       ;; return

Не долго думая переписал без 64-битной арифметики.
Код:
typedef struct{
   uint32_t *bsrr;
   uint32_t mask;
} port_pin;

void port_write64 (const port_pin *p, int a, uint64_t data)

  do
  {
    uint32_t const count = a>32 ? 32 : a ;
    for(uint8_t i=0; i<count; i++)
    {
      if ((uint32_t)data & (1<<i))
        *p->bsrr = p->_or;
       else
         *(p->bsrr+4) = p->_or;
         // Для контроллеров у которых нет BSRR
         //*(volatile uint16_t *)((uint16_t *)p->bsrr+1) = p->_or;
      p++;       
    }
    data >>= 32;
    a-=32;
  }
  while(a>0);
}
Листинг. Основной цикл похудел. Должно прибавить в скорости значительно.
Спойлер
Код:
//void port_write64 (const port_pin *p, int a, uint64_t data)
//{ 
_Z12port_write64PK8port_piniy:
        PUSH     {R4-R7,LR}
//  do
//  {
//    uint32_t const count = a>32 ? 32 :a ;
??port_write64_0:
        CMP      R1,#+33
        ITE      GE
        MOVGE    R4,#+32
        MOVLT    R4,R1
//    for(uint8_t i=0; i<count; i++)
        MOVS     R5,#+0
        B.N      ??port_write64_1
//    {
??port_write64_2:
//      if ((uint32_t)data & (1<<i))
        LDR      R7,[R0, #+4]
        LDR      R6,[R0, #+0]
        LSR      R12,R2,R5
        LSLS     LR,R12,#+31
//        *p->bsrr = p->_or;
//      else
//        *(p->bsrr+4) = p->_or;       
        ITE      PL
        STRPL    R7,[R6, #+16]
        STRMI    R7,[R6, #+0]
//      p++;       
        ADDS     R0,R0,#+8
//    }
        ADDS     R5,R5,#+1
??port_write64_1:
        UXTB     R6,R5
        CMP      R6,R4
        BCC.N    ??port_write64_2
//    data >>= 32;
        MOV      R2,R3
        MOVS     R3,#+0
//    a-=32;
        SUBS     R1,R1,#+32
//  }
//  while(a>0);
        CMP      R1,#+1
        BGE.N    ??port_write64_0
//}
        POP      {R4-R7,PC}       ;; return
За неимением constexpr для коротких списков руками вот такую вызывать
Код:
void port_write32 (const port_pin *p, uint32_t a, uint32_t data)
{   
  for(uint8_t i=0; i<a; i++)
  {
    if (data & (1<<i))
      *p->bsrr = p->_or;
     else
       *(p->bsrr+4) = p->mask;
       // Для контроллеров у которых нет BRR
       //*(volatile uint16_t *)((uint16_t *)p->bsrr+1) = p->mask;
    p++;
  } 
}   


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

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS, вы только листинг смотрите или еще что?
Такая конструкция
Спойлер
Код:
*(p->port+4) = p->or;
*(volatile uint16_t *)((uint16_t *)p->port+4) = p->or;
уводит МК в hard fault
Я не знаю как у вас, ide - компилятор - С++, таблица находится во флеш, соответственно должен быть вызов не const port_pin *p а volatile const port_pin *p, хотя может быть у вас это и позволяет.
Тем не менее сделал сравнительные тесты, исправив кое-что что бы работало
Спойлер
Код:
Program Size:   port_write 89us
      text      data       bss       dec       hex   filename
      1216         0      1024      2240       8c0   port_103.elf
    
Program Size:   port_write64 108us
      text      data       bss       dec       hex   filename
      1288         0      1024      2312       908   port_103.elf
    
Program Size:  port_write32 104us
      text      data       bss       dec       hex   filename
      1224         0      1024      2248       8c8   port_103.elf
port_write моя функция, остальные две ваши, us - время в микро секундах измеренное в протеусе + проверка на реальном МК.
Что вы пытаетесь с этой функции выжить, мне не понятно.


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
VladislavS, вы только листинг смотрите или еще что?
Моего опыта хватает, чтобы по листингу сказать как это будет работать.

Такая конструкция
Код:
*(p->port+4) = p->or;
*(volatile uint16_t *)((uint16_t *)p->port+4) = p->or;
уводит МК в hard fault
OMG!!! Во-первых, даже скопировать не можете правильно. У меня не такой код. Во-вторых, нужна либо первая, либо вторая строка. Зачем их вместе то? Вы вообще не понимаете что код делает? В-третьих, и самое главное, у вас F103 - у него есть BRR и нет пословного доступа к BSRR!!! Снимать комментарий с этой строки было в высшей степени глупо.

Я не знаю как у вас, ide - компилятор - С++, таблица находится во флеш, соответственно должен быть вызов не const port_pin *p а volatile const port_pin *p, хотя может быть у вас это и позволяет.
volatile нужен только в одном месте - при доступе к регистру BSRR. Во всех остальных местах его надо резать не дожидаясь перитонита! Нечего ему делать ни во флеше, ни в параметре функции.

Что вы пытаетесь с этой функции выжить, мне не понятно.
Скорость. Ещё страницу назад вы утверждали, что эту функцию нельзя оптимизировать в принципе. Называли меня болтуном. А потом, оказалось, в 4!!! раза оптимизируется. Где извинения?


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

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS, ну извините высокоинтеллектуальный программист,
не соблаговолит ли ВАША светлость проверить, что будет в переменной temp после выполнения этого кода
Код:
uint32_t temp;
volatile const port_pin *p;

   p = pins;
   
   temp = p->bsrr+4;
а потом вот эту строку, плиз
Код:
temp = (volatile uint16_t *)((uint16_t *)p->bsrr+1);


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 3
Зашибись. Это мне в ответ на хамство ещё и ошибки в вашем коде искать?


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

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
Ладно, ваша взяла, когда мы увидим ваш код?


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Опять я что-то должен, или показалось? Я показал даже больше, чем планировал. Если вы ничего не поняли, это ваша проблема.


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

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
Ну что же, очень жаль, хотелось конечно увидеть во всей красе работу профессионала, но ... , пока похоже на пустую болтовню с картинками и даже неизвестно если он вообще этот профессиональный код.

Ну да ладно, как вам, уважаемый, такой вариант?
Спойлер
Код:
void port_write (volatile const port_pin *p, uint8_t a, k_bit data)
{   k_bit s=1;
      for(uint8_t i=0; i<a; i++, s<<=1){
      if (data & s)
         ((GPIO_TypeDef *) p->port)->BSRR = p->or;
         else
         ((GPIO_TypeDef *) p->port)->BSRR = p->and;
      p++;
   }
}


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
Плохо. Я для кого тут распинался?


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

Карма: 20
Рейтинг сообщений: 145
Зарегистрирован: Вс дек 25, 2016 08:34:54
Сообщений: 1849
Рейтинг сообщения: 0
VladislavS писал(а):
Плохо. Я для кого тут распинался?
Видимо для себя
Спойлер
Код:
Program Size:   port_write 89us
      text      data       bss       dec       hex   filename
      1216         0      1024      2240       8c0   port_103.elf
   
Program Size:   port_write64 108us
      text      data       bss       dec       hex   filename
      1288         0      1024      2312       908   port_103.elf
   
Program Size:  port_write32 104us
      text      data       bss       dec       hex   filename
      1224         0      1024      2248       8c8   port_103.elf
не только больше по объему, один на 72 другой на 8 байт, но и по времени выполнения, 89/108/104 us


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

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2557
Рейтинг сообщения: 0
не только больше по объему, один на 72 другой на 8 байт, но и по времени выполнения, 89/108/104 us.
Во-первых, вы не показали что компилировали. Судя по усердной борьбе с HardFault - сравнивали вы между собой какую-то хрень, а не мой пример.

Во-вторых, я свои примеры скомпилировал и там даже по листингу видно, что они быстрее. Из главного цикла "вынута" 64-битная арифметика. А цикл там аж 36 раз выполняется.

В-третьих, что вы там измеряли вообще непонятно. Возьмём те же 104 мкс на установку 36 бит. У f103 частота 72 МГц. Я должен поверить, что на установку одного бита уходит 104/36*72 = 208 тактов процессора? Даже если вы его на 8 МГц измеряли с пьяну, то это 23 такта на бит - овердофига для листинга из моего сообщения. Так что, без кода и листинга это всё бла-бла.

В-четвёртых, скорость и размер кода вообще сложносвязанные величины. Оптимизация по скорости очень часто идёт за счёт увеличения размера кода. Например, IAR при определённых настройках в этой функции частично разворачивает цикл - делает 8х4 итераций. Размер кода растёт в несколько раз, скорость лишь незначительно. Поэтому, при "выжимании" скорости/размера открываем листинг и смотрим что там получается. Я больше чем уверен, что вы ни разу этого не сделали.

А потом приходит Reflector и показывает алгоритм, работающий в 10 раз быстрее :)))

Видимо для себя
У меня тоже такое ощущение складывается. Открытым текстом вам рассказываешь что и как надо делать, а вы в упор не слышите. Как будто мы на разных языках разговариваем. Да ещё и хамство в ответ. :(


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

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


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

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


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

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


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