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

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

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

Сообщение Dimon456 »

VladislavS писал(а):или будет неэффективная команда записи в память? Я думаю второе.
Правильно думаете
СпойлерНа 64 бита, с возможностью выбора 8-16-32-64, в любой последовательности пинов.
Не знаю поддерживает ли GCC uint128_t?

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

#define k_bit	uint64_t//64бита uint32_t-32бита uint16_t-16бита uint8_t-8бита

typedef struct{
   volatile uint32_t * port;
   k_bit            or;
} port_pin;


#define PORTA (GPIOA->ODR)
#define PORTB (GPIOB->ODR)
#define PORTC (GPIOC->ODR)


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

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

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

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)
         *p->port |= p->or;
         else
            *p->port &= ~(p->or);
      p++;
   }
}

int main(void)
{

	RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;

	GPIOA->CRL &= ~GPIO_CRL_CNF;
	GPIOA->CRL |= GPIO_CRL_MODE;

	GPIOA->CRH &= ~GPIO_CRH_CNF;
	GPIOA->CRH |= GPIO_CRH_MODE;

	GPIOB->CRL &= ~GPIO_CRL_CNF;
	GPIOB->CRL |= GPIO_CRL_MODE;

	GPIOB->CRH &= ~GPIO_CRH_CNF;
	GPIOB->CRH |= GPIO_CRH_MODE;

	GPIOC->CRL &= ~GPIO_CRL_CNF;
	GPIOC->CRL |= GPIO_CRL_MODE;

	GPIOC->CRH &= ~GPIO_CRH_CNF;
	GPIOC->CRH |= GPIO_CRH_MODE;

	port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100001001001000001000010000100100);
	port_write (pins, sizeof(pins)/sizeof(port_pin), 0b00100101101001001000001010010100100);
	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);

    while(1)
    {
    }
}
да же еще без ошибок собирается.
Честно говоря, до последнего не думал что будет работать.
Пусть это и далеко не эффективный код, но он работает, и прекрасно работает.

На F103

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

Program Size:
      text	   data	    bss	    dec	    hex	filename
      1456	      0	   1024	   2480	    9b0	port_103.elf
Есть еще один метод, но он посложнее будет.
Реклама
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942080#p3942080"]Если и начинать изучать С++ это надо начинать с буквы А и года 4 зубрить.[/uquote]
Сдается мне, что четырех лет не хватит!
Это С можно за полгода спокойно изучить. А вот С++…
И при этом вообще не видно никакой выгоды над С! Зато тексты исходников получаются на порядок-два сложней, компилируются они значительно дольше, да еще и неприятным "бонусом" является необходимость каждый год изучать, что там нового всякие козлы в С++ привнесли! Зато С стабилен, и выучив его один раз, можно пользоваться всю жизнь!!!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942330#p3942330"]Не знаю поддерживает ли GCC uint128_t?[/uquote]
Не поддерживает, а иногда было бы полезно, в основном на C++, т.к. там такой тип можно использовать на стадии компиляции.
По коду... Указатель - 4 байта, 8 пинов - 1 байт, итого 5, но по умолчанию структура выровняется и будет 8 байт на пин, а для M0, из-за отсутствия невыровненного доступа придется самому дополнять до 8 байт. Опять же в коде инициализация пинов для F1, если взять любую другую серию, то ее придется переделать и общий размер станет еще больше. У меня был байт на пин, хотя будет немного медленнее, что не существенно для и так в десятки раз более медленного подхода. И с классами в каждом новом проекте придется написать всего несколько строк, сама либа неизменна и просто копируется между проектами.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942330#p3942330"]

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

#define PORTA (GPIOA->ODR)
Пусть это и далеко не эффективный код, но он работает, и прекрасно работает.[/uquote]Хоть бы через BSRR сделали.

Добавлено after 32 minutes 1 second:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3942336#p3942336"]И при этом вообще не видно никакой выгоды над С[/uquote]Посмотри какую дичь Dimon456 сообщением выше сотворил. Всё потому что не может на С передать в функцию список пинов эффективно.

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3942336#p3942336"]Зато тексты исходников получаются на порядок-два сложней,[/uquote]Опять таки, несколько сообщений выше Reflector пример с std::size(pins) приводил. Сильно наглядней читается. Да и вообще код на уровне использования классов более читаемый получается. Вон Dimon456 с первого раза правильно применил шаблонный класс PinList - всё интуитивно понятно. Внутри библиотек, конечно, посложнее, но это лишь от отсутствия знаний.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3942336#p3942336"]компилируются они значительно дольше,[/uquote]Да уж... 10-15 или 20 секунд прошивка собирается так принципиально. Вот когда FPGA 10-15 или 20 минут разводится, тут уже подумаешь стоит ли её по любому чиху перекомпилировать. Прошивка для микроконтроллера просто мухой компилируется.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3942336#p3942336"]да еще и неприятным "бонусом" является необходимость каждый год изучать, что там нового всякие козлы в С++ привнесли![/uquote]Стандарт раз в три года обновляют. Так редко "вкусняшки" завозят. При этом новое обратно совместимо со старым. Никто не заставляет сразу всё новое применять. Можно постепенно расширять границы.
Реклама
Эиком - электронные компоненты и радиодетали
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS писал(а):пример с std::size(pins) приводил.
size() - функция компилятора, после компиляции это будет какое-то число.
size(pins) != size(pin_ns)/size(port_pin)
size(pins) - выдаст количество байт в массиве.
size(pin_ns)/size(port_pin) - выдаст, скажем так, количество строк.
Reflector писал(а):По коду... Указатель - 4 байта, 8 пинов - 1 байт, итого 5
Структуру я поменял
Спойлер

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

typedef struct{
   volatile uint32_t * port;
   uint16_t            or;
} port_pin;
uint16_t определяет количество пинов в порту, а их 16 всего, 0-15.
Итого, по карте памяти, указатель 4 байта, 2 байта на порт, + выравнивание 2 байта, и того 8 байт.

Да же не в этом суть, это частный случай,
максимум что я буду иметь - это 20 выводной корпус F030, ну может быть F042,
а там 3 пина питание 2 еще куда-то, 2 может на кварц, и того - ни чего не остается.
У вы, паяльником, чем тазы паяют, 60 выводной корпус, да еще в добавок с таким мелким шагом и не в маем возрасте - это не запаяешь. Да еще и плату надо изготовить.
Уже давно почти все цепляют то по spi то по i2c, а делать на этих чипах какой-то "видео-регистратор" с 60 фпс на параллельном интерфейсе - ну не знаю. Проще, по моему, купить готовый, дешевле выйдет во много раз.

Если вы хотите преподнести С++ преподносите в каком нибудь другом формате, а подергать одним выводом, поморгать светодиодом, и для этого что? городить целый класс?
Проще скачать с инета готовую библиотеку и там уже разбираться.
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942507#p3942507"]size() - функция компилятора[/uquote]Только не size(), а sizeof().
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942507#p3942507"]size(pin_ns)/size(port_pin) - выдаст, скажем так, количество строк.[/uquote]std::size(pin_ns) выдаст то же самое.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942507#p3942507"]Если вы хотите преподнести С++ преподносите в каком нибудь другом формате, а подергать одним выводом, поморгать светодиодом, и для этого что?[/uquote]Для понимания. Всегда надо от простого к сложному переходить.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942507#p3942507"]городить целый класс?[/uquote]А почему нет? Что страшного в классе? Даже на простом светодиоде это уже имеет смысл. Вы описываете поведение этого объекта абстрагировавшись от того как и куда он подключен. Код получается универсальным. В программе вы просто инстанцируете его на каком-то порту. И не важно какой это микроконтроллер, какая полярность включения - всё будет работать как задумано. Или, например, типичная проблема С-программиста - сделать inline функцию. Начинают лепить макросы LED1_ON, LED1_OFF, LED2_ON и т.д. С классами решается на раз два.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942507#p3942507"]Проще скачать с инета готовую библиотеку и там уже разбираться.[/uquote]Кто-то же её должен написать? А если все будут только скачивать?
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS писал(а):Кто-то же её должен написать?
Наверно кто-то должен написать, может, вы?
VladislavS писал(а):А если все будут только скачивать?
В большинстве случаев так и делают.
Вы еще предложите fat с нуля написать, будет интересно.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942534#p3942534"]Наверно кто-то должен написать, может, вы?[/uquote]Пошёл второй шнурок гладить :)))
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942534#p3942534"]Вы еще предложите fat с нуля написать, будет интересно.[/uquote]И чего в нём интересного? На один вечер скушного кодинга по спецификации.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS писал(а):И чего в нём интересного? На один вечер скушного кодинга по спецификации.
Не, одним это дано, а другим нет. Мне это не дано, я научился только готовое использовать.
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

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

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

Я вот могу написать, но никто не просит. Могу утюг для VladislavS подогнать, для ускорения.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942507#p3942507"]Структуру я поменял
Спойлер

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

typedef struct{
   volatile uint32_t * port;
   uint16_t            or;
} port_pin;
uint16_t определяет количество пинов в порту, а их 16 всего, 0-15.
Итого, по карте памяти, указатель 4 байта, 2 байта на порт, + выравнивание 2 байта, и того 8 байт.[/uquote]
Было 8 байт на пин и осталось 8 байт на пин. Если это попытка передать сразу 16 пинов в виде маски, то работать не будет в силу невозможности таким образом передать информацию о порядке этих пинов.
Да же не в этом суть, это частный случай,
максимум что я буду иметь - это 20 выводной корпус F030, ну может быть F042,
а там 3 пина питание 2 еще куда-то, 2 может на кварц, и того - ни чего не остается.
Насколько я помню плеер ARV рассчитанный на mega328 ты запускал на mega128 и еще какие-то часы собирал на mega8, а тут вдруг с 64-х и 28-32-х ног максимум опустился до 20-ти :) Причем у LQFP32 шаг 0.8mm, а у TSSOP20 - 0.65mm...
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

Reflector писал(а):Было 8 байт на пин и осталось 8 байт на пин.
Было 16 байт на пин. Не важно.
Reflector писал(а):на mega128
была запаяна на плате, я просто отрезал лишнее. Фото приложить?
мага8 в дип корпусе.
Reflector писал(а):максимум опустился до 20-ти
Ценник играет важную роль.
А как то 15$ за кусок платы 10*10 я брать точно не буду. Сам изготовить этот кусок платы я то же не смогу, из материалов у меня текстолит и рапидограф, даже принтера нет, так что шаг в 0.8mm я точно не осилю.

По этому и пишу, из-за одного вывода (пина), что бы поморгать светодиодом, городить какой-то класс ... я точно не собираюсь.

Если вы хотите преподнести С++ преподносите в каком нибудь другом формате, spi, i2c, а то люди всякий hal да cmsis используют, да в добавок мало примеров, чего только i2c в F030 стоит.
Вот на это упор делайте, может кто и заинтересуется. А вы ...
VladislavS писал(а):не может на С передать в функцию список пинов эффективно
Да кому это нужно? Это, в первую очередь, вам нужнее, а не мне.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942691#p3942691"]Если вы хотите преподнести С++ преподносите в каком нибудь другом формате, spi, i2c, а то люди всякий hal да cmsis используют, да в добавок мало примеров, чего только i2c в F030 стоит.[/uquote]Перечитайте название темы! Мы показываем примеры кода с результатом компиляции в асм, которые отвечают на поставленный вопрос. Если у вас проблемы с I2C, создайте тему да обсуждайте. Чего там такого сложного то? Класс I2C у меня что-то около 3-4 экранов кода.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942691#p3942691"]Вот на это упор делайте, может кто и заинтересуется. А вы ...[/uquote]Приходят такие студенты первого курса на лекцию по матану и с порога профессору: чего ты нам про производные втираешь, давай сразу преобразование Лапласа. Давай уравнение Шрёдингера - требуют у физика. Вы сначала пинами дёргать не через ODR научитесь.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942691#p3942691"]Да кому это нужно? Это, в первую очередь, вам нужнее, а не мне.[/uquote]У меня при общении с вами возникает устойчивое ощущение, что я вам должен. Не припомню что-то такого.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942691#p3942691"]была запаяна на плате, я просто отрезал лишнее. Фото приложить?[/uquote]
Что это меняет? Устаревший F103 популярен в первую очередь из-за дешевых Blue Pill и в целом плат где мк уже уже запаян в избытке.
мага8 в дип корпусе.
Ценник играет важную роль.
А как то 15$ за кусок платы 10*10 я брать точно не буду. Сам изготовить этот кусок платы я то же не смогу, из материалов у меня текстолит и рапидограф, даже принтера нет, так что шаг в 0.8mm я точно не осилю.
Шаг 0.8 не осилю, а 0.65 осилю? $15 за кусок платы жалко, 20 центов на переходник для lqfp32 тоже жалко?
Если вы хотите преподнести С++ преподносите в каком нибудь другом формате, spi, i2c, а то люди всякий hal да cmsis используют, да в добавок мало примеров, чего только i2c в F030 стоит.
Классы для SPI/USART/I2C ничем принципиально от класса портов не отличаются кроме того, что они значительно проще, потому никакого нового формата не будет.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS писал(а):Приходят такие студенты первого курса на лекцию по матану и с порога профессору:
Не знаю как там дела с профессором обстоят, у меня образование 5 классов церковно-приходской, и те под мостом, в одной руке коньки в другой клюшка. То есть я не был знаком с профессором.
VladislavS писал(а):Вы сначала пинами дёргать не через ODR научитесь.
А что не так с ODR?
VladislavS писал(а):что я вам должен.
Не, вы мне ни чего не должны.

Reflector, мне пока не попадались платы с STM на борту.
Платы с Атмегой с какого-то оборудования Российского производства, на платах Индезит какие-то другие МК стоят.

Переходник для lqfp32, шибко не рылся у китайцев, но комплект из 5шт 1,35$ +доставка 0,82$ = итог 2,17$, какие 20 центов?
А что за STM в таком корпусе?
Может быть, когда нибудь. А пока, лень, постарел я, лет так 10-15 назад бы, лень, я танк покатаю.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3942907#p3942907"]А что не так с ODR?[/uquote]Вот этот ваш код

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

if (data & s)
  *p->port |= p->or;
else
  *p->port &= ~(p->or);
можно сократить в три раза.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS писал(а):можно сократить в три раза
Давайте, сократите в три раза.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3943012#p3943012"]Давайте, сократите в три раза.[/uquote]
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942907#p3942907"]Не, вы мне ни чего не должны.[/uquote]
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

VladislavS, а может потому что нельзя сократить, только усложнить?

Давайте я попробую:
Помнится вы что-то писали про регистр BSRR.
Регистр BSRR 32 битный, я должен хранить 32 битное значение, условно BR(31-16)+BS(15-0) бит.
Установленный бит BS имеет приоритет перед BR, что бы BR сработал я должен сбросить BS.
Хорошо бы использовать регистр BRR для сброса, но для этого потребуется хранить еще один 4-ех байтный указатель.

Так что сократить не получится, только усложнить.
Спойлер

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

typedef struct{
   volatile uint32_t * port;
   uint32_t            or;
   uint32_t            and;
} port_pin;

#define PORTA (GPIOA->BSRR)
#define PORTB (GPIOB->BSRR)
#define PORTC (GPIOC->BSRR)

#define pn(p,b) {&PORT ## p, (1<<b), (1<<(b+16))}

      if (data & s)
         *p->port |= p->or;
         else {
         *p->port |= p->and;
      	 *p->port &= ~(p->or); }
PS: да и, код не мой, я просто его использую, он максимально сокращен, больше сокращать тут не чего.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=3943052#p3943052"]Хорошо бы использовать регистр BRR для сброса, но для этого потребуется хранить еще один 4-ех байтный указатель.[/uquote]В ветке про асм стыдно не знать, что доступ к BSRR и BRR можно через один указатель получить.
[uquote="Dimon456",url="/forum/viewtopic.php?p=3943052#p3943052"]Так что сократить не получится, только усложнить.[/uquote]Получится. И именно в самом важном месте этого метода - в теле цикла. Пробуйте и смотрите листинги.

ЗЫ: Чуть не забыл, даже без BRR можно, там где его нет.
Спойлер[uquote="Dimon456",url="/forum/viewtopic.php?p=3943052#p3943052"]VladislavS, а может потому что нельзя сократить, только усложнить?[/uquote]Хочу заметить, что я уже тоже не мальчик и просто так слова на ветер не бросаю.
Ответить

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