ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 ноября
905317 Топик полностью
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