Страница 11 из 15
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 15:28:10
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
Есть еще один метод, но он посложнее будет.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 15:34:12
Eddy_Em
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942080#p3942080"]Если и начинать изучать С++ это надо начинать с буквы А и года 4 зубрить.[/uquote]
Сдается мне, что четырех лет не хватит!
Это С можно за полгода спокойно изучить. А вот С++…
И при этом вообще не видно никакой выгоды над С! Зато тексты исходников получаются на порядок-два сложней, компилируются они значительно дольше, да еще и неприятным "бонусом" является необходимость каждый год изучать, что там нового всякие козлы в С++ привнесли! Зато С стабилен, и выучив его один раз, можно пользоваться всю жизнь!!!
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 15:54:33
Reflector
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942330#p3942330"]Не знаю поддерживает ли GCC uint128_t?[/uquote]
Не поддерживает, а иногда было бы полезно, в основном на C++, т.к. там такой тип можно использовать на стадии компиляции.
По коду... Указатель - 4 байта, 8 пинов - 1 байт, итого 5, но по умолчанию структура выровняется и будет 8 байт на пин, а для M0, из-за отсутствия невыровненного доступа придется самому дополнять до 8 байт. Опять же в коде инициализация пинов для F1, если взять любую другую серию, то ее придется переделать и общий размер станет еще больше. У меня был байт на пин, хотя будет немного медленнее, что не существенно для и так в десятки раз более медленного подхода. И с классами в каждом новом проекте придется написать всего несколько строк, сама либа неизменна и просто копируется между проектами.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 18:19:58
VladislavS
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942330#p3942330"]
Пусть это и далеко не эффективный код, но он работает, и прекрасно работает.[/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]Стандарт раз в три года обновляют. Так редко "вкусняшки" завозят. При этом новое обратно совместимо со старым. Никто не заставляет сразу всё новое применять. Можно постепенно расширять границы.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 20:28:13
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 фпс на параллельном интерфейсе - ну не знаю. Проще, по моему, купить готовый, дешевле выйдет во много раз.
Если вы хотите преподнести С++ преподносите в каком нибудь другом формате, а подергать одним выводом, поморгать светодиодом, и для этого что? городить целый класс?
Проще скачать с инета готовую библиотеку и там уже разбираться.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 21:03:14
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]Кто-то же её должен написать? А если все будут только скачивать?
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 21:20:50
Dimon456
VladislavS писал(а):Кто-то же её должен написать?
Наверно кто-то должен написать, может, вы?
VladislavS писал(а):А если все будут только скачивать?
В большинстве случаев так и делают.
Вы еще предложите fat с нуля написать, будет интересно.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 21:35:08
VladislavS
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942534#p3942534"]Наверно кто-то должен написать, может, вы?[/uquote]Пошёл второй шнурок гладить
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942534#p3942534"]Вы еще предложите fat с нуля написать, будет интересно.[/uquote]И чего в нём интересного? На один вечер скушного кодинга по спецификации.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 21:42:19
Dimon456
VladislavS писал(а):И чего в нём интересного? На один вечер скушного кодинга по спецификации.
Не, одним это дано, а другим нет. Мне это не дано, я научился только готовое использовать.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 21:46:10
AVI-crak
Я вот могу написать, но никто не просит. Могу утюг для VladislavS подогнать, для ускорения.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Ср дек 16, 2020 23:04:46
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...
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 06:00:47
Dimon456
Reflector писал(а):Было 8 байт на пин и осталось 8 байт на пин.
Было 16 байт на пин. Не важно.
Reflector писал(а):на mega128
была запаяна на плате, я просто отрезал лишнее. Фото приложить?
мага8 в дип корпусе.
Reflector писал(а):максимум опустился до 20-ти
Ценник играет важную роль.
А как то 15$ за кусок платы 10*10 я брать точно не буду. Сам изготовить этот кусок платы я то же не смогу, из материалов у меня текстолит и рапидограф, даже принтера нет, так что шаг в 0.8mm я точно не осилю.
По этому и пишу, из-за одного вывода (пина), что бы поморгать светодиодом, городить какой-то класс ... я точно не собираюсь.
Если вы хотите преподнести С++ преподносите в каком нибудь другом формате, spi, i2c, а то люди всякий hal да cmsis используют, да в добавок мало примеров, чего только i2c в F030 стоит.
Вот на это упор делайте, может кто и заинтересуется. А вы ...
VladislavS писал(а):не может на С передать в функцию список пинов эффективно
Да кому это нужно? Это, в первую очередь, вам нужнее, а не мне.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 08:16:53
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]У меня при общении с вами возникает устойчивое ощущение, что я вам должен. Не припомню что-то такого.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 14:11:34
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 ничем принципиально от класса портов не отличаются кроме того, что они значительно проще, потому никакого нового формата не будет.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 16:21:43
Dimon456
VladislavS писал(а):Приходят такие студенты первого курса на лекцию по матану и с порога профессору:
Не знаю как там дела с профессором обстоят, у меня образование 5 классов церковно-приходской, и те под мостом, в одной руке коньки в другой клюшка. То есть я не был знаком с профессором.
VladislavS писал(а):Вы сначала пинами дёргать не через ODR научитесь.
А что не так с ODR?
VladislavS писал(а):что я вам должен.
Не, вы мне ни чего не должны.
Reflector, мне пока не попадались платы с STM на борту.
Платы с Атмегой с какого-то оборудования Российского производства, на платах Индезит какие-то другие МК стоят.
Переходник для lqfp32, шибко не рылся у китайцев, но комплект из 5шт 1,35$ +доставка 0,82$ = итог 2,17$, какие 20 центов?
А что за STM в таком корпусе?
Может быть, когда нибудь. А пока, лень, постарел я, лет так 10-15 назад бы, лень, я танк покатаю.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 18:05:33
VladislavS
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942907#p3942907"]А что не так с ODR?[/uquote]Вот этот ваш код
Код: Выделить всё
if (data & s)
*p->port |= p->or;
else
*p->port &= ~(p->or);
можно сократить в три раза.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 20:13:58
Dimon456
VladislavS писал(а):можно сократить в три раза
Давайте, сократите в три раза.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 20:52:53
VladislavS
[uquote="Dimon456",url="/forum/viewtopic.php?p=3943012#p3943012"]Давайте, сократите в три раза.[/uquote]
[uquote="Dimon456",url="/forum/viewtopic.php?p=3942907#p3942907"]Не, вы мне ни чего не должны.[/uquote]
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 21:38:06
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: да и, код не мой, я просто его использую, он максимально сокращен, больше сокращать тут не чего.
Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт дек 17, 2020 22:23:47
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]Хочу заметить, что я уже тоже не мальчик и просто так слова на ветер не бросаю.