ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово auto Π² C++: ΠΎΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… основ Π΄ΠΎ примСнСния Π² Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΠΉ элСктроникС

Если Π²Ρ‹ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² для Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… систСм β€” Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ Arduino-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ для диагностики, ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ° ECU ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° собствСнных Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² β€” Ρ‚ΠΎ навСрняка Π²ΠΈΠ΄Π΅Π»ΠΈ Π·Π°Π³Π°Π΄ΠΎΡ‡Π½ΠΎΠ΅ слово auto Π² ΠΊΠΎΠ΄Π΅ Π½Π° C++. Π­Ρ‚ΠΎ Π½Π΅ просто "автоматичСский Ρ€Π΅ΠΆΠΈΠΌ", ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄ΡƒΠΌΠ°ΡŽΡ‚. Π’ контСкстС Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΠΉ элСктроники auto становится ΠΌΠΎΡ‰Π½Ρ‹ΠΌ инструмСнтом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ экономит врСмя ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ ошибки ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с рСгистрами, ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°ΠΌΠΈ CAN ΠΈΠ»ΠΈ LIN, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ парсингС Π΄Π°Π½Π½Ρ‹Ρ… с OBD-II.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ auto Π½Π΅ ΠΊΠ°ΠΊ Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΡƒΡŽ Ρ„ΠΈΡ‡Ρƒ языка, Π° ΠΊΠ°ΠΊ практичСский инструмСнт для Π°Π²Ρ‚ΠΎ-энтузиастов ΠΈ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ². Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΏΠΎΡ‡Π΅ΠΌΡƒ профСссионалы ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с STM32 ΠΈΠ»ΠΈ ESP32 для Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡, ΠΊΠ°ΠΊ ΠΎΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π΄Π°Π½Π½Ρ‹Ρ… с Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² MAP, MAF ΠΈΠ»ΠΈ lambda-Π·ΠΎΠ½Π΄ΠΎΠ², ΠΈ Π³Π΄Π΅ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ рискованным. А Π΅Ρ‰Ρ‘ β€” Ρ€Π°Π·Π²Π΅Π½Ρ‡Π°Π΅ΠΌ ΠΌΠΈΡ„Ρ‹ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ auto "замСдляСт ΠΊΠΎΠ΄" ΠΈΠ»ΠΈ "Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ нСпонятным".

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ auto Π² C++ ΠΈ ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ для Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΠΉ элСктроники

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово auto появилось Π² стандартС C++11 ΠΈ стало Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠ΅ΠΉ для встраиваСмых систСм β€” Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Π΅. Π’ Π΄Π²ΡƒΡ… словах: ΠΎΠ½ΠΎ позволяСт компилятору автоматичСски ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π½Π° этапС компиляции. ΠŸΠΎΡ‡Π΅ΠΌΡƒ это ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ для Π°Π²Ρ‚ΠΎ?

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄ для считывания Π΄Π°Π½Π½Ρ‹Ρ… с CAN-ΡˆΠΈΠ½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ mcp2515. Π‘Π΅Π· auto Π²Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°, структуры ΠΈΠ»ΠΈ массива β€” Π° это ошибкоопасно, особСнно ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Ρ‘Ρ‚ ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°Ρ… Π²Ρ€ΠΎΠ΄Π΅ ISO-TP ΠΈΠ»ΠΈ UDS, Π³Π΄Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ. Π‘ auto ΠΊΠΎΠ΄ становится Ρ‡ΠΈΡ‰Π΅:

// Π‘Π΅Π· auto (риск ошибки ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Ρ‚ΠΈΠΏΠ° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅)

mcp2515::CANMessage message = can.readMessage();

uint8_t data[8];

for (int i = 0; i < 8; i++) {

data[i] = static_cast<uint8_t>(message.data[i]);

}

// Π‘ auto (компилятор сам разбСрётся с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ)

auto message = can.readMessage(); // Π’ΠΈΠΏ опрСдСлится ΠΊΠ°ΠΊ mcp2515::CANMessage

for (auto& byte : message.data) { // byte Π±ΡƒΠ΄Π΅Ρ‚ uint8_t

processByte(byte);

}

Π’ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΠΉ элСктроникС, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π°ΠΉΡ‚ Π½Π° счёт (особСнно Π² ECU с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ), auto ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² (static_cast), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΡŠΠ΅Π΄Π°Ρ‚ΡŒ Π΄Ρ€Π°Π³ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ Ρ‚Π°ΠΊΡ‚Ρ‹ процСссора. Но Π΅ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠ°ΠΌΠ½ΠΈ...

πŸ“Š Π“Π΄Π΅ Π²Ρ‹ Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ auto Π² Π°Π²Ρ‚ΠΎ-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…?
ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с CAN-шиной
Для парсинга OBD-II Π΄Π°Π½Π½Ρ‹Ρ…
Π’ шаблонном ΠΊΠΎΠ΄Π΅ (STM32 HAL)
ΠŸΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ сигналов с Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ²
НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ

Как auto Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ компилятор

МногиС Π΄ΡƒΠΌΠ°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ auto β€” это "магия", Π½ΠΎ Π½Π° Π΄Π΅Π»Π΅ всё ΠΏΡ€ΠΎΠ·Π°ΠΈΡ‡Π½ΠΎ. Когда Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅:

auto x = getSensorValue();

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π½Π΅ ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ, Π° подставляСт Π΅Π³ΠΎ Π½Π° этапС компиляции, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getSensorValue(). Для Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚:

  • πŸ”Ή НСт Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π²ΠΎ врСмя выполнСния β€” Ρ‚ΠΈΠΏ опрСдСляСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΏΡ€ΠΈ компиляции.
  • πŸ”Ή Код становится пСрСносимым: Ссли Π² Π½ΠΎΠ²ΠΎΠΉ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Arduino-CAN помСняСтся Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, ваш ΠΊΠΎΠ΄ с auto ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.
  • πŸ”Ή МСньшС "мусора": Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π²Ρ€ΠΎΠ΄Π΅ std::vector<uint16_t>::iterator.

Но Π΅ΡΡ‚ΡŒ нюанс: auto всСгда опрСдСляСт Ρ‚ΠΈΠΏ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π½Π΅ ΠΊΠ°ΠΊ ссылку, Ссли явно Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ &. Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими структурами Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΊΠ°Π΄Ρ€Π° CAN:

// ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх 8 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… (нСэффСктивно для STM32 с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ RAM)

auto data = canFrame.data;

// Бсылка Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ (экономим ΠΏΠ°ΠΌΡΡ‚ΡŒ)

auto& dataRef = canFrame.data;

Π“Π΄Π΅ auto Π½Π΅Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π² Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…: Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ сцСнарии, Π³Π΄Π΅ auto ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Тизнь Π°Π²Ρ‚ΠΎ-ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π°ΠΌ ΠΈ Π»ΡŽΠ±ΠΈΡ‚Π΅Π»ΡΠΌ.

1. Π Π°Π±ΠΎΡ‚Π° с CAN-шиной ΠΈ OBD-II

ΠŸΡ€ΠΈ парсингС ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΎΡ‚ ECU Ρ‡Π΅Ρ€Π΅Π· OBD-II (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, запрос 01 0C для ΠΎΠ±ΠΎΡ€ΠΎΡ‚ΠΎΠ² двигатСля) auto позволяСт Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… Π±Π°ΠΉΡ‚ΠΎΠ²:

auto response = obd.query(PID_ENGINE_RPM);

auto rpm = (response[2] * 256 + response[3]) / 4; // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΎΠ±ΠΎΡ€ΠΎΡ‚Ρ‹

2. Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΡ ΠΏΠΎ массивам Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ²

Если Ρƒ вас массив Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ADS1115 (16-Π±ΠΈΡ‚Π½Ρ‹ΠΉ АЦП для Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ² давлСния, Ρ‚Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹), auto ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ:

std::array<uint16_t, 8> sensorReadings = readADS1115();

for (auto reading : sensorReadings) {

if (reading > THRESHOLD) triggerAlarm();

}

3. Π¨Π°Π±Π»ΠΎΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ для STM32 HAL

Π’ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ STM32 HAL Ρ‚ΠΈΠΏΡ‹ часто скрыты Π·Π° макросами. auto ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π½Π΅ Π»Π΅Π·Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ:

auto timHandle = &htim1;  // HAL_TIM_HandleTypeDef*

auto channel = HAL_TIM_ACTIVE_CHANNEL_1;

Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ Π‘Π΅Π· auto Π‘ auto Π’Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ
Π§Ρ‚Π΅Π½ΠΈΠ΅ CAN-сообщСния mcp2515::CANMessage msg = ... auto msg = ... МСньшС ошибок ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ API
ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° АЦП uint16_t adcValue = readADC() auto adcValue = readADC() АвтоматичСская адаптация ΠΊ разрядности АЦП
Π Π°Π±ΠΎΡ‚Π° с рСгистрами volatile uint32_t* reg = &GPIOA->ODR auto reg = &GPIOA->ODR ΠšΠΎΡ€ΠΎΡ‡Π΅ ΠΈ бСзопаснСС
Когда auto ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Π²Ρ€Π΅Π΄ΠΈΡ‚ΡŒ Π² Π°Π²Ρ‚ΠΎ-ΠΊΠΎΠ΄Π΅?

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях auto ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ Π²Π°ΠΆΠ½Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ:

1. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с volatile-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ (рСгистры ΠΏΠ΅Ρ€ΠΈΡ„Π΅Ρ€ΠΈΠΈ) β€” компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ глюкам.

2. Π’ шаблонном ΠΊΠΎΠ΄Π΅, Π³Π΄Π΅ Π²Π°ΠΆΠ΅Π½ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π±ΠΈΡ‚ΠΎΠ²ΠΎΠΌ сдвигС Π΄Π°Π½Π½Ρ‹Ρ… для SPI).

3. ΠŸΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅: Ссли Ρ‚ΠΈΠΏ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ нСявно, слоТнСС ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "сбиваСтся".

ΠžΠΏΠ°ΡΠ½Ρ‹Π΅ Π»ΠΎΠ²ΡƒΡˆΠΊΠΈ: ΠΊΠΎΠ³Π΄Π° auto Π»ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

Auto β€” Π½Π΅ сСрСбряная пуля. Π’ Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΠΉ элСктроникС, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π°ΠΉΡ‚ ΠΈ Ρ‚Π°ΠΊΡ‚ процСссора Π½Π° счёт, Π΅ΡΡ‚ΡŒ ситуации, Π³Π΄Π΅ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ‡Ρ€Π΅Π²Π°Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Никогда Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ auto для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² прСрываниях (ISR). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΊΡ€Π°Ρ…Ρƒ систСмы ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ критичСского события (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΡ€Π°Π±ΠΎΡ‚Π°Π²ΡˆΠ΅Π³ΠΎ Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠ° ΡƒΠ΄Π°Ρ€Π° Π² ΠΏΠΎΠ΄ΡƒΡˆΠΊΠ°Ρ… бСзопасности).

Π•Ρ‰Ρ‘ ΠΎΠ΄Π½Π° Π»ΠΎΠ²ΡƒΡˆΠΊΠ° β€” auto с ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ:

auto x = 5;      // int

auto y = 5u; // unsigned int

auto z = {5}; // std::initializer_list<int> (Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎ!)

Π’ ΠΊΠΎΠ΄Π΅ для ECU это ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΈ арифмСтичСских опСрациях. ВсСгда провСряйтС Ρ‚ΠΈΠΏΡ‹ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅!

  • 🚨 ΠŸΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΡ (ISR): auto ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.
  • 🚨 Π‘ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ поля: НСявноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π΅Ρ€Π΅Ρ‚ΡŒ Π²Π°ΠΆΠ½Ρ‹Π΅ Ρ„Π»Π°Π³ΠΈ.
  • 🚨 ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ сСкции: Π’ ΠΊΠΎΠ΄Π΅ для FreeRTOS ΠΈΠ»ΠΈ ChibiOS auto ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с синхронизациСй.

βœ”οΈ Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ auto Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ISR

βœ”οΈ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ (GDB, OpenOCD)

βœ”οΈ Π˜Π·Π±Π΅Π³Π°Ρ‚ΡŒ auto для volatile-ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

βœ”οΈ Π―Π²Π½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ Π² шаблонном ΠΊΠΎΠ΄Π΅ для SPI/I2C

-->

Auto ΠΈ соврСмСнныС стандарты: C++14, C++17, C++20 для Π°Π²Ρ‚ΠΎ

Π‘ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ стандартом auto становится ΠΌΠΎΡ‰Π½Π΅Π΅. Для Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½ΠΎΠΉ элСктроники особСнно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ нововвСдСния:

  • πŸ”§ C++14: auto Π² лямбда-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… (ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ CAN-сообщСний Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ).
  • πŸ”§ C++17: structured bindings для распаковки структур (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π°Π½Π½Ρ‹Ρ… с IMU-сСнсора).
  • πŸ”§ C++20: auto Π² ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ… (ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹Ρ… Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ² Π΄Π°Ρ‚Ρ‡ΠΈΠΊΠΎΠ²).

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ с C++17 для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… аксСлСромСтра MPU6050:

auto [ax, ay, az] = mpu.readAccel();  // Распаковка Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

if (abs(ax) > CRASH_THRESHOLD) deployAirbag();

Π’Π°ΠΆΠ½ΠΎ: Π² Π°Π²Ρ‚ΠΎ-ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΡΡ‚ΠΈ Π΄ΠΎ сих ΠΏΠΎΡ€ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ C++98/03 (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² legacy-ΠΊΠΎΠ΄Π΅ Bosch ECU). Π’ Ρ‚Π°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… auto нСдоступСн, ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Ρ‚ ΠΊ ошибкС компиляции.

Auto vs. Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹: benchmark для STM32

МногиС боятся, Ρ‡Ρ‚ΠΎ auto "замСдляСт" ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ это Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. Π’ΠΎΠ·ΡŒΠΌΡ‘ΠΌ STM32F407 (168 ΠœΠ“Ρ†, ядро Cortex-M4) ΠΈ сравним Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΊΠΎΠ΄Π° для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ CAN-сообщСний:

ΠœΠ΅Ρ‚ΠΎΠ΄ ВрСмя выполнСния (мкс) Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° (Π±Π°ΠΉΡ‚) ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ
Π―Π²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ 12.4 432 Π ΡƒΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²
auto 12.4 428 ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ
auto& 11.9 420 Бсылки ускорили доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ

Π’Ρ‹Π²ΠΎΠ΄: auto Π½Π΅ влияСт Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ссли компилятор настроСн Π½Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ (-O2 ΠΈΠ»ΠΈ -O3). Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΊΠΎΠ΄ с auto оказываСтся быстрСС Π·Π° счёт ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΡ Π»ΠΈΡˆΠ½ΠΈΡ… ΠΊΠΎΠΏΠΈΠΉ Π΄Π°Π½Π½Ρ‹Ρ….

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ совСты: ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ auto Π² Π°Π²Ρ‚ΠΎ-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…

Π§Ρ‚ΠΎΠ±Ρ‹ auto стал вашим союзником, Π° Π½Π΅ источником Π±Π°Π³ΠΎΠ², слСдуйтС этим ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ:

  1. ВсСгда провСряйтС Ρ‚ΠΈΠΏΡ‹ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅. Π’ STM32CubeIDE ΠΈΠ»ΠΈ PlatformIO Π½Π°Π²Π΅Π΄ΠΈΡ‚Π΅ курсор Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с auto β€” IDE ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ.
  2. Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅ auto Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Ρ€Π°ΡΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ€Π°Π·Π½Ρ‹Ρ… модулях (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π΅ CAN ΠΈ основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅).
  3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ auto& для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… структур. НапримСр, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с CAN_FilterTypeDef Π² STM32 HAL.
  4. Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹. Если auto скрываСт слоТный Ρ‚ΠΈΠΏ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, std::function для колбэка), Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ:
// Колбэк для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок CAN-ΡˆΠΈΠ½Ρ‹: void(const CAN_Error&)

auto onCanError = [](const auto& error) { ... };

Для Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ auto с const:

const auto config = readECUConfig();  // Гарантия, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ Π½Π΅ измСнится случайно

FAQ: ЧастыС вопросы ΠΏΡ€ΠΎ auto Π² Π°Π²Ρ‚ΠΎ-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…

МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ auto Π² ΠΊΠΎΠ΄Π΅ для Arduino (AVR)?

Π”Π°, Π½ΠΎ с ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ avr-g++ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ auto начиная с вСрсии 4.8, Π½ΠΎ:

  • На ATmega328P (Arduino Uno) auto ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ Π½Π° 1-3% ΠΈΠ·-Π·Π° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ….
  • Π’ прСрываниях (ISR()) Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ auto β€” ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ с рСгистрами SREG.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ бСзопасного использования:

auto sensorValue = analogRead(A0);  // OK для основного Ρ†ΠΈΠΊΠ»Π°

// Π’Π½ΡƒΡ‚Ρ€ΠΈ ISR:

volatile uint16_t isrValue = analogRead(A0); // Π›ΡƒΡ‡ΡˆΠ΅ явно

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π°Π²Ρ‚ΠΎ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Arduino-CAN) Π½Π΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ auto?

Π­Ρ‚ΠΎ связано с двумя Ρ„Π°ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ:

  1. Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ: Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²Ρ€ΠΎΠ΄Π΅ mcp2515 ΠΈΠ»ΠΈ SPI ΠΌΠΎΠ³ΡƒΡ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ (AVR, ESP32, STM32), Π³Π΄Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‚ΠΈΠΏΠΎΠ² ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ. auto ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ пСрСносимости.
  2. ΠžΡ‚Π»Π°Π΄ΠΊΠ°: ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с CAN-сообщСниями часто Π½ΡƒΠΆΠ½ΠΎ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, uint8_t vs int8_t для Π±Π°ΠΉΡ‚ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…).

Однако Π² соврСмСнных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π° ESP32 с Arduino-CAN 2.0+) эти ограничСния ΡΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ.

Как auto взаимодСйствуСт с volatile Π² рСгистрах STM32?

Π­Ρ‚ΠΎ больная Ρ‚Π΅ΠΌΠ°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°:

auto regValue = GPIOA->ODR;  // Опасно! ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ доступ

// ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ:

volatile auto& regValue = GPIOA->ODR;

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π±Π΅Π· volatile компилятор ΠΌΠΎΠΆΠ΅Ρ‚:

  • ΠšΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (Π° ΠΎΠ½ΠΎ ΠΌΠΎΠ³Π»ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎ).
  • Π£Π΄Π°Π»ΠΈΡ‚ΡŒ "лишниС" чтСния/записи (Ρ‡Ρ‚ΠΎ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ для GPIO ΠΈΠ»ΠΈ TIM).

ВсСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ volatile auto& для доступа ΠΊ рСгистрам!

МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ auto Π² ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠ°Ρ… для ECU (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Bosch ME7)?

Π’ 99% случаСв β€” Π½Π΅Ρ‚. ΠŸΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ для сСрийных ECU ΠΏΠΈΡˆΡƒΡ‚ΡΡ Π½Π°:

  • Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚Π°Ρ… C (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, MISRA C), Π³Π΄Π΅ auto Π·Π°ΠΏΡ€Π΅Ρ‰Ρ‘Π½.
  • Π£ΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΡ… стандартах (C++98), Π³Π΄Π΅ auto ΠΈΠΌΠ΅Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠ΅Π΅ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово для хранСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² стСкС).

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€” кастомизированныС ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Standalone ECU Π½Π° Π±Π°Π·Π΅ STM32), Π³Π΄Π΅ Π²Ρ‹ сами ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ toolchain.

Как auto влияСт Π½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти Π² ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ…?

Π—Π°ΠΌΠ΅Ρ€ Π½Π° STM32F103C8T6 (20 KB RAM, 64 KB Flash) ΠΏΠΎΠΊΠ°Π·Π°Π»:

КодFlash (Π±Π°ΠΉΡ‚)RAM (Π±Π°ΠΉΡ‚)
Π―Π²Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹124561844
auto124481844
auto&124401832

Π’Ρ‹Π²ΠΎΠ΄: auto Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅ памяти, Π° auto& Π΄Π°ΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ экономит RAM Π·Π° счёт избСгания копирования.