Mebius (19.02.2019 10:29, просмотров: 393) ответил бомж на Такого же мнения. Пользую чистый православный Ц. Но интересуюсь :-)
Многие эмбеддеры не любят писать на плюсах, дескать "ОЗУ мало, создам 5 классов и памяти больше нет", однако некоторые элементы С++ могут весьма улучшить читаемость кода. Предположим нам предстоит работать с устройствами на шине I2C - часами и флеш-памятью. Протоколы работы с обоими устройствами очень похожи, но чуть-чуть отличаются: у часов регистры адресуются одним байтом, а у флеш-памяти - двумя. Вот из-за этого "чуть-чуть", если не использовать синтаксис C++ нам придётся либо написать функцию с лишним, с точки зрения стороннего наблюдателя, аргументом, который будет указывать на длину адресного указателя, либо писать две очень похожих друг на друга функции, одну для часов, одну для флеш. А теперь посмотрим, как это можно решить в С++:
i2c.h:
template <typename T>void i2c(uint8_t dev_addr, T addr, uint32_t len, const void *data);
i2c.cpp:
template <typename T>void i2c(uint8_t dev_addr, T addr, uint32_t len, const void *data) {
....
lenPointerForTransferIntoDevice = sizeof(T);
.......
}
template void i2c<uint8_t>(uint8_t dev_addr, uint8_t addr, uint32_t len, const void *data); // это для RTC
template void i2c<uint16_t>(uint8_t dev_addr, uint16_t addr, uint32_t len, const void *data); // это для флеш
Теперь в любом месте программы можно пиcать один и тот же вызов и для RTC и для флеш:
i2c(0xD1, (uint8_t)0x00, 1, buf) - читаем секунды из RTC
i2c(0xA1, (uint16_t)FLASH_ADDR, 25, buf2) - читаем 25 байт из флеш по адресу FLASH_ADDR