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

Кто любит RISC в жизни, заходим, не стесняемся.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение 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;?
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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]  
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS писал(а):Как тут можно не понять?
Ну не знаю

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

STRPL    R7,[R6, #+16]

GPIOA_BSRR	0x40010810	 
GPIOA_BRR	0x40010814
0x40010810 +16 = 0x40010820
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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). На скорость это не повлияет.
Реклама
Эиком - электронные компоненты и радиодетали
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение 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;
}
Вот ее можете покопать, выслушаю все предложения.
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

А ещё, мне кажется это оффтоп в данной теме.
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS писал(а):мне кажется
креститься надо.
VladislavS писал(а):это оффтоп в данной теме
как и все остальное начиная со второй странице, по теме ровно 0.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3944059#p3944059"]как и все остальное начиная со второй странице, по теме ровно 0.[/uquote]
Лично я на каждой странице вижу код на C/C++ с выхлопом на ассме и хотя в первую очередь он нужен для сравнения самих С и С++ между собой, но то же самое пришлось бы делать сравнивая их эффективность с ассмом.
iddqd
Нашел транзистор. Понюхал.
Сообщения: 156
Зарегистрирован: Вс сен 06, 2020 16:06:10

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

Сообщение 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, например. Мэинстрим, как ни крути, приходится учитывать.
Я ими не пользуюсь и не планирую.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение 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 код выполнять - приходите.
iddqd
Нашел транзистор. Понюхал.
Сообщения: 156
Зарегистрирован: Вс сен 06, 2020 16:06:10

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

Сообщение iddqd »

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

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

Сообщение 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 распихает?
iddqd
Нашел транзистор. Понюхал.
Сообщения: 156
Зарегистрирован: Вс сен 06, 2020 16:06:10

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

Сообщение iddqd »

Чего не понятно? Берете что-нибудь 2-ядерное, второго можете использовать как "DMA выполняющий код". Ну там кинуть ему пакет - закопируй от сих до сих! Или что там. Так, кстати, иногда делают. Правда все-же не как замену DMA, скорее управление питанием, offload быстрых дергов с основного и проч. И это имеет больше смысла если там своя отдельная подсистема памяти и шины, а то по той же шине еще чей-то поток команд и данных уже как-то менее интересно и там желание "чтоб еще и код выполнять умел" становится багом - поток команд шину грузит.
Этот килобайт конечно же из воздуха материализуется? А в 3 разных BSRR распихает?
Из флеша или RAM, естественно. В три - не распихает, фокус с своими ограничениями. Однако и с одним BSRR можно здорово поприкалываться, предоставив DMA ворочать лапки и ... занявшись чем-нибудь другим. Параллельно с этим вообще. Оно как бы не всегда катит, но так можно - например полностью аппаратный PWM шириной в порт сделать. Или сколько там хотелось. А формировка констант заполнения этого ничем не будет принципиально отличаться от других операций с BSRR. А высокие абстракции это круто, но на это уже совсем не похоже. И если чего-то такого захочется - заведем две разных абстракции для одного и того же?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

iddqd, вы так лихо ворвались со своим DMA в тему управления списками пинов, да ещё заочно объявив себя победителем. При этом повторить, худо бедно, но работающий пример Dimon456 тупо не сможете.
iddqd
Нашел транзистор. Понюхал.
Сообщения: 156
Зарегистрирован: Вс сен 06, 2020 16:06:10

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

Сообщение iddqd »

VladislavS, этот топик "виноват" в том что я задумался про "размер кода" и в результате случайно понял что иногда кода может и не быть совсем, если dma использовать. Так что иногда в споре рождаются неплохие идеи...
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение 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 = количеству пинов
Самое главное - без кода ни как.
А теперь вопрос в практическом применении, для чего и за чем? И где тут выигрыш в скорости?
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

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

Сообщение AVI-crak »

С новым годом ногодрыги.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3951622#p3951622"]Если хранить картинку 256*256 точек, да в добавок в цветном изображении, параллельный порт 8 пинов, 256*256*3*32 = 6.291.456 байт.?
Ну как так можно без кода обойтись?[/uquote]
Для того чтобы графику в жк индикатор писать - нужно дма вместе с таймером использовать.
BlackKilkennyCat
Собутыльник Кота
Сообщения: 2905
Зарегистрирован: Ср ноя 29, 2017 06:58:50

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

Сообщение BlackKilkennyCat »

Dimon456 прав: решать надо прикладные задачи, а там всё иначе.
То, что что-то можно якобы без кода - это неправильное мнение часто встречается у "батонокидателей" визуального программирования. Ну да, какой тут код, когда всё делает Cube MX...
iddqd, у Вас неверное представление о назначении DMA и особенно - о PWM. PWM в микроконтроллере это значительно больше, чем "ногодрыганье" с определенной частотой, и как только начнётся попытка реализовать его полноценную работу, и глянется на блок-схему, то на DMA останется минимум функционала.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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

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

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

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

Сообщение Dimon456 »

VladislavS, а ваш метод, С++, покажите ассемблер:
Спойлер

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

volatile auto a = 0b00100101101001001000001010010100100;

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

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

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

Вернуться в «ARM»