ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΠΏΡΠΈΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΊ C++ Π΄Π»Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ².
ΠΠ°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Ρ β ΡΡΠΎ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΠΎΠ΄Π½ΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ ΡΠ»Π΅Π΄ΠΈΡΡ ΠΈ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ, ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΡΡΠΈΠ΅ Π² Π΄ΡΡΠ³ΠΈΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠ°Ρ
. ΠΠ°Π½Π½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΡΠ°ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π² ΡΠΈΡΡΠ°ΡΠΈΡΡ
, Π² ΠΊΠΎΡΠΎΡΡΡ
ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ, ΡΡΠΎ Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»ΠΈ Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠΉ ΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ.
GoF Π΄Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅: Π½Π°Π±Π»ΡΠ΄Π°ΡΠ΅Π»Ρ (Π°Π½Π³Π». Observer) β ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΡΠΈΠΏΠ° Β«ΠΎΠ΄ΠΈΠ½ ΠΊΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΒ» ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π²ΡΠ΅ Π·Π°Π²ΠΈΡΡΡΠΈΠ΅ ΠΎΡ Π½Π΅Π³ΠΎ ΠΎΠΏΠΎΠ²Π΅ΡΠ°ΡΡΡΡ ΠΎΠ± ΡΡΠΎΠΌ ΠΈ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡ ΠΈΠ· ΠΆΠΈΠ·Π½ΠΈ: ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ ΠΎΡΠΎΡΠΌΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΡ Π½Π° Π³Π°Π·Π΅ΡΡ ΠΈΠ»ΠΈ ΠΆΡΡΠ½Π°Π», Π²Π°ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π΅Π·Π΄ΠΈΡΡ Π² ΡΡΠΏΠ΅ΡΠΌΠ°ΡΠΊΠ΅Ρ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ, Π½Π΅ Π²ΡΡΠ΅Π» Π»ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ, ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΡΡΠ»Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π²ΡΡ
ΠΎΠ΄Π° ΠΏΡΡΠΌΠΎ ΠΊ Π²Π°ΠΌ Π΄ΠΎΠΌΠΎΠΉ. ΠΠ·Π΄Π°ΡΠ΅Π»ΡΡΡΠ²ΠΎ Π²Π΅Π΄ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ² ΠΈ Π·Π½Π°Π΅Ρ, ΠΊΠΎΠΌΡ ΠΊΠ°ΠΊΠΎΠΉ ΠΆΡΡΠ½Π°Π» ΡΠ»Π°ΡΡ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ, ΠΈ ΠΆΡΡΠ½Π°Π» ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Π΅Ρ ΠΊ Π²Π°ΠΌ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡ.
MSP430.js | ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ
ΠΠ°Π²Π°ΠΉΡΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΠΌΠΈΒ» ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΠ΅ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ
ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ
ΠΎΡΡΡ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ, Π½Π°Π·ΠΎΠ²ΡΠΌ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°ΠΌΠΈΒ».
ΠΠ°ΡΡΠ΅ΡΠ½ Β«ΠΠ°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΡΒ» ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ Ρ
ΡΠ°Π½ΠΈΡΡ Π²Π½ΡΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» (ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°) ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠ»ΠΎΠΊ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ²Β». ΠΡΠΈΡΡΠΌ, Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅ΡΡΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. ΠΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ, Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΡΠΎΡΡΡ
Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΈΒ» ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈΠ»ΠΈ ΡΠ±ΠΈΡΠ°ΡΡ ΡΠ΅Π±Ρ ΠΈΠ· ΡΠΏΠΈΡΠΊΠ°.
ΠΠΎΠ³Π΄Π° Π² Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»Π΅Β» Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡΡ Π²Π°ΠΆΠ½ΠΎΠ΅ ΡΠΎΠ±ΡΡΠΈΠ΅, ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΡΡΡΡ ΠΏΠΎ ΡΠΏΠΈΡΠΊΡ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ²Β» ΠΈ ΠΎΠΏΠΎΠ²Π΅ΡΠ°ΡΡ ΠΈΡ
ΠΎΠ± ΡΡΠΎΠΌ, Π²ΡΠ·ΡΠ²Π°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²-ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ².
observers/state.h
#include "DoublyLinkedList.h"
#include "non-copyable.h"
namespace obsevers {
// alias
template<class T> using DLLE = mozilla::DoublyLinkedListElement<T>;
namespace state {
typedef enum {
left_active,
left_sleep
} state_t;
struct IObserver : public DLLE<IObserver>, NonCopyable
{
virtual void observe(state_t) = 0;
};
class Container : NonCopyable
{
mozilla::DoublyLinkedList<IObserver> mList;
public:
void addObserver(IObserver* aObserver)
{
// Will assert if |aObserver| is part of another list.
mList.pushFront(aObserver);
}
void removeObserver(IObserver* aObserver)
{
// Will assert if |aObserver| is not part of |list|.
mList.remove(aObserver);
}
void notifyObservers(state_t aState)
{
for (IObserver& o : mList) {
o.observe(aState);
}
}
};
extern Container event;
}
}
Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΈΒ» ΠΎΠ±ΡΠ°Π·ΡΡΡ Π΄Π²ΡΡΠ²ΡΠ·Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠ±ΠΎΠΉΡΠΈΡΡ Π±Π΅Π· Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ. ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ Π²Π°ΠΆΠ½ΠΎ Π΄Π»Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠΎΠ² ΠΎΠΏΠΈΡΠ°Π½ΠΎ ΡΡΡ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π³ΠΎΡΠΎΠ²Π°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π²ΡΡΠ²ΡΠ·Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° Π²Π·ΡΡΠ°Ρ ΠΈΠ· ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΎΠ² mozilla.
Π¨Π°Π±Π»ΠΎΠ½ Β«ΠΠ°Π±Π»ΡΠ΄Π°ΡΠ΅Π»ΡΒ» ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ. ΠΠ±ΡΡΠ½ΠΎ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ Π³Π»Π°Π²Π½ΡΠΉ ΡΠΈΠΊΠ» ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ΅Π»ΠΎ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ
ΡΠ°ΡΡΠ΅ΠΉ: Π²ΡΠ±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΡ. ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ
Π·Π°Π΄Π°ΡΠ°Ρ
ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌ Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΎΠ±ΡΡΠΈΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ.
app.cpp
#include "app.h"
#include "hal.h"
#include "observers/buttons.h"
#include "observers/state.h"
#include "tasks/left.h"
#include "tasks/right.h"
#include "tasks/counter.h"
using namespace obsevers;
buttons::Container obsevers::buttons::event;
state::Container obsevers::state::event;
namespace app {
int run() {
tasks::left::start();
tasks::right::start();
tasks::counter::start();
char lastBtns = 0;
volatile uint16_t longPress = 0; // TODO: use timer
state::state_t lastState = state::left_sleep;
for (;;) {
char btns = hal::get_buttons();
if (!lastBtns && btns) {
buttons::event.notifyObservers(btns);
}
if (btns & 1 /* left first button */) {
if (longPress && !--longPress)
{
switch (lastState) {
case state::left_active:
lastState = state::left_sleep;
break;
case state::left_sleep:
lastState = state::left_active;
break;
}
state::event.notifyObservers(lastState);
}
} else {
longPress = 5000;
}
lastBtns = btns;
// other events like timer e.t.c...
}
return 0;
}
}
Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Π΄Π²Π° ΡΠΎΠ±ΡΡΠΈΡ: ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ Π½Π°ΠΆΠ°ΡΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ. ΠΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ (Π΄Π»ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π½Π°ΠΆΠ°ΡΠΈΠ΅) Π»Π΅Π²ΡΠ΅ Π»Π°ΠΌΠΏΠΎΡΠΊΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°ΡΡΡΡ / ΠΎΡΠΏΠΈΡΡΠ²Π°ΡΡΡΡ ΠΎΡ ΡΠΎΠ±ΡΡΠΈΡ Π½Π°ΠΆΠ°ΡΠΈΡ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ. ΠΡΠ°Π²ΡΠ΅ Π»Π°ΠΌΠΏΠΎΡΠΊΠΈ ΠΈ ΡΡΡΡΡΠΈΠΊ Π½Π°ΠΆΠ°ΡΠΈΠΉ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Ρ Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π²ΡΠ΅Π³Π΄Π°.
ΠΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°ΠΉΡΠ΅ΡΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½ΠΈΡ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ²Β». ΠΠ΅ΡΠΎΠ΄ addObserver
ΠΊΠ»Π°ΡΡΠ° state::Container
Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π½ΠΎΠ²ΠΎΠ³ΠΎ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°Β» Π² Π½Π°ΡΠ°Π»ΠΎ ΡΠ²ΡΠ·Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ°. Π Π΅ΡΠ»ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½Π΅ Π² Π½Π°ΡΠ°Π»ΠΎ Π° Π² ΠΊΠΎΠ½Π΅Ρ ? ΠΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΡΡΠΈΡΠ°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ? ΠΡΠ±ΠΎΠΉ. ΠΡΠΆΠ½ΠΎ ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄ ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΎΠ±Ρ
ΠΎΠ΄Π° Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ²Β» Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²Π»ΠΈΡΠ» Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π§Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΡΠΈΡΡΠ΅ΠΌΡ Π·Π½Π°ΡΡ Π΄ΡΡΠ³ ΠΎ Π΄ΡΡΠ³Π΅, ΡΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ ΠΈΡ
ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΈ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡ. Π ΡΠΈΠ»Π΅ ΡΠ»Π°Π±ΡΡ
ΡΠ²ΡΠ·Π΅ΠΉ ΡΡΡΡ Π½ΠΈΠΆΠ΅.
tasks/left.cpp
#include "left.h"
#include "color-observer.h"
#include "observers/state.h"
#include "draw.h"
#include "hal.h"
using namespace obsevers;
using namespace tasks;
class LockerObserver : public state::IObserver {
ColorObserver<hal::LeftLeds, 1, 2, 3, 0> o;
void observe(state::state_t aState) override {
switch (aState) {
case state::left_active:
str("left subscribed ");
buttons::event.addObserver(&o);
break;
case state::left_sleep:
str("left unsubscribed");
buttons::event.removeObserver(&o);
break;
}
}
public:
void str(const char* str) {
draw::str(draw::PAGE_0, str);
}
};
static LockerObserver observer;
namespace tasks {
namespace left {
void start() {
observer.str("left unsubscribed");
state::event.addObserver(&observer);
}
}
}
ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΌΠΎΠ³ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ, Π½Π΅ ΠΎΠ±Π»Π°Π΄Π°Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ Π΄ΡΡΠ³ ΠΎ Π΄ΡΡΠ³Π΅, ΡΠ°ΠΊΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π½Π°Π·ΡΠ²Π°ΡΡ ΡΠ»Π°Π±ΠΎΡΠ²ΡΠ·Π°Π½Π½ΡΠΌΠΈ. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, ΡΡΠΎ Π·Π½Π°Π΅Ρ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ» ΠΎ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°Ρ
Β», β ΡΠΎ, ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ (IObserver). ΠΠΌΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ Π½ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠ°Β», Π½ΠΈ Π΅Π³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΡ. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΡΡ
ΡΠΈΠΏΠΎΠ² Β«ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ²Β» Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Β«ΠΈΠ·Π΄Π°ΡΠ΅Π»ΡΒ».
ΠΠ° Π±Π°Π·Π΅ ΡΠ»Π°Π±ΠΎΡΠ²ΡΠ·Π°Π½Π½ΡΡ
Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡ ΡΡΡΠΎΡΡΡΡ Π³ΠΈΠ±ΠΊΠΈΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Ρ
ΠΎΡΠΎΡΠΎ Π°Π΄Π°ΠΏΡΠΈΡΡΡΡΡΡ ΠΊ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΠΌ ΠΌΠ΅ΠΆΠ΄Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ.
ΠΡΡΡ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π° ΡΠΈΠΏΠ° ΡΠ·ΡΠΊΠΎΠ² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ: ΡΠ΅, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΡΠ΄ΠΈ Π²ΡΡ Π²ΡΠ΅ΠΌΡ ΡΡΠ³Π°ΡΡΡΡ, ΠΈ ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΡΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ. β Bjarne Stroustrup
ΠΠ°ΠΊ Π²Ρ Π΄ΡΠΌΠ°Π΅ΡΠ΅, ΡΡΠΎ Π²ΡΠ²Π΅Π΄Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ?
~$ strings a.out | grep alloc
# output
lib_a-malloc.o
lib_a-nano-mallocr.o
malloc
_malloc_r
__malloc_sbrk_start
__malloc_free_list
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΡ Π½Π°ΡΠ°Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ΅ΡΠΈΠ» ΠΏΠΎΠΌΠΎΡΡ ΠΈ ΠΌΠΎΠ»ΡΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π² ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ» malloc
ΠΈ ΡΡΠΎ ΡΠ²Π½ΠΎ Π½Π΅ ΡΠΎ, ΡΡΠΎ ΠΌΡ Ρ
ΠΎΡΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°Ρ
. ΠΠΎΠΆΠ½ΠΎ Π»ΠΈ ΡΡΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ ?
Π£ Π½Π°Ρ ΡΡΡ GCC-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠ°Π²ΠΈΡΡ ΡΠ²ΠΎΠΈ ΠΎΠ±ΡΡΡΠΊΠΈ Π½Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΡΠ»ΠΎΠΌΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΠΈ malloc
, calloc
, realloc
, free
:
-fno-builtin -Wl,--wrap=malloc -Wl,--wrap=calloc \
-Wl,--wrap=realloc -Wl,--wrap=free -Wl,--wrap=sbrk
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ malloc
Π±ΡΠ΄Π΅Ρ Π²ΡΠ·Π²Π°Π½Π° __wrap_malloc
ΠΈ Ρ.Π΄. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ __wrap_malloc
, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΡΠ»ΠΎΠΌΠ°Π΅ΡΡΡ. ΠΡΠ»ΠΈ ΠΆΠ΅ malloc
Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² ΠΊΠΎΠ΄Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΡΠ΄Π°ΡΡ ΠΏΡΠΎΡΠΈΠ²ΠΊΡ.
MSP430.js | ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ
Π ΡΡΠ°ΡΠΎΠΌ Π΄ΠΎΠ±ΡΠΎΠΌ CΠΈ ΠΏΠΎΠ»ΠΈΠΌΠΎΡΡΠΈΠ·ΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π² Π²ΠΈΠ΄Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ. ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ Π² CΠΈ β ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ
ΡΡΠ½ΠΊΡΠΈΠΉ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ qsort. Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΡΠΎΡΡΠ°: ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π»ΠΈΡΡ Β«ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΠΊΠΎΠ΄Β», Π² Π½ΠΈΡ
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΡΡΠ°ΡΡΠΊΠ° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π Π°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π»ΠΈΡΡ Π΄Π»Ρ ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΠΈ Π² ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ ΠΎ Π²ΡΠ·ΠΎΠ²Π΅.
observers/state.h
#include "DoublyLinkedList.h"
#include "non-copyable.h"
namespace obsevers {
// alias
template<class T> using DLLE = mozilla::DoublyLinkedListElement<T>;
namespace state {
typedef enum {
left_active,
left_sleep
} state_t;
class Observer : public DLLE<Observer>, NonCopyable
{
typedef void (*ObserveFunc) (state_t, Observer*);
ObserveFunc m_observe_func_ptr;
public:
void observe(state_t aState) {
(*m_observe_func_ptr)(aState, this);
}
Observer(ObserveFunc f): m_observe_func_ptr(f){}
};
template<class T>
class Adapter : public Observer
{
T m_observer_impl;
public:
Adapter(): Observer(
[](state_t aState, Observer* aThis)
{
auto self = static_cast<Adapter*>(aThis);
self->m_observer_impl.observe(aState);
}){/* empty constructor */}
};
}
}
tasks/left.cpp
#include "left.h"
#include "color-observer.h"
#include "observers/state.h"
#include "draw.h"
#include "hal.h"
using namespace obsevers;
using namespace tasks;
static void str(const char* str) {
draw::str(draw::PAGE_0, str);
}
struct LockerObserver : NonCopyable {
buttons::Adapter<ColorObserver<hal::LeftLeds, 1, 2, 3, 0>> o;
void observe(state::state_t aState) {
switch (aState) {
case state::left_active:
str("left subscribed ");
buttons::event.addObserver(&o);
break;
case state::left_sleep:
str("left unsubscribed");
buttons::event.removeObserver(&o);
break;
}
}
};
static state::Adapter<LockerObserver> observer;
namespace tasks {
namespace left {
void start() {
str("left unsubscribed");
state::event.addObserver(&observer);
}
}
}
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ Π±ΠΎΠ»Π΅Π΅ ΡΠ»Π΅Π³Π°Π½ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΡΡΡΠΈΡΡ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡ Π²ΡΠ·ΠΎΠ²Π° malloc, Π½ΠΎ Π² ΡΠ΅Π»ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π²ΠΏΠΎΠ»Π½Π΅ ΡΡΠ΅Π΄ΠΎΠ±Π½ΡΠΌ.
There are comments.