Страница 13 из 15

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

Добавлено: Сб дек 19, 2020 08:58:28
Dimon456
Тихо, уважаемый, тихо.
Я сравнивал в протеусе время измерения, на какой частоте было - мне все равно на какой частоте он там работает.

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

Далее, это ваше?

Код: Выделить всё

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
VladislavS
[uquote="Dimon456",url="/forum/viewtopic.php?p=3943925#p3943925"]А теперь вопрос, на какой адрес вот это

Код: Выделить всё

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

И ещё небольшое наблюдение. Вот этот вызов

Код: Выделить всё

port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100101101001001000001010010100100);
это запись трёх констант в BSRR портов A,B,C. Это, на вскидку, около 16 тактов процессора или 0.2 мкс на вашем f103.
СпойлерКак тут можно не понять?

Код: Выделить всё

//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]  

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

Добавлено: Сб дек 19, 2020 09:30:03
Dimon456
VladislavS писал(а):Как тут можно не понять?
Ну не знаю

Код: Выделить всё

STRPL    R7,[R6, #+16]

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

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

Добавлено: Сб дек 19, 2020 09:36:20
VladislavS
[uquote="Dimon456",url="/forum/viewtopic.php?p=3943937#p3943937"]GPIOA_BRR 0x40010814[/code] 0x40010810 +16 = 0x40010820[/uquote]Да, вы правы, на F103 действительно BRR идёт сразу за BSRR. Я посмотрел RM от другого контроллера. Можете исправить на *(p->bsrr+1). На скорость это не повлияет.

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

Добавлено: Сб дек 19, 2020 09:55:49
Dimon456
По этому у меня в HardFault и падало, я не посмотрел что там по этому адресу 0x40010820 у F103 расположено.

Еще одну функцию написал, чтение списка пинов
Спойлер

Код: Выделить всё

uint32_t port_read (volatile const port_pin *p, uint8_t a)
{   uint32_t data=0;
      for(uint8_t i=0; i<a; i++){
    	  if((((GPIO_TypeDef *) p->port)->IDR & p->or)) data |= (1<<(i));
      p++;
   }
   return data;
}
Вот ее можете покопать, выслушаю все предложения.

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

Добавлено: Сб дек 19, 2020 10:01:23
VladislavS
Спасибо за разрешение! Но я воздержусь.

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

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

Добавлено: Сб дек 19, 2020 14:18:08
Dimon456
VladislavS писал(а):мне кажется
креститься надо.
VladislavS писал(а):это оффтоп в данной теме
как и все остальное начиная со второй странице, по теме ровно 0.

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

Добавлено: Сб дек 19, 2020 14:58:54
Reflector
[uquote="Dimon456",url="/forum/viewtopic.php?p=3944059#p3944059"]как и все остальное начиная со второй странице, по теме ровно 0.[/uquote]
Лично я на каждой странице вижу код на C/C++ с выхлопом на ассме и хотя в первую очередь он нужен для сравнения самих С и С++ между собой, но то же самое пришлось бы делать сравнивая их эффективность с ассмом.

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

Добавлено: Пн дек 28, 2020 09:48:21
iddqd
[uquote="VladislavS",url="/forum/viewtopic.php?p=3937811#p3937811"]А теперь вставь этот код в прерывание, допустим, где содержимое регистров за тебя никто раньше не загрузил. А примени в другой единице трансляции, а... Да много ли ещё чего бывает. Компилятор не устаёт.[/uquote] В принципе пойнт, но не 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
VladislavS
iddqd, в чём вопрос то?

Добавлено after 8 minutes 18 seconds:
[uquote="iddqd",url="/forum/viewtopic.php?p=3949709#p3949709"]А тут убедить компилер на эффективный код даже для группы пинов - как 2 байта переслать.[/uquote]Если вас устраивает проигрыш в скорости на порядок, то и ну его на.
[uquote="iddqd",url="/forum/viewtopic.php?p=3949709#p3949709"]Более того - попался мне DMA.[/uquote]Когда научите DMA код выполнять - приходите.

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

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

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

Добавлено: Пн дек 28, 2020 15:17:11
VladislavS
[uquote="iddqd",url="/forum/viewtopic.php?p=3949869#p3949869"]У меня никакого проигрыша в скорости на порядок совершенно точно не будет. Откуда и с фига ли?[/uquote]Шо, опять? На очередной круг без меня. Именно на порядок.

[uquote="iddqd",url="/forum/viewtopic.php?p=3949869#p3949869"]Двухъядерник возьмите, получите желаемое![/uquote]???

[uquote="iddqd",url="/forum/viewtopic.php?p=3949869#p3949869"]DMA без проблем запихнет килобайт в BSRR[/uquote]Этот килобайт конечно же из воздуха материализуется? А в 3 разных BSRR распихает?

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

Добавлено: Вт дек 29, 2020 06:36:51
iddqd
Чего не понятно? Берете что-нибудь 2-ядерное, второго можете использовать как "DMA выполняющий код". Ну там кинуть ему пакет - закопируй от сих до сих! Или что там. Так, кстати, иногда делают. Правда все-же не как замену DMA, скорее управление питанием, offload быстрых дергов с основного и проч. И это имеет больше смысла если там своя отдельная подсистема памяти и шины, а то по той же шине еще чей-то поток команд и данных уже как-то менее интересно и там желание "чтоб еще и код выполнять умел" становится багом - поток команд шину грузит.
Этот килобайт конечно же из воздуха материализуется? А в 3 разных BSRR распихает?
Из флеша или RAM, естественно. В три - не распихает, фокус с своими ограничениями. Однако и с одним BSRR можно здорово поприкалываться, предоставив DMA ворочать лапки и ... занявшись чем-нибудь другим. Параллельно с этим вообще. Оно как бы не всегда катит, но так можно - например полностью аппаратный PWM шириной в порт сделать. Или сколько там хотелось. А формировка констант заполнения этого ничем не будет принципиально отличаться от других операций с BSRR. А высокие абстракции это круто, но на это уже совсем не похоже. И если чего-то такого захочется - заведем две разных абстракции для одного и того же?

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

Добавлено: Вт дек 29, 2020 07:48:12
VladislavS
iddqd, вы так лихо ворвались со своим DMA в тему управления списками пинов, да ещё заочно объявив себя победителем. При этом повторить, худо бедно, но работающий пример Dimon456 тупо не сможете.

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

Добавлено: Вт дек 29, 2020 08:55:24
iddqd
VladislavS, этот топик "виноват" в том что я задумался про "размер кода" и в результате случайно понял что иногда кода может и не быть совсем, если dma использовать. Так что иногда в споре рождаются неплохие идеи...

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

Добавлено: Чт дек 31, 2020 23:21:14
Dimon456
Поигрался я с идеей 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
без выключения канала.
Значит дма будем запускать только на один пин, а в прерывании выключать канал,
подсовывать адрес и данные и заново включать канал.
Ну поморгать светодиодами в реальном железе я поморгал, ну нету у меня логических анализаторов что бы посмотреть что в реальности происходит, но как бы в отладчике - вроде все верно моргает.
Вот код самого прерывания
Спойлер

Код: Выделить всё

const port_pin pins_out[] = {
		pn(A,0),
		pn(B,1),
		pn(C,2),
		pn(A,3),
		pn(B,4),
		pn(C,8),
		pn(C,6),
		pn(C,9),
		pn(C,5),
		pn(C,7)
};

Код: Выделить всё

void DMA1_Channel1_IRQHandler(void)
{	static uint32_t a=0;
	uint32_t isr = DMA1->ISR;
	DMA1->IFCR = isr;

	if(a++ == (sf(pins_out)-1)) a=0;
	DMA1_Channel1->CCR &= (~DMA_CCR1_EN);
	while (DMA1_Channel1->CCR & DMA_CCR1_EN);
	DMA1_Channel1->CNDTR = 1;
	DMA1_Channel1->CPAR = (uint32_t) &((GPIO_TypeDef *) pins_out[a].port)->BSRR;
	DMA1_Channel1->CMAR = (uint32_t) &data_dma[a];

	DMA1_Channel1->CCR |= DMA_CCR1_EN;
}
data_dma = количеству пинов
Самое главное - без кода ни как.
А теперь вопрос в практическом применении, для чего и за чем? И где тут выигрыш в скорости?

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

Добавлено: Пт янв 01, 2021 01:53:02
AVI-crak
С новым годом ногодрыги.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3951622#p3951622"]Если хранить картинку 256*256 точек, да в добавок в цветном изображении, параллельный порт 8 пинов, 256*256*3*32 = 6.291.456 байт.?
Ну как так можно без кода обойтись?[/uquote]
Для того чтобы графику в жк индикатор писать - нужно дма вместе с таймером использовать.

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

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

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

Добавлено: Вс янв 03, 2021 09:31:11
VladislavS
[uquote="BlackKilkennyCat",url="/forum/viewtopic.php?p=3951682#p3951682"]Dimon456 прав: решать надо прикладные задачи, а там всё иначе.[/uquote]Вот смотрите как он их решает. Я уже чуть выше цитировал этот код.

Код: Выделить всё

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

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

Добавлено: Вс янв 03, 2021 11:03:48
Dimon456
VladislavS, а ваш метод, С++, покажите ассемблер:
Спойлер

Код: Выделить всё

volatile auto a = 0b00100101101001001000001010010100100;

PinList<... напишите что нибудь в разноброс 35 пинов> pins1;

int main(void)
{
while (1)
      {
      pins1 = a++;
      }
}
Переменная a объявлена как volatile и не статическая переменная,
цикл while скажет компилятору что функция будет использоваться многократно.

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