реклама на сайте
подробности

 
 
> Как в Си определить выход за пределы кода (переполнение) результата операции ?
MaxiMuz
сообщение Apr 23 2013, 18:38
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Элементарная ситуация: Имеется два 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
....

Как это все оформляется в Си ?

Сообщение отредактировал MaxiMuz - Apr 23 2013, 19:18
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alexey K
сообщение Apr 24 2013, 05:54
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 14-07-11
Пользователь №: 66 220



CODE

uint16_t temp16;
uint16_t sumADC;
uint32_t sum32;

sum32 = sum32 + temp16;

if ( sum32 <= 0xFFFFFFFF )
{
sumADC = (uint16_t) sum32;
}
else
{
//overflow actions
}


Сообщение отредактировал Alexey K - Apr 24 2013, 05:56
Go to the top of the page
 
+Quote Post
ARV
сообщение Apr 24 2013, 05:59
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(Alexey K @ Apr 24 2013, 09:54) *
CODE

uint16_t temp16;
uint16_t sumADC;
uint32_t sum32;

sum32 = sum32 + temp16;

if ( sum32 <= 0xFFFFFFFF )
{
sumADC = (uint16_t) sum32;
}
else
{
//overflow actions
}
ну, все-таки скорее всего чуть-чуть иначе:
CODE

uint16_t temp16;
uint16_t sumADC;
uint32_t sum32;

sum32 = sum32 + temp16;

if ( sum32 <= 0xFFFF ) // переполнение-то для 16-бит надо отслеживать
{
sumADC = sum32;
}
else
{
//overflow actions
}


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Apr 24 2013, 07:49
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ARV @ Apr 24 2013, 09:59) *
Код
uint32_t sum32;
В avr-gcc 4.7.x имеется тип __uint24

Цитата(ViKo @ Apr 24 2013, 09:58) *
А что, arttab дал плохой совет? Доступ к флагам имеется?

Имеется. Просто обращение к SREG по маске
Код
if (SREG & (1<<n)) {...}

Лучше всю эту красоту завернуть в макрос типа:
Код
#define add16_sat(a,b) \
do \
{ \
   (a) += (b); \
   if (SREG & (1<<SREG_C)) \
   { \
      (a) = -1U; \
   } \
} while (0)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MaxiMuz   Как в Си определить выход за пределы кода (переполнение) результата операции ?   Apr 23 2013, 18:38
- - arttab   а по флагу переполнения не проще ли?   Apr 24 2013, 01:06
- - maksimp   Такой именно ассемблерный код как вы хотите может ...   Apr 24 2013, 03:09
|- - MaxiMuz   Цитата(maksimp @ Apr 24 2013, 06:09) Тако...   Apr 25 2013, 10:05
|- - maksimp   Цитата(MaxiMuz @ Apr 25 2013, 14:05) введ...   Apr 25 2013, 18:09
|- - MaxiMuz   Цитата(maksimp @ Apr 25 2013, 21:09) Пров...   Apr 26 2013, 06:06
- - VslavX   Можно попробовать так: Кодuint16_t temp16; uint16_...   Apr 24 2013, 05:14
- - Vetal-Soft   Кодif ((0xffff-sumADC) < temp16...   Apr 24 2013, 05:58
- - ViKo   А что, arttab дал плохой совет? Доступ к флагам им...   Apr 24 2013, 05:58
- - Alexey K   Согласен. Утро однако   Apr 24 2013, 06:01
- - MrYuran   А при сравнении флаг С учитывается? Иначе крайние ...   Apr 24 2013, 07:00
- - XVR   Сделайте ассемблерную inline функцию. GCC это очен...   Apr 26 2013, 06:26


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 22:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016