Еще одно интересное использование нового размещения

Рик Кимбалл
Солнце 07 июня 2015 г. 15:59
В другой ветке я кратко упомянул об использовании нового размещения, чтобы задержать вызов конструктора объекта. Тем не менее, это на самом деле не ограничивается этим типом вещей. Размещение нового есть гораздо больше, чтобы использовать. Обычно используется для обеспечения методов доступа к регистрам в фиксированном месте.

Возьмем, к примеру, регистры GPIO, новый подход, который может обеспечить нулевой накладной API для этих регистров и предоставить методы, которые абстрагируют некоторые из нежных реестр. В приведенном ниже коде я создал простой класс GPIOPORT C ++, который отображает адрес регистров GPIOB для класса, который может использовать эти регистры. Я создал пару методов, которые позволяют вам установить PIN -код High () или low () с нулевыми накладными расходами. * Другие методы остаются в качестве упражнения для читателя *

Maple Mini Code * предполагает, что PB1 является светодиодом, и он активен * // placement_new_blink - thin API to direct use of GPIO registers inline void * operator new( size_t sz, void * here ) { return here;} class GPIOPort : public gpio_reg_map { public: void high(const uint32_t pin_mask) { BSRR = pin_mask; } void low(const uint32_t pin_mask) { BRR = pin_mask; } }; static GPIOPort & portb = *(new ((void *)GPIOB_BASE) GPIOPort()); #define LED_MASK 1<<1 void setup() { pinMode(PB1, OUTPUT); } // the loop function runs over and over again forever void loop() { portb.high(LED_MASK); // turn on led delay(100); // wait portb.low(LED_MASK); // turn on led delay(900); // wait }

Рик Кимбалл
Солнце 07 июня 2015 г., 16:30
Прежде чем кто -то избит меня с комментарием, таким как «вам не нужно использовать новое размещение для этого, вы можете просто установить адрес порта в GPIOB», и да, это правда:

* код без размещения новое * // zero overhead API for register based manipulation class GPIOPort : public gpio_reg_map { public: void high(const uint32_t pin) { BSRR = 1 << pin; } void low(const uint32_t pin) { BRR = 1 << pin; } }; static GPIOPort & portb = *((GPIOPort *)GPIOB_BASE); #define LED_PORT_PIN PB1 #define LED_PIN 1 /* PB1 */ void setup() { pinMode(LED_PORT_PIN, OUTPUT); } void loop() { portb.high(LED_PIN); // turn on led delay(100); // wait portb.low(LED_PIN); // turn on led delay(400); // wait }

Mrburnette
Солнце 07 июня 2015 г., 17:03
Вы никогда не знаете, что -то подобное может пригодиться, если вам нужно устранить некоторые из API API ARDUINO. Конечно, вы должны взвесить этот выигрыш от того факта, что вы пишете конкретный код, который не сможет использоваться в другом месте. Поскольку мы знаем аромат чипа во время компиляции, могут ли эти знания не использовать для нормализации с псевдонимом (typedef) через немного #ifdef Magic?

Луча

Рик Кимбалл
Солнце 07 июня 2015 18:33
Mrburnette написал:Поскольку мы знаем аромат чипа во время компиляции, могут ли эти знания не использовать для нормализации с псевдонимом (typedef) через немного #ifdef Magic?Луча

Mrburnette
Солнце 07 июня 2015 21:06
Тем не менее, бывают случаи, когда я бы хотел, чтобы код был более эффективным, чем то, что предоставляет API Arduino API. Благородная цель...
Я думаю, что все мы хотим как гибкости (переменная PIN -SS), так и скорость (PIN -контакт непосредственно с портом.) Жаль, что они кажутся взаимоисключающими.
Вы, должно быть, смотрели на мой шаблон Fabooh C ++. ] Нет, но я большой поклонник твоей работы; особенно. усилия BMP. Поскольку лето прогрессирует, и список дел жены становится короче, я надеюсь пожертвовать мини-роли BMP... Мне было 30 лет, дал 1 старому другу, которому просто нужно было иметь один (личность немедленного удовлетворения), и 4 выделили на различные проекты на расстоянии... У меня нет проблем с тем, чтобы бросить девственницу по вулкану в качестве жертвы за большую долю.


Луча

victor_pv
Пн июня 08, 2015 12:45
Рик, тогда есть преимущество для манипуляции с булавками, используя новое размещение?
Вы комментируете, что без него код лучше, но я хотел бы понять, почему. Основное различное, что я заметил, это то, что он экономит несколько байтов, но я вижу, что оба случая не вызывают цифровой писатель и все, что вызовет цифровой писатель...

Рик Кимбалл
Пн, 08 июня 2015 г., 1:42
Большим преимуществом будет то, что конструктор будет вызван. Хотя в этом примере я ничего не делаю с конструктором. С помощью решения для указателя вам придется создать функцию init и позвонить в настройку или в тот момент, когда это имеет смысл.

-рик

Mrburnette
Пн июня 08, 2015 2:49
Рик Кимбалл написал:Большим преимуществом будет то, что конструктор будет вызван. Хотя в этом примере я ничего не делаю с конструктором. С помощью решения для указателя вам придется создать функцию init и позвонить в настройку или в тот момент, когда это имеет смысл.

-рик

Рик Кимбалл
Пн июня 08, 2015, 3:52 утра
Mrburnette написал:Означает ли это, что объект, основанный на указателе, находится в куче? Или, архитектура Гарварда заставляет компилятор поместить это в вспышку?

Mrburnette
Пн июня 08, 2015 12:19
Если вы писали это самостоятельно в ASM... ... С тех пор, как колледж и 68000 и 6502 позже.

Но я понимаю ваше объяснение, и это полезно. Вплоть до AVR, я не работал с маленькими чипсами и ассемблером с колледжа в середине 70-х годов. А с AVR, в основном только копание в V-USB. Я был справедливо в 6502 вещах в мои дни Apple II, но никогда не был достаточно причудливый, чтобы делать что -либо, кроме Xmodem Stuff и несколько вспомогательных подпрограмм для AppleSoft. Но все было фон Нейманн - моя зона комфорта с Гарвардом немного шатко.

Но; Я благодарен за объяснение (имеет смысл), и я, конечно, рад, что у этого форума немного головы в команде! Позаботьтесь о своих нейронах, вы ценный актив.

Луча

victor_pv
Пн июня 08, 2015, 14:57
Mrburnette написал:Если вы писали это самостоятельно в ASM... ... Я не работал с маленькими чипсами и ассемблером после колледжа в середине 70-х годов...
Луча

Mrburnette
Пн июня 08, 2015, 15:22
victor_pv написал:Mrburnette написал:Если вы писали это самостоятельно в ASM... ... Я не работал с маленькими чипсами и ассемблером после колледжа в середине 70-х годов...
Луча

Ахулл
Пн июня 08, 2015, 19:54
На случай, если вам интересно (и я уверен, что вы не были ;) Я думаю, что я должен быть почти таким же винтажным, как Рэй, одним из первых компьютеров, на которых я сделал серьезное развитие, был этот «портативный» зверь, который, я подозреваю, Philips »Osbourne 1 Wanabe.."У него также были WordStar, SuperCalc и C, Pascal и Basic Compilers.
Изображение
Портатив означал, что вы могли бы тащить его (пыхтеть и хрипы) в такси и из них, и использовать его в качестве места на поезде. : D

Спецификация здесь. И я написал кучу вещей, включая утилиту печати печати и штрих -кодов (для примечаний на больнице). Если вам нужны «скорость» и «графика», это связано с большим количеством царапин для головы, чтобы поговорить с «соавтором» и терминальной доской напрямую. Я подозреваю, что одна из этих чипсов STM32F103C8XX съела бы его на завтрак.

Рик Кимбалл
Пн, 08 июня 2015 8:01 вечера
Человек, это место полон стариков. "Снимись с моего газона!":)

* К сожалению, я попадаю в этот же винтаж, как и все другие старые парни.

-рик

Ахулл
Пн июня 08, 2015 8:19 вечера
Мне, возможно, придется изменить свой аватар.
Изображение

Martinayotte
Пн июня 08, 2015, 22:59
Рик Кимбалл написал:Человек, это место полон стариков.

Мадиас
Вт. 09 июня 2015 г. 10:23
Ха -ха, мне нравится эта ветка!
Так что я думаю, что с 41 год я здесь «молодой» ;)
Кстати: я мечтал об этом «портативном» (но для меня это не было доступным через 1000 световых лет):
Изображение
(Хорошо, это было на 20 лет позже, чем машины, которые вы разместили, но - я думаю - равные, если не более мощные, чем любой STM32F1XX)
((и да, я был «атари» не коммодор, потому что мне нужна была миди))

Mrburnette
Вт, 09 июня 2015 12:44
Вся последняя полка материала IBM/Compaq была пожертвована, но все старые яблочные вещи остаются в моем музее маленького шкафа в моем старом офисе.
2 Apple] [С дисками дисков, все оригинальный Macintosh (я добавил последний после того, как была сделана картинка - так что все монохромные единицы), и машина CPM можно увидеть просто на правом краю. Издание IIGS WOS было пожертвовано.
Р.Эн.Т. в другой комнате. Где -то на сервере - хороший пикс... но, очевидно, не проиндексирован!

Луча
IMG_0282.jpg
IMG_0282.JPG (52.32 киб) просмотрено 631 раз

Быстрое битуполовое GPIO/SRAM Access