23.04.2013, 23:23
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Как в Си определить выход за приделы кода (переполнение) результата операции ?
Элементарная ситуация: Имеется два 16-битных числа , при их сложении нужно отслеживать ситуацию переполнения результата.
Пробую:
Код:
|
uint16_t temp16;
uint16_t sumADC;
if ((sumADC+=temp16)›0xffff)
{ // Отключение АЦП !!
ADCSRA=(1‹‹ADEN);} |
- не работает
Нужно как можно короче превести это к коду (для AVR):
Код:
|
add rd_l,rs_l
adc rd_h,rs_h
brcs m1
.... |
Как это сделать на Си ?
|
|
|
|
23.04.2013, 23:31
|
|
Вид на жительство
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 327
Сказал спасибо: 104
Сказали Спасибо 105 раз(а) в 69 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Может складывать надо как 32 бита.
|
|
|
|
23.04.2013, 23:45
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Флаг переноса в SREG можно проверять
|
|
|
|
23.04.2013, 23:47
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от Djakovskij
|
Может складывать надо как 32 бита.
|
избыточно получится, слишком много регистров
|
|
|
|
23.04.2013, 23:48
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от Ara41
|
Флаг переноса в SREG можно проверять
|
как это сделать с асм-вставками я знаю , а вот как чисто на Си ?..
|
|
|
|
23.04.2013, 23:49
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Можно так проверить
Код:
|
uint16_t temp16;
uint16_t sumADC;
if (sumADC›~temp16)
{ // Отключение АЦП !!
ADCSRA=(1‹‹ADEN);
} |
Последний раз редактировалось Yurkin2007; 24.04.2013 в 00:27.
|
|
|
|
23.04.2013, 23:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 30.09.2006
Сообщений: 1,560
Сказал спасибо: 158
Сказали Спасибо 661 раз(а) в 431 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Сообщение от MaxiMuz79
|
как это сделать с асм-вставками я знаю , а вот как чисто на Си ?..
|
if (SREG & (1‹‹0)) ADCSRA=(1‹‹ADEN);
как-то так..
|
|
|
|
24.04.2013, 00:05
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Yurkin2007, не понимаю каким образом условие а›(-b) может стать проверкой на переполнение ?
вот что получилось:
Цитата:
|
sumADC+=temp16;
216: 80 91 60 00 lds r24, 0x0060
21a: 90 91 61 00 lds r25, 0x0061
21e: 84 0f add r24, r20
220: 95 1f adc r25, r21
222: 90 93 61 00 sts 0x0061, r25
226: 80 93 60 00 sts 0x0060, r24
if (sumADC›~temp16)
22a: 40 95 com r20
22c: 50 95 com r21
22e: 48 17 cp r20, r24
230: 59 07 cpc r21, r25
232: 78 f4 brcc .+30 ; 0x252 ‹__vector_9+0x6e›
//if ((sumADC+=temp16)›0xffff)
{
// Отключение АЦП !!
ADCSRA=(1‹‹ADEN);
234: 80 e8 ldi r24, 0x80 ; 128
236: 86 b9 out 0x06, r24 ; 6
|
думаю что это не то
|
|
|
|
24.04.2013, 00:18
|
|
Гражданин KAZUS.RU
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 529
Сказал спасибо: 74
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Ara41, Спасибо !
получилось:
Цитата:
|
if (SREG & (1‹‹5))
22a: 0f b6 in r0, 0x3f ; 63
22c: 05 fe sbrs r0, 5
|
похоже сделать чтото приличнее этого в avr-gcc неудастся
|
|
|
|
24.04.2013, 00:24
|
|
Заблокирован
Регистрация: 27.03.2007
Сообщений: 1,328
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
|
Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?
Получилось - ну, и славно !
Вдогонку поясню свой способ. Вот есть число temp16. Сколько ещё места до 0xFFFF осталось? Это как раз ~temp16. И если значение sumADC больше этого зазора, то при сложении произойдёт переполнение.
То есть можно узнать результат, не производя само сложение и не портя уже накопленную сумму sumADC переполнением.
Последний раз редактировалось Yurkin2007; 24.04.2013 в 00:32.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Yurkin2007 за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:51.
|
|