ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
10 июля
321097 Топик полностью
MegaJohn (06.04.2012 15:37, просмотров: 119) ответил 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; } }