Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706999#p3706999"]То есть, если Вам надо 200 МК для сбора данных, Вы вместо $6 потратите $200? :shock:[/uquote]
Вроде понятно объяснил... Я потрачу $0, потому что мне не нужны 200 мк для сбора данных и никто мне такое задание в принципе поручить не может.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

[uquote="Reflector",url="/forum/viewtopic.php?p=3706997#p3706997"]как на С задать[/uquote]
Для начала посмотрите на реализацию того кольцевого буфера, пример которого я привел. Вообще без указателей. А потом посчитайте, на сколько больше оперативки потребляет Ваш кольцевой буфер и мой )))
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706999#p3706999"]На STM32, особенно старших, использование С++ почти не влияет на производительность и размер кода.[/uquote]
Не обязательно иметь ARM чтобы использовать С++, для тех же AVR доступны последние версии gcc и если знать как писать, то разница с сишным кодом будет самая минимальная.
Для начала посмотрите на реализацию того кольцевого буфера, пример которого я привел. Вообще без указателей. А потом посчитайте, на сколько больше оперативки потребляет Ваш кольцевой буфер и мой )))
Разве я приводил свою реализацию кольцевого буфера? :) В качестве такового у меня выступает Deque, внутри массив и два индекса, у индексов тип uint32_t, причину сего расточительства применительно к ARM я описывал, в большинстве случаев можно было бы использовать uint8_t и обойтись двумя байтами. А там где пара индексов внутри каждого Node - это связный список, в эмбедде на С такое вообще пишут очень редко.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

ПростоНуб писал(а):То есть, если Вам надо 200 МК для сбора данных, Вы вместо $6 потратите $200?
6/200=0.03. Где это продаются МК за 3 цента с бесплатной доставкой? :) :)))
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706999#p3706999"]Среда C++ по жизни занимает оперативки больше, чем среда С, особенно с выключенным динамическим распределением памяти. Когда оперативки всего 128 байт - это очень заметно.[/uquote]С++ достаточно многогранен. Можно пользоваться только тем что наоборот экономит память. Я же не зря прошу простой пример на инициализацию ножек адептов кошерного С, вот и сравним.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

ПростоНуб писал(а):Начиная с 3.8 он существенно поумнел.
Все равно до gcc еще очень далеко!
ПростоНуб писал(а):Например, QT - великолепная и очень удобная штука.
Жуткая жирная дрянь. Абсолютно ненужная.
VladislavS писал(а):Давай PA0...PA3 - на выход LowSpeeed в нулевое состояние, а PA4...PA7 на выход HighSpeed в единицу.
Возьми, да посмотри, как это у меня на гитхабе сделано. Все элементарно! Настраиваем как-то так (для STM32F0 немного иначе — там периферия разумней сделана):

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

    // buzzer (PC13): pushpull output
    GPIOC->CRH = CRH(13, CNF_PPOUTPUT|MODE_SLOW);
    // Set leds (PB8) as opendrain output
    GPIOB->CRH = CRH(8, CNF_ODOUTPUT|MODE_SLOW) | CRH(9, CNF_ODOUTPUT|MODE_SLOW);
    // PPS pin (PA1) - input with weak pullup
    GPIOA->CRL = CRL(1, CNF_PUDINPUT|MODE_INPUT);
    // Set USB pullup (PA15) - opendrain output
    GPIOA->CRH = CRH(15, CNF_ODOUTPUT|MODE_SLOW);
А для ногодрыга у меня макросы вроде pin_toggle() или pin_clear. И, скажем, чтобы мыргать светодиодами, объявляю:

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

#define LED_blink()    do{if(LEDSon)pin_toggle(LED0_port, LED0_pin);}while(0)
#define LED_on()       do{if(LEDSon)pin_clear(LED0_port, LED0_pin);}while(0)
#define LED_off()      do{pin_set(LED0_port, LED0_pin);}while(0)
#define LED1_blink()   do{if(LEDSon)pin_toggle(LED1_port, LED1_pin);}while(0)
#define LED1_on()      do{if(LEDSon)pin_clear(LED1_port, LED1_pin);}while(0)
#define LED1_off()     do{pin_set(LED1_port, LED1_pin);}while(0)
Все легко и просто. И совершенно легко читаемо.

Для STM8 разницы не так уж много. Настройка:

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

    // PA: 1 - PU IN, 2,3 - PP OUT
    PA_DDR = GPIO_PIN2 | GPIO_PIN3;
    PA_CR1 = GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3;
и тоже макросы для для использования:

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

#define SET_TRIAC0()    PD_ODR |= GPIO_PIN2
#define RESET_TRIAC0()  PD_ODR &= ~GPIO_PIN2
#define SET_TRIAC1()    PC_ODR |= GPIO_PIN6
#define RESET_TRIAC1()  PC_ODR &= ~GPIO_PIN6
C++ — тупой недоязычок. Нет от него толку никакого!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707088#p3707088"]Все легко и просто. И совершенно легко читаемо.[/uquote]Ну если всё так легко, ну подыграй мне, напиши что я прошу. Просто если я это сделаю сам, то меня же обвинят во всех тяжких.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707088#p3707088"]C++ — тупой недоязычок. Нет от него толку никакого![/uquote]Ну вот и сравним.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Холивар ни о чём. Для СТМ8 давно всё есть:
Спойлер

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

// Инициализация. Превращается в три ассемблерные команды
#define	SPI_MOSIPORT	GPIOC	// define MCU MOSI pin
#define	SPI_MOSIPIN		7
#define	SPI_MOSI_PORT	PORTC7
#define	SPI_MOSI_PIN	PINC7

#define	SPI_SCKPORT		GPIOC	// define MCU SCK pin
#define	SPI_SCKPIN		5
#define	SPI_SCK_PORT	PORTC5
#define	SPI_SCK_PIN		PINC5

#define	SPI_SSPORT		GPIOC	// define MCU SS pin
#define	SPI_SSPIN	  	4
#define	SPI_SS_PORT	  PORTC4
#define	SPI_SS_PIN		PINC4

     41          /******************************************************************************
     42          * Инициализация SPI
     43          * программный режим работы из-за маппинга таймера
     44          ******************************************************************************/

   \                                 In section .far_func.text, align 1
     45          void spi_init (void)
     46          {
     47          	GPIO_ConfigOutput (SPI_MOSIPORT, SPI_MOSIPIN, PortLoSpeed, PortPushPull);
   \                     spi_init:
   \   000000 721E 500C    BSET      L:0x500c, #0x7
   \   000004 721E 500D    BSET      L:0x500d, #0x7
   \   000008 721F 500E    BRES      L:0x500e, #0x7
     48          	GPIO_ConfigOutput (SPI_SCKPORT, SPI_SCKPIN, PortLoSpeed, PortPushPull);
   \   00000C 721A 500C    BSET      L:0x500c, #0x5
   \   000010 721A 500D    BSET      L:0x500d, #0x5
   \   000014 721B 500E    BRES      L:0x500e, #0x5
     49          	GPIO_ConfigOutput (SPI_SSPORT, SPI_SSPIN, PortLoSpeed, PortPushPull);		//
   \   000018 7218 500C    BSET      L:0x500c, #0x4
   \   00001C 7218 500D    BSET      L:0x500d, #0x4
   \   000020 7219 500E    BRES      L:0x500e, #0x4
     50          	
     51          	SPI_MOSI_PORT = 0;
   \   000024 721F 500A    BRES      L:0x500a, #0x7
     52          	SPI_SCK_PORT = 0;
   \   000028 721B 500A    BRES      L:0x500a, #0x5
     53            SPI_SS_PORT = 0;	
   \   00002C 7219 500A    BRES      L:0x500a, #0x4
     54          }
   \   000030 87           RETF

Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="GARMIN",url="/forum/viewtopic.php?p=3707148#p3707148"]Холивар ни о чём. Для СТМ8 давно всё есть:[/uquote]
3 пина, 3 команды для инициализации каждого, только эти команды по 8 байт, итого 72 байта, что выглядит весьма далеким от оптимальной реализации.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

VladislavS писал(а): подыграй мне, напиши что я прошу
Я на троллинг стараюсь не вестись!
GARMIN писал(а):GPIO_ConfigOutput
Конечно, можно и такие макросы накалякать при желании.
Reflector писал(а):3 пина, 3 команды для инициализации каждого
Естественно: если пины на разных портах, то никак по-другому не сделать. Только три раза вызывать макрос: по разу на каждый порт.
А если все пины на одном порту, то один раз макрос можно вызвать.
Но такие макросы скрывают, что там происходит. Лучше, все-таки, так сильно не прятать нижний уровень!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707158#p3707158"]Естественно: если пины на разных портах, то никак по-другому не сделать. Только три раза вызывать макрос: по разу на каждый порт.[/uquote]
Стоп, 4 байта там на команду :) А порт один, нужно смотреть что там с командами, наверняка можно более эффективно проинитить все три пина за раз, тем более там по одному биту на режим.
Хотя наверно нет, было бы по 2 бита на режим, как у STM32, тогда множество BSET были бы уже не выгодны. В одной либе GPIO для STM32 видел подобный подход с применением Bit Banding, тоже получалась команда на бит, причем 2-х байтовая, но это было эффективно только для одного пина...
Последний раз редактировалось Reflector Ср сен 25, 2019 14:58:28, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Reflector писал(а):наверняка можно более эффективно проинитить все три пина за раз
Но в этом случае потеряется универсальность: а вдруг в другой реализации какой-то пин будет сидеть на другом порту?
В своих поделках я обычно так делаю: выношу все аппаратнозависимое в файлы hardware.h (всякие разные макросы, в т.ч. что я выше приводил) и hardware.c (инициализация, прерывания — в общем, все то, что зависит от выбранных пинов, номеров таймеров и т.д., и т.п.). В остальных файлах аппаратнозависимые участки обрамлены соответствующими #ifdef'ами, а также на полную используются макросы.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707173#p3707173"]Но в этом случае потеряется универсальность: а вдруг в другой реализации какой-то пин будет сидеть на другом порту?[/uquote]
А тут и приходит на помощь С++, там одиночные пины можно инитить по отдельности, а можно объединить в список и задать режим всем сразу, пины будут отсортированы по портам и все что висит на одном порту будет инититься вместе, но если пины разбросаны по разным портам, оно все равно работает. Например, в либе дисплея у меня передаются пины данных(8 или 16 объединенных в список пинов откуда угодно), плюс 5 управляющих пинов, тоже с любых портов, а внутри вызывается mode():

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

PinList<Pins::CS, Pins::Data, Pins::RS, Pins::WR, Pins::RD>::mode<PinMode::PushPull>();
И если дисплей объявлен следующим образом, т.е. все пины висят на GPIOB:

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

using lcd = Lcd<RM68140, LcdOrient::LandscapeRev, PB7, GpioB<0xFF00>, PB2, PB0, PB1, PB6, 0, 2, 0>;
то получаем:
Спойлер

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

ldr r1, [r3, #0] 
ldr r2, [pc, #444]
ldr r5, [pc, #444]
movw r4, #53232
ands r1, r4 
orrs r2, r1 
str r2, [r3, #0] 

ldr r2, [r3, #8] 
ands r2, r4 
orrs r2, r5 
str r2, [r3, #8] 

ldr r2, [r3, #4] 
bic.w r2, r2, #65280
bic.w r2, r2, #67
str r2, [r3, #4]
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Reflector писал(а):пины будут отсортированы по портам и все что висит на одном порту будет инититься вместе
Ты хочешь сказать, что это сделает препроцессор? Да ну нафиг!
Reflector писал(а):а внутри вызывается mode():
неужто эта жуть разворачивается всего лишь в 2-3 присваивания?
Reflector писал(а):то получаем:
Если даже и так, то код абсолютно нечитаем! Бессмысленно это !!!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3707199#p3707199"]Ты хочешь сказать, что это сделает препроцессор? Да ну нафиг![/uquote]
Не препроцессор, в современных С++ компиляторах при компиляции вызывается интерпретатор С++ исполняющий код, потому в шаблоне может быть 10 страниц кода, а на выходе получится несколько констант, которые можно хоть во флеш положить.
Если даже и так, то код абсолютно нечитаем! Бессмысленно это !!!
Что именно нечитаемо? У тебя на гите есть проект с дисплеем, там целый экран макросов для задания пинов и сопутствующих операций, чего у меня нет и оно не нужно, там управляющие пины привязаны к одному порту, а у меня нет, там задан порт для данных с маской, но при этом 8 бит просто пишутся в ODR затирая старший байт и т.д. :)
Последний раз редактировалось Reflector Ср сен 25, 2019 15:33:13, всего редактировалось 1 раз.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Макросы просты и наглядны. Их легко понять. А у тебя простыня какая-то в шаблоне, и фиг поймешь без поллитры, что там куда и для чего!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Reflector, ну , короче , как ранее и говорил -плюсы годны только на пинодрыг и не более...
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Это не так. Просто на простых примерах проще всего демонстрировать. Вместо ноги может быть какой-нибудь другой класс - i2c или spi, без проблем. Тут ведь даже простой код без поллитры некоторым непонятен. И это вполне объяснимо. Это всё же другой язык, его надо знать чтобы читать.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Чтобы все было легко и просто, есть сниппеты!
Ну и, конечно, свой код. Из которого очень полезно делать сниппеты. Скажем, написал один раз USB-CDC, оформил как сниппет, потом просто копирую все в новый "проЭкт" и добавляю то, что нужно... Как говорится, месяц потерял, зато потом за полчаса долетел!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Это ты технологию копипаста таким модным словом обозвал? :)
Ответить

Вернуться в «Разные вопросы по МК»