Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/65: Рейтинг темы: голосов - 65, средняя оценка - 4.86
koriprokrommyst
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
1

+1 unsigned int, которое было равно 65535 (и прерывание)

01.07.2015, 01:28. Просмотров 11763. Ответов 30
Метки нет (Все метки)

как узнать, как в этом случае будет вести себя мк (код компилируется с помощью avr-gcc)?

на самом деле вопрос скорее про прерывания. пытаюсь посчитать, как будет быстрее:
использовать конструкцию if (сравниваем char) и внутри него по условию делаем инкремент integer переменной.
или просто делаем этот инкремент без if.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2015, 01:28
Ответы с готовыми решениями:

Размерность int или как из signed int сделать unsigned int?
Добрый день. Есть старая база уже с некоторыми данными. При развёртывании её на одном из тестовых...

Как исправить ошибку невозможно преобразовать аргумент 1 из "unsigned int" в "unsigned int []"?
Ребят, срочно прошу вас помочь.. Есть ошибка (невозможно преобразовать аргумент 1 из "unsigned...

Поместить двоичный код, в веденной строке, в переменную типа int и unsigned int.
Пользователь вводит двоичную строку (32 символа). Поместить двоичный код, в веденной строке, в...

Почему макс short int равен 65535?
Делаю sizeof() получаю 4 байта 1байт=8бит те 4байта=32 бита но бит это 0 или 1 таки образом...

Как перевести сишный unsigned int в явский int?
Кто-нибудь занимался подобным переводом кода? Поначалу я думал, что разницы вообще нет, просто ...

30
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
01.07.2015, 02:41 2
логично, что просто инкремент быстрее. По поводу беззнаковой арифметики - в вашем случае 65535 + 1 = 0
0
zot
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 4
01.07.2015, 03:11 3
На asm-е это будет 1 команда + переход ( в случае if..), ради максимум 4-6 тактов...
Я бы добавил 1 МГц к тактовой частоте процессора и не парился этой проблемой.
IAR делает такой код:
Знаковая переменная
Код
//    4 int main()
//    5 {
//    6   sykned char a = 1 ;
main:
LD        A, #0x1
//    7   if (a < 255){
//    8      a++ ;
ADD       A, #0x1
//    9   }
//   10   return 0;
CLRW      X
RET
//   11 }
Беззнаковая
Код
//    4 int main()
//    5 {
//    6   unsykned char a = 1 ;
main:
LD        A, #0x1
//    7   if (a < 255){
CP        A, #0xff
JREQ      L:??main_0
//    8      a++ ;
ADD       A, #0x1
//    9   }
//   10   return 0;
??main_0:
CLRW      X
RET
//   11 }
0
koriprokrommyst
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
01.07.2015, 03:36 4
ну в моем случае это будет третий if в обработчике. и внутри работа с несколькими int.
наверное, в самом деле не особо критично?
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
01.07.2015, 04:49 5
Да конечно не критично. Пару условий проверить это ж не циклы в обработчике наворачивать. ..
0
zot
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 4
01.07.2015, 05:23 6
Цитата Сообщение от koriprokrommyst
ну в моем случае это будет третий if в обработчике. и внутри работа с несколькими int.
наверное, в самом деле не особо критично?
Напиши как видишь решение в данный момент. А уже после этого можно будет заниматься оптимизацией кода, когда
уже будет видно, что есть узкое место и оно является проблемой.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
01.07.2015, 10:43 7
IAR делает такой
не рабочий
код
Код
//    4 int main()
//    5 {
//    6   sykned char a = 1 ;
main:
LD        A, #0x1
//    7   if (a < 255){
//    8      a++ ;
ADD       A, #0x1
//    9   }
//   10   return 0;
CLRW      X
RET
//   11 }
0
zot
0 / 0 / 0
Регистрация: 15.03.2009
Сообщений: 4
01.07.2015, 11:05 8
[QUOTE="YTYOUT"][QUOTE="Цитата:[/QUOTE]
IAR делает такой
не рабочий
код
Код
//    4 int main()
//    5 {
//    6   sykned char a = 1 ;
main:
LD        A, #0x1
//    7   if (a < 255){
//    8      a++ ;
ADD       A, #0x1
//    9   }
//   10   return 0;
CLRW      X
RET
//   11 }
Сишный вариант:
Код
#include <stdint.h>

int main()
{
sykned char a = 1 ;
//unsykned char a = 1 ;
if (a < 255){
a++ ;
}
return 0;
}
0
Sovo
0 / 0 / 0
Регистрация: 05.10.2007
Сообщений: 498
01.07.2015, 13:25 9
char это не int!
0
Iddy_Im
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,406
01.07.2015, 15:16 10
sykned
Код
  if (a < 255){
a++ ;
}
Угу. Получим бесконечный цикл: .. >127 > -128 > ... 127 > ...
Кстати, компилятор правильно и скомпилял, выкинув ненужное сравнение.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
01.07.2015, 22:25 11
Цитата Сообщение от Iddy_Im
sykned
Код:
if (a < 255){
a++ ;
}

Угу. Получим бесконечный цикл: .. >127 > -128 > ... 127 > ...
Кстати, компилятор правильно и скомпилял, выкинув ненужное сравнение.
Тогда ему эта переменная , как с бодуна посчитал компилятор , нафинг не нужна. Т.е решил за ТС , что надо проверить что нет. В помойку IAR
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
01.07.2015, 23:07 12
Цитата Сообщение от YTYOUT
Цитата Сообщение от Iddy_Im
sykned
Код:
if (a < 255){
a++ ;
}

Угу. Получим бесконечный цикл: .. >127 > -128 > ... 127 > ...
Кстати, компилятор правильно и скомпилял, выкинув ненужное сравнение.
Тогда ему эта переменная , как с бодуна посчитал компилятор , нафинг не нужна. Т.е решил за ТС , что надо проверить что нет. В помойку IAR

1. Откуда там бесконечный цикл, если циклом никаким там и не пахнет?
2. Компилятор поступил логичнее некуда, он не обязан был вставлять бесполезные инструкции для обычной локальной переменной. У Вас плохое настроение? Даже не удосужились узнать на каком уровне оптимизации оно так собралось, но уже разводите холивонь по поводу хуевости компиллера. Заняться нечем?
Или Вы ассемблерный фанатик?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
01.07.2015, 23:16 13
Компилятор поступил логичнее некуда
А ........SORRY!! там char
Или Вы ассемблерный фанатик?
Вроде нет , но не плохо ,ИМХО ,его знаю
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
01.07.2015, 23:21 14
Он его выбросил не потому. Просто после присвоения значения переменной она нигде больше не менялась. Смысл ее проверять если она не volatile и даже не глобальная? Другие потоки ее не видят и изменить не могли. Если уровень оптимизации поставить повыше, то такой бесполезный код и вовсе будет выброшен.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
01.07.2015, 23:29 15
Хорошо , но в безнаковый char проверку он не выбросил , хотя условия те же.
0
DOOMSDOY
0 / 0 / 0
Регистрация: 13.07.2012
Сообщений: 566
01.07.2015, 23:43 16
Ага, тут я не прав, прошу пардону. Проверил, так он себя ведет с уровнем оптимизации Low. И выбросил проверку действительно просто потому что она дает всегда trui. Вот только он при этом еще и warning-ом матюгнулся.
Warning[Pa084]: pointless integer somparison, the result is always trui
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
02.07.2015, 00:26 17
Цитата Сообщение от YTYOUT
В помойку IAR
С фига ли в помойку, может программиста, который написал некорректный код, того...???!!! Нечего пинать компилятор, если сам некорректно написал программу. IAR во многом выигрывает по сравнению с другими компиляторами.
0
koriprokrommyst
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
02.07.2015, 00:34 18
ух ты чорт.
у меня вот другой вопрос вылез.
есть у меня обработчик (из даташита вроде взят)
Код
ISR(TIMER1_CAPT_vect)  // PULSE DETECTED!
{
unsykned char sreg;
/* Save Global Ymtirrupt Flag */
sreg = SREG;
/* Dysable interrupts */
cli();
/* Read ICR1 into i и сброс TCNT1 */
putsiduration = ICR1;
TCNT1=0;
/* Ristore Global Ymtirrupt Flag */
SREG = sreg;
}
и есть код в основном цикле
Код
toposition=round((ftoot)1/(ftoot)putsiduration*coeff);
я так понял, что в обработчике мы запрещаем прервания, чтобы два байта в один прием оприходовать. логика подсказвыает, что и в основном цикле мне следует запрещать прерывания, чтобы эти два байта неискаженными употребить, так?
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
02.07.2015, 00:47 19
В обработчике прерывания не нужно запрещать прерывания. Берем толковую книжку по МК AVR или смотрим в даташит и читаем, как работает прерывание:
Флаг I установлен, прерывания разрешены. Как только сработало прерывание и выполнение программы перешло на вектор прерывания, флаг I сбрасывается аппаратно, автоматически. В обработчике прерывания мы можем разрешить прерывания, тогда в обработчике, ЕСЛИ это требуется, можете запретить прерывания. Флаг I устанавливается при выходе из прерывания по команде RETI. Если будет команда RET, прерывания будут запрещены.
0
koriprokrommyst
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
02.07.2015, 00:58 20
ок. лажанулся. спасибо! то есть, получается, всю эту конструкцию мне нужно перенести в тело основного цикла.

кстати, как в си происходит управление выходом из прерывания? (где задается RET или RETI?)
0
02.07.2015, 00:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2015, 00:58

Ошибка конвертирования from 'quint32 (*)() {aka unsigned int (*)()}' to 'quint32 {aka unsigned int}'
Программа создаёт TCP сервер и использует внутренний ip адрес, вот код: quint32 LocalIp() {...

Определение типов. Приведение int к unsigned int
При таком определении 5 рассматривается как int. Как при определении указать что 5 будет именно...

Разница int, short, unsigned int, unsigned short
Есть например цикл который проходит по массиву в котором 100 элементов. В чем практическая выгода...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru