Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Сб дек 19, 2020 08:58:28

Тихо, уважаемый, тихо.
Я сравнивал в протеусе время измерения, на какой частоте было - мне все равно на какой частоте он там работает.

Далее, я у вас спросил, вы листинг смотрели или в реальном устройстве, вы мне что ответили?

Далее, это ваше?
Код:
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);
}
А теперь вопрос, на какой адрес вот это
Код:
*(p->bsrr+4)
перейдет, если тип указателя задан, именно вами, не мной, вами uint32_t *bsrr;?

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Сб дек 19, 2020 09:10:27

А теперь вопрос, на какой адрес вот это
Код:
*(p->bsrr+4)
перейдет, если тип указателя задан, именно вами, не мной, вами uint32_t *bsrr;?
А подумать? Имея RM на контроллер, листинг этого фрагмента кода и понимание того что он должен делать просто невозможно не понять что это. После ваших хамских выпадов отвечать на него не хочу.

И ещё небольшое наблюдение. Вот этот вызов
Код:
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100101101001001000001010010100100);
это запись трёх констант в BSRR портов A,B,C. Это, на вскидку, около 16 тактов процессора или 0.2 мкс на вашем f103.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Сб дек 19, 2020 09:30:03

VladislavS писал(а):Как тут можно не понять?
Ну не знаю
Код:
STRPL    R7,[R6, #+16]

GPIOA_BSRR   0x40010810   
GPIOA_BRR   0x40010814
0x40010810 +16 = 0x40010820

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Сб дек 19, 2020 09:36:20

GPIOA_BRR 0x40010814[/code] 0x40010810 +16 = 0x40010820
Да, вы правы, на F103 действительно BRR идёт сразу за BSRR. Я посмотрел RM от другого контроллера. Можете исправить на *(p->bsrr+1). На скорость это не повлияет.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Сб дек 19, 2020 09:55:49

По этому у меня в HardFault и падало, я не посмотрел что там по этому адресу 0x40010820 у F103 расположено.

Еще одну функцию написал, чтение списка пинов
Вот ее можете покопать, выслушаю все предложения.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Сб дек 19, 2020 10:01:23

Спасибо за разрешение! Но я воздержусь.

А ещё, мне кажется это оффтоп в данной теме.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Сб дек 19, 2020 14:18:08

VladislavS писал(а):мне кажется
креститься надо.
VladislavS писал(а):это оффтоп в данной теме
как и все остальное начиная со второй странице, по теме ровно 0.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Сб дек 19, 2020 14:58:54

как и все остальное начиная со второй странице, по теме ровно 0.

Лично я на каждой странице вижу код на C/C++ с выхлопом на ассме и хотя в первую очередь он нужен для сравнения самих С и С++ между собой, но то же самое пришлось бы делать сравнивая их эффективность с ассмом.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Пн дек 28, 2020 09:48:21

А теперь вставь этот код в прерывание, допустим, где содержимое регистров за тебя никто раньше не загрузил. А примени в другой единице трансляции, а... Да много ли ещё чего бывает. Компилятор не устаёт.
В принципе пойнт, но не game changer. И к тому же меня в основном инетерсуют F1 и L1. Как баланс между обкоцаностью и оверинженерией, у них BRR есть. Чего это я им не должен пользоваться?

Я же показал что будет. Указываем список пинов и погнали. Причем, пины могут быть из разных портов в любой последовательности. Всё сгруппируется как надо. Это могут быть не только set или reset, а write, read, toggle.
Это здорово, но мне трудно понять насколько (не)эффективным будет та или иная конструкция на плюсах. И судя по тому как там Reflector с Oxford дебатировал, это не уникально для одного меня. А тут убедить компилер на эффективный код даже для группы пинов - как 2 байта переслать. Почти.

Более того - попался мне DMA. И понравился. В чем прикол? ТЕ ЖЕ САМЫЕ константы (и/или методы их получения) - ОК. Для примерно того же. С некоторыми оговорками, но даже с ними видится много интересных практических применений, типа "заталкивания пакета в дисплей" или "PWM на много каналов". Полностью хардварно. А с теми абстракциями придется стиль мышления извернуть на 180 градусов. Ну вот нет у DMA понятия - набор пинов. А битовая маска - какая разница, проц в BSRR загонит или DMA? :P Вообще, DMA по размеру кода в победители напрашивается. Лучший код - отсутствие оного.

Я даже не буду просить повторить нижеследующий пример. Берём две группы пинов на разных портах. Читаем одну группу как байт, инвертируем и записываем во вторую группу.
Когда кто-то так делает, оптимальность их точно не волновала.

Сколько вы это будете руками ковырять... Компилятор делает за долю секунды.
Да нисколько. Постараюсь чтобы оно оптимально раскидывалось и оформлю парой констант. Зачем создавать себе проблемы на ровном месте?

Только без BRR. В F4 или H7, например. Мэинстрим, как ни крути, приходится учитывать.
Я ими не пользуюсь и не планирую.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Пн дек 28, 2020 12:11:23

iddqd, в чём вопрос то?

Добавлено after 8 minutes 18 seconds:
А тут убедить компилер на эффективный код даже для группы пинов - как 2 байта переслать.
Если вас устраивает проигрыш в скорости на порядок, то и ну его на.
Более того - попался мне DMA.
Когда научите DMA код выполнять - приходите.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Пн дек 28, 2020 14:20:01

Если вас устраивает проигрыш в скорости на порядок, то и ну его на.
У меня никакого проигрыша в скорости на порядок совершенно точно не будет. Откуда и с фига ли?
Когда научите DMA код выполнять - приходите.
Двухъядерник возьмите, получите желаемое! Только это половину смысла уроет: DMA без проблем запихнет килобайт в BSRR - без единого байта инструкций по шинам вообще. А если это процессорное ядро, даже второе - уже не то. Вот как раз потому что кроме потока данных по шинам еще поток команд будет. Без него видите ли процессор вообще работать не может.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Пн дек 28, 2020 15:17:11

У меня никакого проигрыша в скорости на порядок совершенно точно не будет. Откуда и с фига ли?
Шо, опять? На очередной круг без меня. Именно на порядок.

Двухъядерник возьмите, получите желаемое!
???

DMA без проблем запихнет килобайт в BSRR
Этот килобайт конечно же из воздуха материализуется? А в 3 разных BSRR распихает?

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Вт дек 29, 2020 06:36:51

Чего не понятно? Берете что-нибудь 2-ядерное, второго можете использовать как "DMA выполняющий код". Ну там кинуть ему пакет - закопируй от сих до сих! Или что там. Так, кстати, иногда делают. Правда все-же не как замену DMA, скорее управление питанием, offload быстрых дергов с основного и проч. И это имеет больше смысла если там своя отдельная подсистема памяти и шины, а то по той же шине еще чей-то поток команд и данных уже как-то менее интересно и там желание "чтоб еще и код выполнять умел" становится багом - поток команд шину грузит.

Этот килобайт конечно же из воздуха материализуется? А в 3 разных BSRR распихает?

Из флеша или RAM, естественно. В три - не распихает, фокус с своими ограничениями. Однако и с одним BSRR можно здорово поприкалываться, предоставив DMA ворочать лапки и ... занявшись чем-нибудь другим. Параллельно с этим вообще. Оно как бы не всегда катит, но так можно - например полностью аппаратный PWM шириной в порт сделать. Или сколько там хотелось. А формировка констант заполнения этого ничем не будет принципиально отличаться от других операций с BSRR. А высокие абстракции это круто, но на это уже совсем не похоже. И если чего-то такого захочется - заведем две разных абстракции для одного и того же?

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Вт дек 29, 2020 07:48:12

iddqd, вы так лихо ворвались со своим DMA в тему управления списками пинов, да ещё заочно объявив себя победителем. При этом повторить, худо бедно, но работающий пример Dimon456 тупо не сможете.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Вт дек 29, 2020 08:55:24

VladislavS, этот топик "виноват" в том что я задумался про "размер кода" и в результате случайно понял что иногда кода может и не быть совсем, если dma использовать. Так что иногда в споре рождаются неплохие идеи...

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Чт дек 31, 2020 23:21:14

Поигрался я с идеей iddqd, есть 2 варианта:
1 вариант, когда пины располагаются на одном порту, не важно в какой последовательности.
ОЗУ на один пин 4 байта, на 8 пинов 32 байта.
Если хранить картинку 256*256 точек, да в добавок в цветном изображении, параллельный порт 8 пинов, 256*256*3*32 = 6.291.456 байт.?
Ну как так можно без кода обойтись? Ведь еще сжать картинку можно, без кода ни как.
1 вариант не интересен, обычный дма, буфер, чего тут интересного.

2 вариант, это когда на разных BSRR.
Проблема: ни как не поменять значение в регистре CPAR
Код:
A   0x40010810
B   0x40010C10
C   0x40011010
без выключения канала.
Значит дма будем запускать только на один пин, а в прерывании выключать канал,
подсовывать адрес и данные и заново включать канал.
Ну поморгать светодиодами в реальном железе я поморгал, ну нету у меня логических анализаторов что бы посмотреть что в реальности происходит, но как бы в отладчике - вроде все верно моргает.
Вот код самого прерывания
Самое главное - без кода ни как.
А теперь вопрос в практическом применении, для чего и за чем? И где тут выигрыш в скорости?

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Пт янв 01, 2021 01:53:02

С новым годом ногодрыги.
Если хранить картинку 256*256 точек, да в добавок в цветном изображении, параллельный порт 8 пинов, 256*256*3*32 = 6.291.456 байт.?
Ну как так можно без кода обойтись?

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

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Пт янв 01, 2021 02:22:58

Dimon456 прав: решать надо прикладные задачи, а там всё иначе.
То, что что-то можно якобы без кода - это неправильное мнение часто встречается у "батонокидателей" визуального программирования. Ну да, какой тут код, когда всё делает Cube MX...
iddqd, у Вас неверное представление о назначении DMA и особенно - о PWM. PWM в микроконтроллере это значительно больше, чем "ногодрыганье" с определенной частотой, и как только начнётся попытка реализовать его полноценную работу, и глянется на блок-схему, то на DMA останется минимум функционала.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Вс янв 03, 2021 09:31:11

Dimon456 прав: решать надо прикладные задачи, а там всё иначе.
Вот смотрите как он их решает. Я уже чуть выше цитировал этот код.
Код:
port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100101101001001000001010010100100);
Вместо записи трёх констант по трём адресам, доступным от одного базового по смещению, эта байда раскручивается в жуткий цикл. А всё из-за ограничений языка пргораммирования.

Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?

Вс янв 03, 2021 11:03:48

VladislavS, а ваш метод, С++, покажите ассемблер:
Переменная a объявлена как volatile и не статическая переменная,
цикл while скажет компилятору что функция будет использоваться многократно.

И на забывайте, что в СИ я то же могу использовать inline функцию.
Ответить