Сб мар 21, 2020 16:58:56
arkhnchul писал(а):constexpr-ы обычно лаконичнее и понятнее развесистых макросов
#define bitrev(x) (((x) & 0x01 ? 0x80 : 0) | \
((x) & 0x02 ? 0x40 : 0) | \
((x) & 0x04 ? 0x20 : 0) | \
((x) & 0x08 ? 0x10 : 0) | \
((x) & 0x10 ? 0x08 : 0) | \
((x) & 0x20 ? 0x04 : 0) | \
((x) & 0x40 ? 0x02 : 0) | \
((x) & 0x80 ? 0x01 : 0))
Сб мар 21, 2020 17:03:39
tmp = bitrev((3<<A)|(4<<B)|(5<<C))
Вс мар 22, 2020 09:56:56
*(volatile uint8_t *)&SPI1->DR = bitrev(SPI1->DR);
Вс мар 22, 2020 10:06:10
Вс мар 22, 2020 10:16:01
Вс мар 22, 2020 11:17:51
Вс мар 22, 2020 11:32:05
Вс мар 22, 2020 14:35:45
так я и спрашиваю о слабостях.VladislavS писал(а):Это, кстати, было не единственное слабое место макроса
Вс мар 22, 2020 15:29:22
Вс мар 22, 2020 16:38:30
вы приводили листинг С++ функции, которая в частном случае не привела к порождению кода.VladislavS писал(а):Я же приводил листинг
Вс мар 22, 2020 17:06:53
Вс мар 22, 2020 17:19:17
только в том случае, если будет особым образом оформлена и использована ТОЛЬКО с константным аргументом (и то не факт). во всех прочих случаях - будет порождать код.VladislavS писал(а):это будет обычная C функция, которая с константным аргументом тоже не будет порождать код
я лишь рассчитываю, что каждый говорящий в состоянии аргументировать свои слова. но если не в состоянии - я умолкаю...VladislavS писал(а):И после этого рассчитываете что вас учить будут?
Вс мар 22, 2020 17:33:03
Вс апр 12, 2020 20:55:59
{STATE1, EVENT1, handler_1},
{STATE1, EVENT1, handler_2},
{STATE2, EVENT2, handler_3}
eState fsNormalBypass() {
...
}
...
// Transition table type
typedef eState (*trans_t[ST_LAST][EV_LAST])(void);
// Transition table
trans_t trans = {
[ST_NORMAL][EV_BTN_SHORT] = fsNormalBypass,
[ST_NORMAL][EV_BTN_LONG] = fsNormalClosed,
[ST_BYPASS][EV_BTN_SHORT] = fsBypassNormal
...
};
// Get event in order of priority
eEvent fsGetEvent() {
eEvent ret = EV_NONE;
...
return ret;
}
// Run the transition based on event
eRetCode fsTransition() {
#ifdef VERBOSE_LOGS
LOG("Transition: st %d, ev %d\r\n", state.cur_state, state.event);
#endif
if ((state.event < EV_LAST) && trans[state.cur_state][state.event] != NULL) {
state.prev_state = state.cur_state; // save previous state
state.cur_state = trans[state.cur_state][state.event](); // run the transition
return RET_OK;
}
return RET_ERROR;
}
int main(void)
{
...
while(1)
{
state.event = fsGetEvent();
if (state.event != EV_NONE)
fsTransition();
}
}
Пн апр 13, 2020 04:39:16
Пн апр 13, 2020 04:46:24
Пн апр 13, 2020 05:15:41
Пн апр 13, 2020 05:52:18
typedef enum {ST_NONE, ST_IDLE, ST_CALIBRATION, ST_NORMAL, ST_BYPASS, ST_OVERFLOW, ST_RESTORATION, ST_MAINTAINCE, ST_LAST} eState;
typedef enum {EV_NONE, EV_BTN_SHORT, EV_BTN_LONG, EV_BAT_LOW, EV_AC_SHORTAGE, EV_TIMEOUT, EV_LAST} eEvent;
Пн апр 13, 2020 06:21:00
Пн апр 13, 2020 06:39:42