|
К знатокам, Локальные переменные. |
|
|
|
 |
Ответов
|
Sep 24 2007, 07:05
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Лично я в данном моменте (обмен по RSу, например) предпочитаю использовать костыль собственного изобретения примерно такого плана: Код #include "setjmp.h"
#define CONTEXT_SWT_vect SPM_RDY_vect
#pragma vector=CONTEXT_SWT_vect __interrupt void CNTX_SWT(void);
#define IN_CSWT ACSR_ACIS1
jmp_buf main_task; jmp_buf rs_task; char rs_rstack[8]; char rs_cstack[64];
char rxbuf[16];
#pragma vector=USART0_RXC_vect __interrupt __raw void rs_rx(void) { UCSR0B_RXCIE0=0; if (!IN_CSWT) { IN_CSWT=1; __enable_interrupt(); ((void(*)(void))CNTX_SWT)(); __disable_interrupt(); IN_CSWT=0; } }
#pragma vector=USART0_UDRE_vect __interrupt __raw void rs_tx(void) { UCSR0B_UDRIE0=0; //Запретили прерывания if (!IN_CSWT) { IN_CSWT=1; __enable_interrupt(); ((void(*)(void))CNTX_SWT)(); __disable_interrupt(); IN_CSWT=0; } }
#pragma vector=USART0_TXC_vect __interrupt __raw void rs_txc(void) { //UCSR0A=1<<TXC0; //Сбросили флаг if (!IN_CSWT) { IN_CSWT=1; __enable_interrupt(); ((void(*)(void))CNTX_SWT)(); __disable_interrupt(); IN_CSWT=0; } }
#pragma vector=TIMER1_OVF_vect __interrupt __raw void rs_timeout(void) { UCSR0B_RXCIE0=0; //Запретили прерывания от приемника if (!IN_CSWT) { IN_CSWT=1; __enable_interrupt(); ((void(*)(void))CNTX_SWT)(); __disable_interrupt(); IN_CSWT=0; } }
#pragma vector=CONTEXT_SWT_vect __interrupt void CNTX_SWT(void) { if (!setjmp(main_task)) //Запомнили контекст осн. задачи { longjmp(rs_task,1); //Перешли в контекст RS_TRX } }
void wait_int() { if (!setjmp(rs_task)) //Запомнили контекст RS_TASK { longjmp(main_task,1); //Перешли в контекст осн. задачи } }
char rxbuf[16];
//txsize - количество байт без контрольной суммы __x char DO_RS(char *out, char txsize, char n_rs, char CRC8RX) { char CRC8; char c; char rxerr=0; UCSR0A=1<<TXC0; //Сбросили флаг от предыдущего прерывания CRC8=CRC8tab[c=(*out++)]; //ПУ всегда начинает с нуля __disable_interrupt(); UDR0=c; while(PINE_Bit1); //Ждем начала стартового бита if (n_rs) EnaTX2; else EnaTX0; //Разрешаем передатчик __enable_interrupt(); while(--txsize) { CRC8=CRC8tab[CRC8^(UDR0=(*out++))]; UCSR0B_UDRIE0=1; //Разрешили прерывания от UDRIE wait_int(); //Ждем освобождения буфера } UDR0=CRC8; UCSR0B_TXCIE0=1; //Разрешили прерывание от TXC wait_int(); //Байт контрольной суммы - последний байт UCSR0B_TXCIE0=0; //Запретили прерывания от TXC DisTX2; //Выключили каналы передачи DisTX0; if (n_rs) EnaRX2; else EnaRX0; //Разрешили приемник (пока только на драйвере) TCNT1=Time1000; TIFR=1<<(TOV1); TIMSK_TOIE1=1; //Разрешили прерывание от таймера wait_int(); //Ждем 1 мс пока переходные процессы UCSR0B_RXEN0=1; //Разрешили приемник //txsize здесь равен 0 CRC8RX=CRC8tab[CRC8RX]; //Нач. значение out=rxbuf; TCNT1=Time2200; //Время ожидания первого байта for(;;) { UCSR0B_RXCIE0=1; //Разрешили прерывания от приемника wait_int(); if (!UCSR0A_RXC0) { //Выход по таймауту if (CRC8RX) txsize=0; //Не срослась контрольная сумма break; //Выходим из цикла } //Приняли байт if (UCSR0A_FE0||UCSR0A_DOR0) { rxerr=1; //Ошибки } c=UDR0; if (txsize<sizeof(rxbuf)) { CRC8RX=CRC8tab[CRC8RX^(*out=c)]; // Читаем принятый байт в буфер приема и перерасчет CRC txsize++; out++; } else { rxerr=1; //Слишком много байт break; } TCNT1=Time1600; } UCSR0B_RXEN0=0; //Запретили приемник TIMSK_TOIE1=0; //Запретили таймер DisRX0; DisRX2; if (rxerr) txsize=0; return(txsize); //Количество принятых байт, если 0 - нет ответа }
__task __noreturn RS_TRX(void) { struct { char PPKP; char Cmd; }; char abon=0; char c; char CurRS=0; for(;;) { c=DO_RS(&PPKP,1,CurRS,abon); switch(c) { case 4: //Есть событие //Записываем событие в стек Event2FIFO(abon,rxbuf[1],rxbuf[2],0); case 2: //Нет события //....... break; default: //Ошибка //............. break; } if (!(abon=(abon+1)&0x7F)) { CurRS^=1; } } } void InitRS(void) { __disable_interrupt(); DDRE=0xFE; PORTE=0xFF; UBRR0L=25; UCSR0B_TXEN0=1; //Разрешили передатчик TCCR1B=2; ((unsigned int *)rs_task)[10]=((unsigned int)rs_rstack)+7; //SP ((unsigned int *)rs_task)[8]=((unsigned int)rs_cstack)+64; //Y ((unsigned int *)rs_task)[9]=(unsigned int)RS_TRX; //Адрес перехода if (!setjmp(main_task)) longjmp(rs_task,1); //Переходим в RS_TRX __enable_interrupt(); } Зато все просто - переменные вообще локальные, код простой до боли, не надо организовывать кучу обработчиков, передавать руками данные между ними (все в локальных переменных, там все автоматически получается), время работы с запрещенными прерываниями - минимально. Конечно, это занимает немного больше ручками вылизаного кода, но зато насколько все проще. Я понимаю, что мне сейчас скажут - "А почему бы ОСь не использовать". На это отвечу - ну вот это и есть своя собственная ось без кода на асме  Вот этот код (как заготовка) кочует из проекта в проект, с минимальными изменениями. Очень удобно. Теперь хотелось бы услышать от адептов C++, что мне даст применение плюсов в данном месте? Чем мне облегчит жизнь? Положить все переменные в класс? А смысл?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Sep 24 2007, 08:35
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Цитата(Rst7 @ Sep 24 2007, 11:05)  Теперь хотелось бы услышать от адептов C++, что мне даст применение плюсов в данном месте? Чем мне облегчит жизнь? Положить все переменные в класс? А смысл? Лично у меня подход примерно следующий: есть класс, назовем его TCanal. У него есть методы типа getByte и onByteRecieve, которые вызываются из прерываний УАРТа. Этот класс реализует логику посылки запроса и получения ответа (или не получения - по таймауту ожидания). Логика обработки принятых байт лежит в производном классе (она своя для каждого протокола), где подключается соответствующий обработчик. Преимущества: есть совершенно не меняющийся файл canal.h / canal.cpp, общий для всех проектов. Есть также куча не меняющихся файлов canalXXX.h / canalXXX.cpp, которые реализуют логику получения пакета для конкретного протокола. Далее для конкретного проекта просто создаются объекты нужных классов, пишутся обработчики прерываний (равно 1 строка в каждом) и ВСЕ! Никакой ручной подгонки кода! Любое количество уартов! То же самое вполне можно писать на чистом C. Примерно так: Код typedef struct _TCanalData { .......... } TCanalData;
byte canal_getByteForSend(TCanalData *pData); void canal_onByteRecieved(TCanalData *pData, byte dt); Преимущества C++ при таком подходе - код выглядит красивее. Кстати, куча функций в WinAPI (чистый C) написаны примерно в таком духе - первым аргументом идет указатель на специфическую структуру данных, а затем - собственно аргументы ф-ции.
|
|
|
|
|
Sep 24 2007, 08:51
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(Непомнящий Евгений @ Sep 24 2007, 11:35)  Лично у меня подход примерно следующий: есть класс, назовем его TCanal. У него есть методы типа getByte и onByteRecieve, которые вызываются из прерываний УАРТа. Этот класс реализует логику посылки запроса и получения ответа (или не получения - по таймауту ожидания). Логика обработки принятых байт лежит в производном классе (она своя для каждого протокола), где подключается соответствующий обработчик. Не понятен мне смысл навешивать классы на код (аналогичный код на приеме) Код while(--txsize) { CRC8=CRC8tab[CRC8^(UDR0=(*out++))]; UCSR0B_UDRIE0=1; //Разрешили прерывания от UDRIE wait_int(); //Ждем освобождения буфера } Ради чего? Цитата Преимущества C++ при таком подходе - код выглядит красивее. Т.е. делать обработчики, передавать параметры, указатели и т.д - не важно, это делается через классы или структуры. Непонятна мне такая красота. Куда уж красивее? Цикл и все. В соответствии с идеологией цпп я должен тут обязятельно навесить кучу методов. Но зачем??? Неужели будет красивее и понятнее?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Sep 24 2007, 09:51
|
Знающий
   
Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153

|
Вдогонку Цитата(Rst7 @ Sep 24 2007, 12:51)  В соответствии с идеологией цпп я должен тут обязятельно навесить кучу методов. Но зачем??? Неужели будет красивее и понятнее? 1. В соответствии с идеологией не цпп, а ООП. Это совершенно разные понятия  2. Нужен баланс - каждый класс должен иметь конкретную, вполне определенную функциональность. Если эта функциональность мизерна - можно удалить класс, перенеся его функциональность в тем места, где он использовался. Если класс имеет очень большую функциональность - хорошо бы его разбить на несколько более мелких. Цель - сделать программу понятнее, ее куски - независимыми от других (по возможности) и повторно используемыми. Это вполне работает и в чистом С - иметь миллион мелких функций плохо, равно как и иметь несколько гигантских...
|
|
|
|
|
Sep 24 2007, 10:14
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(Непомнящий Евгений @ Sep 24 2007, 12:51)  Вдогонку 1. В соответствии с идеологией не цпп, а ООП. Это совершенно разные понятия  Безусловно. Я, конечно, имел в виду ООП. С++ как среду реализации идей ООП. Цитата 2. Нужен баланс - каждый класс должен иметь конкретную, вполне определенную функциональность. Если эта функциональность мизерна - можно удалить класс, перенеся его функциональность в тем места, где он использовался. Если класс имеет очень большую функциональность - хорошо бы его разбить на несколько более мелких. Цель - сделать программу понятнее, ее куски - независимыми от других (по возможности) и повторно используемыми. Это вполне работает и в чистом С - иметь миллион мелких функций плохо, равно как и иметь несколько гигантских... Программа понятна. Читабельна. Обозрима. Какой плюс мне даст переделка этого кода в соответствии с ООП? Как бы вы порекомендовали разложить это по классам/методам? Какой выигрыш я получу?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
Сообщений в этой теме
SasaVitebsk К знатокам Sep 6 2007, 00:58 dxp Все равно как-то туманно. Вы бы псевдокод привели,... Sep 6 2007, 04:33 alexander55 Цитата(SasaVitebsk @ Sep 6 2007, 04:58) П... Sep 6 2007, 04:53 Сергей Борщ Да, действительно мутновато. Если я правильно поня... Sep 6 2007, 05:02 MALLOY2 Можно еще все нужные переменные загнать в 1 структ... Sep 6 2007, 05:49 Dog Pawlowa Цитата(SasaVitebsk @ Sep 6 2007, 03:58) П... Sep 6 2007, 07:51 alexander55 Цитата(Dog Pawlowa @ Sep 6 2007, 11:51) Я... Sep 6 2007, 09:20 SasaVitebsk Лучше всех понял проблему Сергей Борщ. Я так и сде... Sep 6 2007, 11:27 scifi Цитата(SasaVitebsk @ Sep 6 2007, 15:27) В... Sep 6 2007, 13:05  SasaVitebsk Цитата(scifi @ Sep 6 2007, 16:05) Быстрее... Sep 6 2007, 19:45 Rst7 Цитата(SasaVitebsk @ Sep 6 2007, 14:27) К... Sep 8 2007, 10:49  SasaVitebsk Всем спасибо. Буду осмысливать и пробовать - экспе... Sep 9 2007, 14:54   Rst7 Цитата(SasaVitebsk @ Sep 9 2007, 17:54) В... Sep 10 2007, 06:10 vmp Похоже, здесь основная проблема - это ограничения ... Sep 7 2007, 13:42 dxp Цитата(vmp @ Sep 7 2007, 20:42) Похоже, з... Sep 8 2007, 10:12  Сергей Борщ Цитата(dxp @ Sep 8 2007, 13:12) Там (в EW... Sep 8 2007, 11:39 mdmitry Возможно, поможет сократить время выполнения генер... Sep 8 2007, 22:28 SasaVitebsk Тут проскочила чья-то фраза, что компилятор лучше ... Sep 18 2007, 09:21 alexander55 Цитата(SasaVitebsk @ Sep 18 2007, 13:21) ... Sep 18 2007, 09:49 vmp Цитата(SasaVitebsk @ Sep 18 2007, 13:21) ... Sep 18 2007, 10:45  rezident Цитата(vmp @ Sep 18 2007, 16:45) Для отде... Sep 18 2007, 13:08   vmp Цитата(rezident @ Sep 18 2007, 17:08) Изв... Sep 18 2007, 13:35    Dog Pawlowa Цитата(vmp @ Sep 18 2007, 16:35) Особенно... Sep 18 2007, 16:30     singlskv Цитата(Dog Pawlowa @ Sep 18 2007, 20:30) ... Sep 18 2007, 17:13     IgorKossak Цитата(Dog Pawlowa @ Sep 18 2007, 19:30) ... Sep 18 2007, 18:07      Rst7 Цитата(IgorKossak @ Sep 18 2007, 21:07) Е... Sep 19 2007, 05:23       alexander55 Цитата(Rst7 @ Sep 19 2007, 09:23) А вот C... Sep 19 2007, 05:57       dxp Цитата(Rst7 @ Sep 19 2007, 12:23) А вот C... Sep 19 2007, 12:18        Rst7 Цитата(dxp @ Sep 19 2007, 15:18) Отнюдь. ... Sep 19 2007, 12:34         alexander55 Цитата(Rst7 @ Sep 19 2007, 16:34) ключево... Sep 19 2007, 12:54         dxp Цитата(Rst7 @ Sep 19 2007, 19:34) Хуже бу... Sep 19 2007, 13:21          SasaVitebsk Цитата(dxp @ Sep 19 2007, 16:21) C++ - эт... Sep 21 2007, 18:26           singlskv Цитата(SasaVitebsk @ Sep 21 2007, 22:26) ... Sep 21 2007, 18:54     SasaVitebsk Цитата(Dog Pawlowa @ Sep 18 2007, 19:30) ... Sep 18 2007, 23:46 singlskv Цитата(SasaVitebsk @ Sep 18 2007, 13:21) ... Sep 18 2007, 18:41  zltigo Цитата(singlskv @ Sep 18 2007, 21:41) Соб... Sep 18 2007, 19:34   singlskv Цитата(zltigo @ Sep 18 2007, 23:34) Загну... Sep 18 2007, 19:47    zltigo Цитата(singlskv @ Sep 18 2007, 22:47) лет... Sep 18 2007, 19:57     singlskv Цитата(zltigo @ Sep 18 2007, 23:57) Дела ... Sep 18 2007, 20:16  dxp Цитата(singlskv @ Sep 19 2007, 01:41) А в... Sep 19 2007, 04:18   singlskv Цитата(dxp @ Sep 19 2007, 08:18) С++ на ... Sep 19 2007, 19:59    zltigo Цитата(singlskv @ Sep 19 2007, 22:59) Оче... Sep 19 2007, 21:03     singlskv Цитата(zltigo @ Sep 20 2007, 01:03) Оба э... Sep 19 2007, 21:27      alexander55 Цитата(singlskv @ Sep 20 2007, 01:27) Пов... Sep 20 2007, 04:58       Непомнящий Евгений Цитата(alexander55 @ Sep 20 2007, 08:58) ... Sep 20 2007, 11:42        singlskv Цитата(Непомнящий Евгений @ Sep 20 2007, 15... Sep 20 2007, 16:13         dxp Цитата(singlskv @ Sep 20 2007, 23:13) При... Sep 21 2007, 03:49         Непомнящий Евгений Цитата(singlskv @ Sep 20 2007, 20:13) А н... Sep 21 2007, 04:36          dxp Цитата(Непомнящий Евгений @ Sep 21 2007, 11... Sep 21 2007, 05:50           Непомнящий Евгений Цитата(dxp @ Sep 21 2007, 09:50) P.S. В т... Sep 21 2007, 06:49            dxp Цитата(Непомнящий Евгений @ Sep 21 2007, 13... Sep 21 2007, 07:14             Maddy Цитата(dxp @ Sep 21 2007, 11:14) Ну, не з... Sep 21 2007, 08:46              dxp Цитата(Maddy @ Sep 21 2007, 15:46) Не фле... Sep 21 2007, 09:12               Maddy 2 dxp - Thanks Sep 21 2007, 09:31           alexander55 Цитата(dxp @ Sep 21 2007, 09:50) P.S. В т... Sep 21 2007, 06:51           singlskv Цитата(dxp @ Sep 21 2007, 09:50) Под джит... Sep 21 2007, 20:44            dxp Цитата(singlskv @ Sep 22 2007, 03:44) джи... Sep 22 2007, 16:52             singlskv Цитата(dxp @ Sep 22 2007, 20:52) , давайт... Sep 22 2007, 17:49              zltigo Цитата(singlskv @ Sep 22 2007, 20:49) Кон... Sep 22 2007, 18:11               singlskv Цитата(zltigo @ Sep 22 2007, 22:11) Это в... Sep 22 2007, 19:21                zltigo Цитата(singlskv @ Sep 22 2007, 22:00) Вот... Sep 22 2007, 19:33                 singlskv Цитата(zltigo @ Sep 22 2007, 23:33) Если ... Sep 22 2007, 20:09                  zltigo Цитата(singlskv @ Sep 22 2007, 23:09) Вы ... Sep 22 2007, 20:39                   singlskv Цитата(zltigo @ Sep 23 2007, 00:39) - 16b... Sep 22 2007, 21:13                    zltigo Цитата(singlskv @ Sep 23 2007, 00:13) Да,... Sep 22 2007, 21:36                     singlskv Да, далеко мы уже удалились... от темы,
единствен... Sep 22 2007, 21:47                      zltigo Цитата(singlskv @ Sep 23 2007, 00:47) Т.к... Sep 22 2007, 22:22                dxp Цитата(singlskv @ Sep 23 2007, 02:21) Это... Sep 23 2007, 08:59                 singlskv Цитата(dxp @ Sep 23 2007, 12:59) А если п... Sep 23 2007, 14:35                  dxp Цитата(singlskv @ Sep 23 2007, 21:35) Хор... Sep 23 2007, 16:10                   singlskv Цитата(dxp @ Sep 23 2007, 20:10) То, что ... Sep 23 2007, 17:20                    dxp Цитата(singlskv @ Sep 24 2007, 00:20) Ну ... Sep 24 2007, 03:38                  zltigo Цитата(singlskv @ Sep 23 2007, 17:35) zlt... Sep 23 2007, 19:21                   singlskv Цитата(zltigo @ Sep 23 2007, 23:21) Такие... Sep 23 2007, 21:00                    zltigo Цитата(singlskv @ Sep 24 2007, 00:00) Zlt... Sep 23 2007, 21:52                     singlskv Цитата(zltigo @ Sep 24 2007, 01:52) Дело ... Sep 23 2007, 22:50              dxp Цитата(singlskv @ Sep 23 2007, 00:49) Дав... Sep 22 2007, 18:56    dxp Цитата(singlskv @ Sep 20 2007, 02:59) Вы ... Sep 20 2007, 03:19 SasaVitebsk Большое спасибо за развёрнутый совет. Похоже надо ... Sep 22 2007, 17:17 dxp Цитата(SasaVitebsk @ Sep 23 2007, 00:17) ... Sep 23 2007, 13:52 SasaVitebsk Попробую я вмешаться. Я тоже делал много изделий с... Sep 23 2007, 21:36   alexander55 Цитата(Rst7 @ Sep 24 2007, 12:51) Неужели... Sep 24 2007, 09:28 Непомнящий Евгений Мой класс TCanal посылает запрос, ждет получения о... Sep 24 2007, 09:25 Rst7 Цитата(Непомнящий Евгений @ Sep 24 2007, 12... Sep 24 2007, 09:39  Непомнящий Евгений Цитата(Rst7 @ Sep 24 2007, 13:39) Или тут... Sep 24 2007, 10:38 Rst7 Цитата3. У меня логика посылки\повтора посылк... Sep 24 2007, 11:14 dxp Цитата(Rst7 @ Sep 24 2007, 18:14) Слова. ... Sep 24 2007, 11:28  Rst7 Цитата(dxp @ Sep 24 2007, 14:28) Я что-то... Sep 24 2007, 11:53   dxp Цитата(Rst7 @ Sep 24 2007, 18:53) Ну да..... Sep 24 2007, 12:06   Непомнящий Евгений Цитата(Rst7 @ Sep 24 2007, 15:53) Моя пра... Sep 24 2007, 12:08 Непомнящий Евгений Цитата(Rst7 @ Sep 24 2007, 15:14) У меня ... Sep 24 2007, 11:53  Rst7 Цитата(Непомнящий Евгений @ Sep 24 2007, 14... Sep 24 2007, 12:23   dxp Цитата(Rst7 @ Sep 24 2007, 19:23) Не прос... Sep 24 2007, 12:49   Непомнящий Евгений Цитата(Rst7 @ Sep 24 2007, 16:23) А вам -... Sep 24 2007, 12:59    dxp Цитата(Непомнящий Евгений @ Sep 24 2007, 19... Sep 24 2007, 13:35
2 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|