ΠΡΠ»ΠΈ Π²Ρ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡ Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠΎΠ±ΠΈΠ»ΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌ β Π±ΡΠ΄Ρ ΡΠΎ 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 ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ: ΡΡΠΎ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ
ΠΠ½ΠΎΠ³ΠΈΠ΅ Π΄ΡΠΌΠ°ΡΡ, ΡΡΠΎ 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 ΡΡΠ°Π» Π²Π°ΡΠΈΠΌ ΡΠΎΡΠ·Π½ΠΈΠΊΠΎΠΌ, Π° Π½Π΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ Π±Π°Π³ΠΎΠ², ΡΠ»Π΅Π΄ΡΠΉΡΠ΅ ΡΡΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌ:
- ΠΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠΉΡΠ΅ ΡΠΈΠΏΡ Π² ΠΎΡΠ»Π°Π΄ΡΠΈΠΊΠ΅. Π STM32CubeIDE ΠΈΠ»ΠΈ PlatformIO Π½Π°Π²Π΅Π΄ΠΈΡΠ΅ ΠΊΡΡΡΠΎΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Ρ auto β IDE ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ ΡΠ΅Π°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ.
- ΠΠ·Π±Π΅Π³Π°ΠΉΡΠ΅ auto Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»Π°Ρ . ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠ°ΡΡ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² Π² ΡΠ°Π·Π½ΡΡ ΠΌΠΎΠ΄ΡΠ»ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ΅ CAN ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅).
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ auto& Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ
ΡΡΡΡΠΊΡΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ
CAN_FilterTypeDefΠ² STM32 HAL. - ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ Π½Π΅ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠ΅ ΡΠΈΠΏΡ. ΠΡΠ»ΠΈ 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?
ΠΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ Π΄Π²ΡΠΌΡ ΡΠ°ΠΊΡΠΎΡΠ°ΠΌΠΈ:
- Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ: ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π²ΡΠΎΠ΄Π΅ mcp2515 ΠΈΠ»ΠΈ SPI ΠΌΠΎΠ³ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π½ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌ (AVR, ESP32, STM32), Π³Π΄Π΅ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΠΈΠΏΠΎΠ² ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ. auto ΠΌΠΎΠΆΠ΅Ρ ΡΠΊΡΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΠΈ.
- ΠΡΠ»Π°Π΄ΠΊΠ°: ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ CAN-ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡΠΌΠΈ ΡΠ°ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π²ΡΡΡΠ½ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠΈΠΏΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,
uint8_tvsint8_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 (Π±Π°ΠΉΡ) |
|---|---|---|
| Π―Π²Π½ΡΠ΅ ΡΠΈΠΏΡ | 12456 | 1844 |
| auto | 12448 | 1844 |
| auto& | 12440 | 1832 |
ΠΡΠ²ΠΎΠ΄: auto Π½Π΅ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ, Π° auto& Π΄Π°ΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ RAM Π·Π° ΡΡΡΡ ΠΈΠ·Π±Π΅Π³Π°Π½ΠΈΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ.