Например TDA7294

Форум РадиоКот • Просмотр темы - Вопросы по С/С++ (СИ)
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Сб мар 21, 2026 03:35:11

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 7704 ]     ... , , , 143, , , ...  
Автор Сообщение
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн мар 18, 2013 15:02:02 
Мучитель микросхем
Аватар пользователя

Карма: 4
Рейтинг сообщений: 49
Зарегистрирован: Сб авг 25, 2007 22:02:05
Сообщений: 424
Откуда: Германия, Viernheim
Рейтинг сообщения: 0
vitalik_1984 писал(а):
по мне так вот это вообще лишнее


задача была помигать светодиодами, если вы считаете что в данной ситуации несколько тиков процессора важнее универсальности, то

vitalik_1984 писал(а):
просто вспоминается мысль о говнокоде


можете считать меня говнокодером, генерирующим абстрактный код и не имеющим возможности его проверить в работе

ЗЫ. для справки - задачи бывают разные, в одной важен размер кода, в другой скорость, так что делать выводы о том использовать свитч или отдельные функции, можно только ознакомившись с конкретным ТЗ

_________________
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пн мар 18, 2013 23:46:51 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Подскажите, что я делаю не так.....
Пытаюсь сравнить 2 значения в памяти, на второе из них уже указывает указатель, делаю так:
Код:
if (*pIrNecData == *(--pIrNecData))
    {.....} 

Компилятор почемуто начисто вырезает сравнение.....


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 01:35:27 
Мучитель микросхем
Аватар пользователя

Карма: 4
Рейтинг сообщений: 49
Зарегистрирован: Сб авг 25, 2007 22:02:05
Сообщений: 424
Откуда: Германия, Viernheim
Рейтинг сообщения: 0
shads писал(а):
Компилятор почемуто начисто вырезает сравнение.....


это называется оптимизация
зачем их сравнивать, если изначално понятно, что они указывают на одинаковые/разные объекты?

_________________
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 05:38:10 
Друг Кота

Карма: -18
Рейтинг сообщений: 29
Зарегистрирован: Вс дек 05, 2010 06:10:34
Сообщений: 4583
Откуда: ЮВ
Рейтинг сообщения: 0
shads писал(а):
Компилятор почемуто начисто вырезает сравнение.....

Или что-то объявить как volatile... или объявить дополнительную переменную как volatile и часть преобразований вести через неё...

_________________
"Я не даю готовых решений, я заставляю думать!"(С)


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 05:57:34 
Встал на лапы

Карма: -1
Рейтинг сообщений: 4
Зарегистрирован: Пн мар 26, 2012 05:25:06
Сообщений: 106
Рейтинг сообщения: 0
Один нашел в этой строчке "одинаковые/разные объекты". Второй не разбираясь лепит "volatile". Браво!!! :)))


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 06:30:05 
Друг Кота

Карма: -18
Рейтинг сообщений: 29
Зарегистрирован: Вс дек 05, 2010 06:10:34
Сообщений: 4583
Откуда: ЮВ
Рейтинг сообщения: 0
А третий - только б звездануть... :)))
Давай... присоединяйся к своим братьям-говнокодерам... портянкой на два листа одним светодиодом рулить будешь... :)))

_________________
"Я не даю готовых решений, я заставляю думать!"(С)


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 06:48:43 
Встал на лапы

Карма: -1
Рейтинг сообщений: 4
Зарегистрирован: Пн мар 26, 2012 05:25:06
Сообщений: 106
Рейтинг сообщения: 0
Ога, и еще писать переносимый код, хаить CV и восхвалять ассемблер. Вроде ничего не забыл из основных тем форума?!
А по делу, желания нет гадать в чем проблема, смотря на одну строчку кода.


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 08:59:55 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
shads писал(а):
Пытаюсь сравнить 2 значения в памяти, на второе из них уже указывает указатель, делаю так:
приведите листинг. компилятор оптимизирует в целом, а не отдельно строчку. Видимых замечаний по этому коду нет.

_________________
Ставим плюсы: )


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 12:38:22 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Да хоть листинг, хоть строчку..... как я понял компилятор (пользуюсь AVRStudio4) в подобных случаях чего то не понимает..... толи нескольких указателей в сравнении, толи префиксы ++/-- к указателям, толи еще чего.....
Вот простенький пример (свой код не стал показывать, т.к. сложнее разобраться будет)
Код:
#include <avr/io.h>
char massiv [10];

int main (void)
{
    char* pMassiv = massiv;
    for (char i=0; i<10; i++)
        *pMassiv++ = i;

    if (*(--pMassiv) == *(--pMassiv))
        PORTB = 0xff;
    else
        PORTB 
= 0x00;

    while (1){}
}
 

Сравниваем последние 2 элемента массива, и хотя там у нас разные данные, компиль просто (молча) вырезает сравнение, и выполняет действие PORTB = 0xff, как будто у нас положительный результат сравнения.....
Код:
6:        {
+
00000024:   E6E0        LDI       R30,0x60       Load immediate
+00000025:   E0F0        LDI       R31,0x00       Load immediate
+00000026:   E080        LDI       R24,0x00       Load immediate
10
:               *pMassiv++ = i;
+
00000027:   9381        ST        Z+,R24         Store indirect and postincrement
9
:            for (char i=0; i<10; i++)
+
00000028:   5F8F        SUBI      R24,0xFF       Subtract immediate
+00000029:   308A        CPI       R24,0x0A       Compare with immediate
+0000002A:   F7E1        BRNE      PC-0x03        Branch if not equal
13
:               PORTB = 0xff;
+
0000002B:   EF8F        SER       R24            Set Register
+0000002C:   BB88        OUT       0x18,R24       Out to I/O location
+0000002D:   CFFF        RJMP      PC-0x0000      Relative jump
13
:               PORTB = 0xff;
+
0000002E:   94F8        CLI                      Global Interrupt Disable
+0000002F:   CFFF        RJMP      PC-0x0000      Relative jump


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 12:48:58 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
А вот так, работает.....
Но уперто не хочет применять индексный регистр, хотя казалось бы - адрес в нем уже имеется..... так нет же тратит лишний флэш на загрузку обоих байтов командой LDS.....
Код:
#include <avr/io.h>
char massiv [10];

int main (void)
{
    char* pMassiv = massiv;
    for (char i=0; i<10; i++)
        *pMassiv++ = i;

    char temp = *(--pMassiv);
    if (temp == *(--pMassiv))
        PORTB = 0xff;
    else
        PORTB 
= 0x00;

    while (1){}
}
 


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 12:55:41 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
у Вас же другой вопрос был. без двух преддекрементов в одной строчке.

_________________
Ставим плюсы: )


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 13:06:29 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
ibiza11 писал(а):
у Вас же другой вопрос был. без двух преддекрементов в одной строчке.

Это ничего не меняет.....
Код:
#include <avr/io.h>
char massiv [10];

int main (void)
{
    
charpMassiv massiv;
    for (
char i=0i<10i++)
        *
pMassiv++ = i;

    
pMassiv massiv;
    if (*
pMassiv == *(++pMassiv))
        
PORTB 0xff;
    else
        
PORTB 0x00;

    while (
1){}

результат:
Код:
5:        {
+
00000024:   E6E0        LDI       R30,0x60       Load immediate
+00000025:   E0F0        LDI       R31,0x00       Load immediate
+00000026:   E080        LDI       R24,0x00       Load immediate
8
:                *pMassiv++ = i;
+
00000027:   9381        ST        Z+,R24         Store indirect and postincrement
7
:            for (char i=0i<10i++)
+
00000028:   5F8F        SUBI      R24,0xFF       Subtract immediate
+00000029:   308A        CPI       R24,0x0A       Compare with immediate
+0000002A:   F7E1        BRNE      PC-0x03        Branch if not equal
12
:               PORTB 0xff;
+
0000002B:   EF8F        SER       R24            Set Register
+0000002C:   BB88        OUT       0x18,R24       Out to I/O location
+0000002D:   CFFF        RJMP      PC-0x0000      Relative jump


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 13:13:40 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
в общем, поскольку в условии if используется одна переменная (указатель) и в составе условия есть математические операции пред/пост декремента/инкремента, то они выполняются до проверки условия.
т.е в случае
Код:
if (*pIrNecData == *(--pIrNecData))
    {.....} 
сначала происходит преддекремент pIrNecData, а потом уже сравнение двух выражений *(pIrNecData), которые равны.
Аналогично во всех остальных случаях.

_________________
Ставим плюсы: )


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 13:15:44 
Опытный кот
Аватар пользователя

Карма: 8
Рейтинг сообщений: 106
Зарегистрирован: Ср фев 22, 2012 01:25:21
Сообщений: 882
Рейтинг сообщения: 0
Корочь химера был прав
HHIMERA писал(а):
объявить дополнительную переменную как volatile и часть преобразований вести через неё...
Тока можно и без volatile.

ЗЫ Просто у программиста логика - человеческая, а у компа - машинная.....

ЗЫЗЫ В общем вывод: нельзя в сравнении использовать один указатель больше одного раза..... правильный вывод?

ЗЫЗЫЗЫ Интересно, а почему тогда компилятор ни гугу.... хотябы ругнулся на лишний (недостающий) префикс. Ведь с человеческой точки зрения, все должно произойти именно так как я изначально ожидал..... Наверное упущение программеров создавших компилятор.
Надо еще в 6-ке проверить, как себя вести будет такое построение.....


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 13:28:22 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
shads писал(а):
ЗЫЗЫ В общем вывод: нельзя в сравнении использовать один указатель больше одного раза..... правильный вывод?
Неправильный вывод
вот пример, который будет работать:
Код:
if (*pIrNecData == *(pIrNecData-1))
    {.....}  

Цитата:
Надо еще в 6-ке проверить, как себя вести будет такое построение.....
Можете не проверять, я проверял в Keil MDK ARM - компилятор интерпретирует Вашу запись аналогично 4ой студии.

_________________
Ставим плюсы: )


Последний раз редактировалось ibiza11 Вт мар 19, 2013 13:30:08, всего редактировалось 1 раз.

Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 13:28:55 
Грызет канифоль
Аватар пользователя

Зарегистрирован: Вт фев 16, 2010 12:10:38
Сообщений: 268
Откуда: Воронеж, Россия
Рейтинг сообщения: 0
shads писал(а):
Корочь химера был прав
Ага.
Код:
#include <avr/io.h>

char massiv [10];
volatile char *pMassiv = massiv;
int main (void)
{
   for (char i=0; i<10; i++)
   *pMassiv++ = i;
   if (*(--pMassiv) == *(--pMassiv))
   PORTB = 0xff;
   else
   PORTB = 0x00;

while (1){}

Дизассемблер
Код:
{
   for (char i=0; i<10; i++)
00000024  LDI R24,0x00      Load immediate
   *pMassiv++ = i;
00000025  LDS R30,0x0060      Load direct from data space
00000027  LDS R31,0x0061      Load direct from data space
00000029  MOVW R26,R30      Copy register pair
0000002A  ST X+,R24      Store indirect and postincrement
0000002B  STS 0x0061,R27      Store direct to data space
0000002D  STS 0x0060,R26      Store direct to data space
   for (char i=0; i<10; i++)
0000002F  SUBI R24,0xFF      Subtract immediate
00000030  CPI R24,0x0A      Compare with immediate
00000031  BRNE PC-0x0C      Branch if not equal
   if (*(--pMassiv) == *(--pMassiv))
00000032  STS 0x0061,R31      Store direct to data space
00000034  STS 0x0060,R30      Store direct to data space
00000036  LDD R25,Z+0      Load indirect with displacement
00000037  SBIW R30,0x01      Subtract immediate from word
00000038  STS 0x0061,R31      Store direct to data space
0000003A  STS 0x0060,R30      Store direct to data space
0000003C  LDD R24,Z+0      Load indirect with displacement
0000003D  CP R25,R24      Compare
0000003E  BRNE PC+0x04      Branch if not equal
   PORTB = 0xff;
0000003F  SER R24      Set Register
00000040  OUT 0x18,R24      Out to I/O location
00000041  RJMP PC+0x0002      Relative jump
   PORTB = 0x00;
00000042  OUT 0x18,R1      Out to I/O location
00000043  RJMP PC-0x0000      Relative jump


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 13:33:06 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 21
Рейтинг сообщений: 143
Зарегистрирован: Сб фев 21, 2009 13:11:40
Сообщений: 1900
Откуда: Москва
Рейтинг сообщения: 0
:evil: бред! зачем объявлять указатель на массив volatile? он что, у Вас в прерывании меняется?
естественно volatile будет работать в этом случае, поскольку при каждом обращении к указателю будет производиться его преддекремент. Но это равносильно отключению оптимизации этого указателя. Так делать нельзя.

_________________
Ставим плюсы: )


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 13:46:17 
Грызет канифоль
Аватар пользователя

Зарегистрирован: Вт фев 16, 2010 12:10:38
Сообщений: 268
Откуда: Воронеж, Россия
Рейтинг сообщения: 0
ibiza11 писал(а):
бред!
Да нет, оптимизация-сэр! Отработав раз в одном операторе, переменная как правило выбрасывается. Такой вот компилятор.


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 13:49:21 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1443
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4613
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Цитата:
Так делать нельзя.
Ну почему же нельзя. volatile как раз и нужен для того, что бы сказать компилятору, что он "не прав" и не должен оптимизировать мысли программиста.
По поводу инкремента. В строке используется же пред-, а не пост-инкремент. Если бы был постинкремент, то оптимизатор можно было бы понять, т.к. условие будет всегда = true. Вообще не понятно, почему он обрезает эту строку, хотя бы инкремент оставил бы.


Вернуться наверх
 
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Вт мар 19, 2013 14:04:19 
Мудрый кот
Аватар пользователя

Карма: 24
Рейтинг сообщений: 286
Зарегистрирован: Чт июн 10, 2010 08:55:35
Сообщений: 1810
Откуда: Сибирские Афины
Рейтинг сообщения: 0
Аlex писал(а):
По поводу инкремента. В строке используется же пред-, а не пост-инкремент. Если бы был постинкремент, то оптимизатор можно было бы понять, т.к. условие будет всегда = true. Вообще не понятно, почему он обрезает эту строку, хотя бы инкремент оставил бы.
Компилятор это делает потому, что дальше эта переменная нигде не используется. Поставьте вывод её значения в какой-либо порт и компилятор сделает инкремент.

Думаю, что многие будут удивлены результатами этих строк (например для a=5).
x = (++a) + (++a);
x = (a++) + (a++);
Однако всё строго по стандарту.

_________________
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 7704 ]     ... , , , 143, , , ...  

Часовой пояс: UTC + 3 часа


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y