west329 0 14 июля, 2008 Опубликовано 14 июля, 2008 · Жалоба Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 14 июля, 2008 Опубликовано 14 июля, 2008 · Жалоба Можно какимто способом обрезать лишние операции ?Можно попробовать поиграться с оптимизацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 14 июля, 2008 Опубликовано 14 июля, 2008 · Жалоба Можно... Moderator: А картинки вместо текста постить можно? Ничего не жалко? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 14 июля, 2008 Опубликовано 14 июля, 2008 · Жалоба Moderator: А картинки вместо текста постить можно? Ничего не жалко? Я бы с удовольствием но ISIS не дает такой возможности выделить текст во время отладки только строку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 2 14 июля, 2008 Опубликовано 14 июля, 2008 · Жалоба ISIS не дает такой возможности выделить текст во время отладки только строку. 1. Читайте документацию. 2. Пользуйтесь листингами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 15 июля, 2008 Опубликовано 15 июля, 2008 · Жалоба Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера. Варианты: 1) переписать прерывание на ассемблере; 2) перевести проект на CodeVisionAVR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladimirYU 0 15 июля, 2008 Опубликовано 15 июля, 2008 · Жалоба Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера. Использовать __rаw, необходимый контекст сохранять и восстанавливать руками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
west329 0 15 июля, 2008 Опубликовано 15 июля, 2008 · Жалоба Использовать __rаw, необходимый контекст сохранять и восстанавливать руками. если есть кусок кода чтоб можно было привязатся, я с __rаw, не работал ещё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 15 июля, 2008 Опубликовано 15 июля, 2008 · Жалоба Можно какимто способом обрезать лишние операции ? Я так понимаю, протест вызывает использование регистровой пары Z? Пробуйте так: volatile unsigned char tmr_lo; volatile unsigned char tmr_hi; #pragma vector=TIMER0_OVF_vect __interrupt void _myint(void) { unsigned char c; TCNT0=0x1A; c=tmr_lo; c++; tmr_lo=c; if (!c) { c=tmr_hi; c++; tmr_hi=c; } } и на вкладке управления оптимизацией снять галочку clustering. Вот результирующий код: RSEG CODE:CODE:NOROOT(1) // 22 __interrupt void _myint(void) _myint: // 23 { ST -Y, R17 ST -Y, R16 IN R17, 0x3F // 24 unsigned char c; // 25 TCNT0=0x1A; LDI R16, 26 OUT 0x32, R16 // 26 c=tmr_lo; LDS R16, tmr_lo // 27 c++; INC R16 // 28 tmr_lo=c; STS tmr_lo, R16 // 29 if (!c) TST R16 BRNE ??_myint_0 // 30 { // 31 c=tmr_hi; LDS R16, tmr_hi // 32 c++; // 33 tmr_hi=c; INC R16 STS tmr_hi, R16 // 34 } // 35 } ??_myint_0: OUT 0x3F, R17 LD R16, Y+ LD R17, Y+ RETI 2) перевести проект на CodeVisionAVR. Этого делать точно не надо :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 16 июля, 2008 Опубликовано 16 июля, 2008 · Жалоба IMHO если прерывание настолько простое проще вообще на асме написать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 20 июля, 2008 Опубликовано 20 июля, 2008 · Жалоба Можно какимто способом обрезать лишние операции ? Уж больно жалко времени контроллера. ... TCNT0 = 0x1A ; // reload counter value ... Если имеется возможность, то лучше не делать "Reload counter value" Использовать OCR0 и CTC режим для автоперезагрузки таймера. Прерывание по OCF0 вместо TOV0. Как мимимум на 2 операции меньше будет, но самое главное - пропадет джиттер интервалов таймера. Еще. IMHO TIMEms лучше сделать U32 чтобы счетчик не переполнялся каждую минуту. А вот самое последнее о чем стоит беспокоиться - это длина этого обработчика, т.к. выполняется он аж один раз на 16 тыс. тактов (если проц на макс. частоте). IMHO если прерывание настолько простое проще вообще на асме написать. Если нет на то серьезных оснований, про асм надо забыть. В этом конкретном случае серьезных оснований нет. От того будет этот обработчик выполняться за 10 тактов или за 100 тактов ничего в системе не изменится - ресурсоемкость обработчика в обоих случаях меньше 1%. А вот если делать Reload counter value вручную как у автора, то будет работать хреново что на C, что на асм, что с коротким обработчиком, что с длинным. Время будет уплывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться