Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Как в Си определить выход за приделы кода (переполнение) результата операции ?

Непрочитано 23.04.2013, 23:23  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Как в Си определить выход за приделы кода (переполнение) результата операции ?

Элементарная ситуация: Имеется два 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
....
Как это сделать на Си ?
Реклама:
MaxiMuz79 вне форума  
Непрочитано 23.04.2013, 23:31  
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 328
Сказал спасибо: 104
Сказали Спасибо 106 раз(а) в 70 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Может складывать надо как 32 бита.
Djakovskij вне форума  
Непрочитано 23.04.2013, 23:45  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Флаг переноса в SREG можно проверять
Ara41 вне форума  
Непрочитано 23.04.2013, 23:47  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от Djakovskij Посмотреть сообщение
Может складывать надо как 32 бита.
избыточно получится, слишком много регистров
MaxiMuz79 вне форума  
Непрочитано 23.04.2013, 23:48  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от Ara41 Посмотреть сообщение
Флаг переноса в SREG можно проверять
как это сделать с асм-вставками я знаю , а вот как чисто на Си ?..
MaxiMuz79 вне форума  
Непрочитано 23.04.2013, 23:49  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Можно так проверить

Код:
 uint16_t temp16;
 uint16_t sumADC; 

if (sumADC›~temp16)
 { // Отключение АЦП !!
 ADCSRA=(1‹‹ADEN);
}

Последний раз редактировалось Yurkin2007; 24.04.2013 в 00:27.
Yurkin2007 вне форума  
Непрочитано 23.04.2013, 23:58  
Ara41
Почётный гражданин KAZUS.RUN
 
Регистрация: 30.09.2006
Сообщений: 1,557
Сказал спасибо: 157
Сказали Спасибо 660 раз(а) в 430 сообщении(ях)
Ara41 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Сообщение от MaxiMuz79 Посмотреть сообщение
как это сделать с асм-вставками я знаю , а вот как чисто на Си ?..
if (SREG & (1‹‹0)) ADCSRA=(1‹‹ADEN);
как-то так..
Ara41 вне форума  
Сказали "Спасибо" Ara41
MaxiMuz79 (24.04.2013)
Непрочитано 24.04.2013, 00:05  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию 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
думаю что это не то
MaxiMuz79 вне форума  
Непрочитано 24.04.2013, 00:18  
MaxiMuz79
Гражданин KAZUS.RUN
 
Аватар для MaxiMuz79
 
Регистрация: 06.04.2010
Адрес: Санкт-Петербург - Волжский
Сообщений: 528
Сказал спасибо: 73
Сказали Спасибо 56 раз(а) в 45 сообщении(ях)
MaxiMuz79 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Ara41, Спасибо !
получилось:
Цитата:
if (SREG & (1‹‹5))
22a: 0f b6 in r0, 0x3f ; 63
22c: 05 fe sbrs r0, 5
похоже сделать чтото приличнее этого в avr-gcc неудастся
MaxiMuz79 вне форума  
Непрочитано 24.04.2013, 00:24  
Yurkin2007
Заблокирован
 
Регистрация: 27.03.2007
Сообщений: 1,327
Сказал спасибо: 12
Сказали Спасибо 576 раз(а) в 460 сообщении(ях)
Yurkin2007 на пути к лучшему
По умолчанию Re: Как в Си определить выход за приделы кода (переполнение) результата операции ?

Получилось - ну, и славно !
Вдогонку поясню свой способ. Вот есть число temp16. Сколько ещё места до 0xFFFF осталось? Это как раз ~temp16. И если значение sumADC больше этого зазора, то при сложении произойдёт переполнение.
То есть можно узнать результат, не производя само сложение и не портя уже накопленную сумму sumADC переполнением.

Последний раз редактировалось Yurkin2007; 24.04.2013 в 00:32.
Yurkin2007 вне форума  
Эти 2 пользователя(ей) сказали Спасибо Yurkin2007 за это сообщение:
MaxiMuz79 (25.04.2013), robert777 (26.04.2013)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Измерение времени выполнения куска кода в Протеусе. Как? tems-ya Proteus 4 21.01.2010 21:41
ATmega128 PORTF как инициализировать на выход lzrvt Микроконтроллеры, АЦП, память и т.д 3 07.10.2007 17:07
Как уменьшить прошивку кода написанного на С? graham Микроконтроллеры, АЦП, память и т.д 30 14.01.2006 21:03
[Решено] Порт А неработает как выход LDA Коллекция глюков 2 06.12.2004 20:25
переполнение TMR2 ??? Picallka Микроконтроллеры, АЦП, память и т.д 2 11.02.2004 21:32


Часовой пояс GMT +4, время: 11:21.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.