MegaJohn (06.04.2012 15:37, просмотров: 153) ответил SciFi на Полное ТЗ - в студию. Пока имеем "макроязык" (хз что значит) и мистические письмена из заглавных букв. Без Шерлока не разберёшься.
абьясняю[+] есть AVR и на нем запущена самодельная кооперативная RTOS
есть к примеру два кнопки и соответсвующих цепочки дейсвий. Представлю их так
void on_button1( void )
{ // попали сюда после нажатия кнопки 1
connect_to_gprs();
for( u8 i = 0; i < 10; i++ )
{
get_glonass_data();
send_gprs( glonass_data() );
}
disconnect_gprs();
}
void on_button2( void )
{ // попали сюда после нажатия кнопки 2
connect_to_gprs();
for( u8 i = 0; i < 20; i++ )
{
get_gps_data();
send_gprs( gps_data() );
}
disconnect_gprs();
}
но вот захотелось чтобы:
вызов функций из одного потока,
не было блокировок,
был читаем алгоритм,
тогда придумал типо:
static Tcmd_seq cmd_seq_button1[] = {
SET_CNT_0, 10,
CONNECT_GPRS,
GET_DATA_GLONASS,
SEND_GPRS_DATA,
IF_CNT_0_NOT_ZERO_JMP_BACK, 3,
END
};
static Tcmd_seq cmd_seq_button2[] = {
SET_CNT_0, 20,
CONNECT_GPRS,
GET_DATA_GPS,
SEND_GPRS_DATA,
IF_CNT_0_NOT_ZERO_JMP_BACK, 3,
END
};
Tcmd_seq* cmd_seq_p = NULL;
void on_button1( void )
{
cmd_seq_p = cmd_seq_button1;
}
void on_button2( void )
{
cmd_seq_p = cmd_seq_button2;
}
while( true )
{
if( cmd_seq_p == NULL ) continue;
switch( *cmd_seq_p )
{
case SET_CNT_0: cnt[0] = *(++cmd_seq_p); cmd_seq_p++; break;
case CONNECT_GPRS: modem_gprs_connect(); cmd_seq_p++; break;
case GET_DATA_GPS: get_gps_data(); cmd_seq_p++; break;
case GET_DATA_GLONASS: get_glonass_data(); cmd_seq_p++; break;
case SEND_GPRS_DATA: modem_gprs_send(); cmd_seq_p++; break;
case BC_IF_CNT_0_NOT_ZERO_JMP_BACK:
if( cnt[0] != 0 )
cmd_seq_p -= *(++cmd_seq_p);
else
cmd_seq_p++;
break;
}
}