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

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

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

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3706834#p3706834"]Можно подумать, sqlite[/uquote]
Сравнили... И PostgreSQL, и MS SQL, и Oracle тоже написаны на С. Но для того, чтобы Вы написали на С столь же эфективный алгоритм, какой реализует планировщик запросов, боюсь, одной жизни Вам не хватит )))
Eddy_Em писал(а):И да: SQL — штука для ширпотреба.
Ну уж мне такое не надо втирать! Обычно, менее чем на порядок я SQL код не оптимизирую. Чаще - порядка на два )
Eddy_Em писал(а):Для конкретной узкой ниши обычно уникальный алгоритм значительно производительней будет!
Попробуйте. Я на R и SQL предиктивный анализ по терабайту и полмиллиарду строк делаю за 2 часа. А написал код за неделю (пару дней на ETL - остальное на R скрипт). Сможете быстрее?
Eddy_Em писал(а):Иной раз посмотришь, что там sdcc наделает, схватишься за голову, и начнешь вручную оптимизировать...
Да ладно. Начиная с 3.8 он существенно поумнел. Полного бреда, в виде загрузки индексного регистра перед каждым обращением к элементу структуры, не лепит. Хотя бы помнит, что перед этим в регистр положил )
А насчет крестов, я ими баловался лет 18 назад.
Смотря для чего. Например, QT - великолепная и очень удобная штука.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706816#p3706816"]Вы вообще о чем? В худшем случае, предается указатель на структуру. Пихать структуру в стек - это уж точно не для МК.
Обычно же, передается только код сообщения и, возможно, один-два аргумента к нему. Далее функция уже сама разбирается с ним через одну глобальную статическую развесистую структуру.[/uquote]
Гуглим "ringbuffer stm32" и большая часть сишных реализаций выглядят примерно так:

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

typedef struct {
    uint8_t * const buffer;
    int head;
    int tail;
    const int maxlen;
} circ_bbuf_t;

int circ_bbuf_push(circ_bbuf_t *c, uint8_t data);
В некоторых структурах внутри не указатель на данные, а массив, еще есть функция или макрос для инициализации этой структуры. И чем это лучше шаблонного класса? Ничем, оно хуже по всем параметрам.
Reflector писал(а):Давайте так, когда Вам удастся написать проект несколько более сложный, чем мигание светодиодом, на PDK14, используя C++ и его парадигму, я сам пойду убеждать Торвальдса, что пришла пора в ядро Linux принимать код на C+++ )))
Мне не нужно ничего писать на PDK14, но на tiny13 я, и не только, тестовые проекты на С++ создавал и разница от сишных там была байт 10. Или вот пример, делал я "ЛА/осцилл/частотомер/аналоговый и цифровой многоканальный генератор" и все это подключалось по USB к компу. Последний вариант был на F405, USB либа - это жестоко порезанная версия из HAL, которая все равно осталась весьма внушительного размера, плюс там абсолютно все на классах, от пина до того же USB. У мк метр флеша, размер бинарника 11KB, т.е. он занимает 1% или треть флеша самого мелкого моего 20-ти пинового STM32.

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3706834#p3706834"]Особенно, когда десятистраничный исходник 10 минут компиляется, пока все шаблоны развернутся... Не знаю, кому от этого хорошо, но лично я в шоке от такого подхода! Уже почти пхытон какой-то получается с конвертером в С![/uquote]
У меня почти все на шаблонных классах и на самом медленном компе, причем там реально древний 4-х ядерный AMD стоит, который сейчас у китайцев $10 стоит, время компиляции в среднем около 5 сек. На всякий случай даже посчитал, в одной либе портов 29 страниц :)
Реклама
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3706834#p3706834"]А насчет крестов, я ими баловался лет 18 назад. Жуткая дрянь. Их имеет смысл пользовать разве что в заковыристых GUI, а в реальной жизни они не нужны![/uquote]Давай не будем голословными, а поиграем в игру. Припоминая твои сообщения на форуме, с какими ты там работал контроллерами? F072, F407, F103 вроде. Ну давай для простоты F072 возьмём и какую-нибудь совсем повседневную задачу - инициализировать немного ножек. Давай PA0...PA3 - на выход LowSpeeed в нулевое состояние, а PA4...PA7 на выход HighSpeed в единицу. Потратишь 5 мин, покажешь как это на С будет? Хоть с мегапрепроцессором, хоть без - как хочешь. Ну а я на С++ покажу. ПростоНуб, присоединяйтесь :)
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

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

VladislavS, намного интересней тоже самое проделать на STM8S )))

Reflector, передается указатель на структуру, а не структура, как я и писал. А что толку от шаблонного класса, если для экономии памяти кольцевой буфер все равно выделяется статически, а часто вообще вырождатся в что-то типа:

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

typedef struct message_header_st {
  uint8_t msg_len:2;
  uint8_t msg_no:6;
} message_header_t;

typedef struct message_queue_st {
  uint8_t cur_idx;
  uint8_t top_idx;
  uint8_t queue[MESSAGE_QUEUE_SIZE];
} message_queue_t;
Reflector писал(а): разница от сишных там была байт 10
Странно. Или Вы не умеете писать на C, или C++ научился обходиться вообще без инициализации своей среды. Иначе расход RAM должен был быть большим.
Но даже в этом случае - почти 10% памяти коту под хвост - непозволительная роскошь. У PDK14 - 128 байт RAM,
Кстати, а чем Вы его заменяете, если не секрет?
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706912#p3706912"]VladislavS, намного интересней тоже самое проделать на STM8S )))[/uquote]Я вижу тут подкол про отсутствие нормального компилятора? Ну так не ко мне вопрос. Да и не использую я STM8. В принципе, у IAR для STM8 вполне вменяемый компилятор, но без последних стандартов С++. Сделать на нём список типов а-ля "Александреску" получится. Для AVR я делал. Но так как научил меня Reflector лучше получается, но нужен хороший компилятор.

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706912#p3706912"]Странно. Или Вы не умеете писать на C, или C++ научился обходиться вообще без инициализации своей среды.[/uquote]Вариант что он хооошо умеет на С++ вы не допускаете? У него там всё на шаблонах со статическими методами. Накладных нол целых хрен десятых.

Ну так что, ножки инициализируем? Делов то на 5 мин.
Реклама
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

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

VladislavS, некогда. У меня не доделана моя идея. Суть в том, что инициализация любых последовательно расположенных регистров скопом осуществляется одной функцией, которая ориентируясь только на стартовый адрес и битовую маску с массивом указанной длины, записывает инициализационные данные последовательно из массива, просто инкрементируя адрес без записи туда, если соответствующий бит сброшен. Но иногда порядок записи по возрастанию адреса неприемлем и эту проблему я красиво еще не решил. Пока только несколькими вызовами и, возможно, с реверсом.
Уже на десятке инициализаций код получается короче, чем по машинной команде на каждую инициализацию.
Реклама
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3706912#p3706912"]передается указатель на структуру, а не структура, как я и писал.[/uquote]
Это вроде и так было понятно...
А что толку от шаблонного класса, если для экономии памяти кольцевой буфер все равно выделяется статически, а часто вообще вырождатся в что-то типа:
C++ буфер проще в обращении, не так захламляет глобальное пространство имен, для него доступны дополнительные оптимизации и т.д.... Например, есть у нас два буферизированных USART, тогда можно написать:

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

Usart1<16, 32> usart1;
Usart2<10, 20> usart2;
И внутри каждого будет создано по два кольцевых буфера заданных размеров, причем для первого USART они будут оптимизированы под POT, а для второго автоматически на этапе компиляции будет выбран более общий алгоритм. Формально там есть проверки, но так как это компайл-тайм проверки, но в коде их не будет даже при выключеной оптимизации. Кстати, если ее таки выключить, а это нужно для нормальной отладки, то компилятор поубирает практически весь инлайнинг, а ведь у С++ методов нет этого лишнего параметра в виде указателя на структуру, так что сишный код по размеру может быть даже больше. Дополнительно можно и индексы по размеру соптимизировать, на ARM я так не делаю, потому что там команды заточены под 32 бита, а RAM много, но если это какие-нибудь AVR, то так вполне можно сделать. Для связанного списка, где индексы могут значительно увеличивать потребление RAM, у меня так и сделано:

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

	template<typename T, uint32_t capacity>
	class List
	{
		using TI = std::conditional_t<(capacity > 254), uint16_t, uint8_t>;
		struct Node
		{
			T value;
			TI prev, next;
		};
		Node buf[capacity + 1];
......
Тут в зависимости от размера prev и next будут uint8_t или uint16_t. Да и в целом, как на С задать размеры 4-х буферов настолько простым способом?
Странно. Или Вы не умеете писать на C, или C++ научился обходиться вообще без инициализации своей среды. Иначе расход RAM должен был быть большим.
Но даже в этом случае - почти 10% памяти коту под хвост - непозволительная роскошь. У PDK14 - 128 байт RAM
Разница в 10 байт флеша, практически все мои шаблонные классы не имеют полей вообще и RAM не потребляют, по крайней мере если говорить о классах периферии.
Кстати, а чем Вы его заменяете, если не секрет?
Ничем, если нужно мало ног, ставлю 20-ти ногий STM32F0. Сейчас появились G0, там есть 8-ми пиновые, плюс они малопотребляющие, начнут продавать по адекватным ценам, буду ставить их. Я не создаю устройства которые продаются крупными партиями или просто продаются, потому дешевые падауки мне без надобности, с другой стороны у эмбеддеров обычно нет такого опыта использования С++ какой есть у программистов с ПК :)
Аватара пользователя
ПростоНуб
Собутыльник Кота
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

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

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

[uquote="VladislavS",url="/forum/viewtopic.php?p=3706958#p3706958"]Вариант что он хооошо умеет на С++ вы не допускаете?[/uquote]
Среда C++ по жизни занимает оперативки больше, чем среда С, особенно с выключенным динамическим распределением памяти. Когда оперативки всего 128 байт - это очень заметно.

Добавлено after 2 minutes 32 seconds:
[uquote="Reflector",url="/forum/viewtopic.php?p=3706997#p3706997"]
Кстати, а чем Вы его заменяете, если не секрет?
Ничем, если нужно мало ног, ставлю 20-ти ногий STM32F0.[/uquote]
То есть, если Вам надо 200 МК для сбора данных, Вы вместо $6 потратите $200? :shock:

На самом деле теперь понятно, почему Вас устраивает C++ и не нужен C и ассемблер. Вы можете себе позволить увеличивать себестоимость ГП на порядки, лишь бы не быть ограниченным в ресурсах МК.
На STM32, особенно старших, использование С++ почти не влияет на производительность и размер кода.
Последний раз редактировалось ПростоНуб Ср сен 25, 2019 10:38:14, всего редактировалось 1 раз.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

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

Сообщение Reflector »

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

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

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

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

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

Сообщение Reflector »

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

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

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

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

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

Сообщение VladislavS »

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

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

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

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

Сообщение VladislavS »

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

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

Сообщение 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

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

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

Сообщение Reflector »

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

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

Сообщение Eddy_Em »

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

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

Сообщение 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 раз.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

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

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