Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Да ужжжжж.
Сейчас у себя убрал volatile, и все стало точно как у вас..... Что это было.....

Изображение
txt.png
(17.81 КБ) 771 скачивание
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Я, конечно, в АВРах ни бум-бум, но мне кажется, что для установки одного бита 5 команд это слишком :roll:
В АВРах разьве нет команды "установить бит в регистре" ?

PS: Что за команда STS ?

MCC18:

Код: Выделить всё

ReceiveData <<=1;
ReceiveData |=1;

Код: Выделить всё

72:                ReceiveData <<=1;
  009E    010F     MOVLB 0xf
  00A0    90D8     BCF 0xfd8, 0, ACCESS
  00A2    370A     RLCF 0xa, F, BANKED
  00A4    370B     RLCF 0xb, F, BANKED
  00A6    370C     RLCF 0xc, F, BANKED
  00A8    370D     RLCF 0xd, F, BANKED
73:                ReceiveData |=1;
  00AA    010F     MOVLB 0xf
  00AC    810A     BSF 0xa, 0, BANKED
74:
Просто установка младшего бита, и всё :roll:
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

не путайте сдвиг четырехбайтного числа и изменение одного бита.
изменение одного бита как раз происходит одной командой.

Код: Выделить всё

  ori r24,0x01

Сохранение числа еще четырьмя.все логично.
Тем более, если неизвестно в каком месте программы может быть изменена переменная.С помощью ручной оптимизации конечно можно уменьшить размер, но ведь нельзя быть уверенным, что это будет всегда правильно работать.

что такое STS на картинке написано- прямое сохранение в оперативную память.
В поисках истины человек развивается.
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Но всё равно там в цитате кода pic18 есть и сдвиг, и установка младшего бита. Поскольку у pic всё делается непосредственно над (банкированным) полем памяти, тут код вышел компактнее.
Нет только проверки на HI >= LO, это добавит еще несколько команд, но код будет все равно короче, чем для AVR (где LDS/STS вообще двухсловные).
По времени выполнения нужно смотреть, команд меньше, но они не однотактовые. Хотя и у AVR команды LDS/STS двухтактовые.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

vitalik_1984, Вы меня не поняли.
Я не путаю сдвиг с установкой бита, в моем коде представлены обе операции. Я речь вёл про сдвиг.
В коде, приведённом shads, я вижу, что переменная сначала куда-то пересылается, потом в этом "где-то" делается с ней всё что нужно, а затем пересылается обратно. Это же через .опу :roll:
В очередной раз убеждаюсь в том, что АВРы не предмет экономии скорости и памяти...
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Ну во первых никто здесь и не говорил что AVR лучше, а PIC хуже (или наоборот). Все дело в том что и у тех и у других, есть свои преимущества и свои недостатки. Также у них сильно отличается архитектура, поэтому их даже сравнивать сложно.

У AVR всего 32 регистра в которых можно выполнять вычисления, поэтому если инфы много, ее нужно хранить в ОЗУ. При этом на пересытку из ОЗУ в рабочие регистры, конечно тратится время. Но зато оперативная память линейна, что на асме просто благословение.....

У PIC все регистры могут производить вычисления, т.е. не надо никуда пересылать данные, но при этом есть матня с переключением страниц памяти, что на асме просто кашмарный сон (я это знаю т.к. долго программировал на асме ZILOG, а там тоже страничная организация памяти)

Конечно это все не волнует если программируеш на С. Тем более если взять в общем, то я думаю что увеличение кода за счет пересылок у AVR примерно равно увеличению кода при манипуляциях с переключением банок у PIC. Так что по размеру кода мне каж-ся они одинаковы.

А вот если взять скорость выполнения кода, то тут помоему AVR бесспорно впереди т.к. у AVR большинство команд выполняются за 1 такт, а у PIC вроде за 4.....
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Еще вопросик, чтобы не расслаблялись.....

Решил теперь перевести на С и передающий контроллер.
Надо последовательно выдать в линию 32 бита глобальной переменной unsigned long TransmitData, делаю так

Код: Выделить всё

//передача серии 32 бита
void Transmit (void)
{
   TransmitData=0x00ff00ff;
   for (unsigned char i=0; i<32; i++)
   {
      if (TransmitData & (1<<(31-i)))
         TransmitBit1();
      else
         TransmitBit0();
   }
}

А он мне сволочь тока младшие 16 бит выдает, а старшие куда то ныкает.
Пробовал конкретно адресовать (не переменной а константой) старшие 16 бит, компиль ошибку выдает. Он что тока short может обрабатывать операцией <<.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

а у PIC вроде за 4.....
В PIC18 есть множитель тактовой частоты на 4, так что 1 маш. цикл = такту генератора. И все команды проходят за 1 М/Ц, кроме переходов.
По этому, я бы ещё поспорил на счёт скорости выполнения. Но не буду, т.к. это будет вечный спор и не по теме :)
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

Еще вопросик, чтобы не расслаблялись.....

Попробуйте так

Код: Выделить всё

void Transmit (void)
{
   TransmitData=0x00ff00ff;
   for (unsigned char i=0; i<32; i++)
   {
      if (TransmitData & (0x80000000))    // Или  &(1<<31)
         TransmitBit1();
      else
         TransmitBit0();

      TransmitData <<=1;
   }
}
Должно быть по оптимальнее, чем двигать единицу на значение переменной.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Аlex писал(а):& 0x80000000
так вроде проглатывает.....

Аlex писал(а):& (1<<31)
а так пишет "warning: left shift count >= width of type" хотя тип long как я понимаю состоит из 32 бит.....
И кстати на сдвиг в диапазоне 0-15 нормально проходит, а в диапазоне 16-31 выдает вот такое.....
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Re: Вопросы по С/С++ (СИ)

Сообщение Kavka »

Вместо вот этой строчки

if (TransmitData & (1<<(31-i)))

вот так

if (TransmitData & (1UL<<(31-i)))

Видать у вашего компилятора целый тип по умолчанию - 16-битный. Что, в общем то, не удивительно.
Надо принудительно объявить константу как unsigned long.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Kavka писал(а):if (TransmitData & (1UL<<(31-i)))
Ой да шоп я без вас делал..... умные вы мои.....
Опять пошла вода по трубам (блин ну и замудреный этот С.....)
Аватара пользователя
avreal
Опытный кот
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение avreal »

Аlex писал(а):В PIC18 есть множитель тактовой частоты на 4, так что 1 маш. цикл = такту генератора. И все команды проходят за 1 М/Ц, кроме переходов.
По этому, я бы ещё поспорил на счёт скорости выполнения. Но не буду, т.к. это будет вечный спор и не по теме :)
Так а причём тут множитель? Кому-то можно xасовой кварц поставить и PLL-кой разогнать до 100МГц, так что, сравним быстродействие с pic18 при часовом кварце?
Сравнивать надо, например, на максимальных тактовых для каждого, и неважно, откуда эта тактовая получена (и на сколько её тактов растягивается команда) -- напрямую или с умножителя. Главное, что это абсолютнный максимум.
Или при равных потреблениях. Или еще как-то, зависимо от задачи (и описав задачу).

А при равном кварце -- неинформативно.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

А причём тут часовой кварц ? Тот, кто ставит его, всяко не задумывается о быстродействии. Какой может быть разговор о производительности при использовании часового кварца, о чём Вы говорите ?
Давайте уж, если сравнивать, то на максимальных частотах.
Я разгонял ПИК (26K22) до 100 Мгц, причём без всяких усилий, и работал он во всём его диапазоне питания.
25 MIPS на выполнение команд и тактирование таймеров на 100 МГц.
С учётом того, что АВРы работают с переменными через ... караганду, то ПИКи всяко выинрывают по скорости, даже без всяких множителей. А уж и с ними - и говорить нечего...
Я беру МК из разряда дешёвых, <=80 р.

PS: Спор этот бесконечен, не стоит начинать его тут. Хотите поговорить об этом - создавайте соответствующую тему или пишите в ЛС - поговорим :)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Подскажите плз кто как с битовыми флагами работает?
Я пока вот как то так сообразил (я так в ассемблере делаю).

Код: Выделить всё

unsigned char Flags1=0;               //регистр флагов
   #define b1BtnLock (1<<0)         /*бит защелки опроса кнопки*/
   #define b1BtnShrt (1<<1)         /*бит короткого нажатия кнопки*/
   #define b1BtnLong (1<<2)         /*бит длинного нажатия кнопки*/

if (Flags1 & b1BtnLock)            //проверка бита защелки

Flags1 |= b1BtnLock;            //установка бита защелки

Flags1 &= (~b1BtnLock)            //сброс бита защелки

В принципе устраивает. Если флагов больше чем 8, то следующий регистр будет называться Flags2, и все биты в нем начинаются с b2...... Так что не запутаешся какой бит в каком регистре хранится. Если работаеш с битом в первом регистре, то Flags1 / b1....., если со вторым то Flags2 / b2..... и т.д.

А на С как правильно с битовыми полями работать? Возможно ли не привязываться к отдельным байтам, а работать чисто с именами битов?
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Goldsmith »

shads писал(а):А на С как правильно с битовыми полями работать? Возможно ли не привязываться к отдельным байтам, а работать чисто с именами битов?
Например, в соответствии с ISO/IEC 9899:1999:

EXAMPLE 3 The following obscure constructions

Код: Выделить всё

typedef signed int t;
typedef int plain;
struct tag {
  unsigned t:4;
  const t:5;
  plain r:5;
};
declare a typedef name t with type signed int, a typedef name plain with type int, and a structure with three bit-field members, one named t that contains values in the range [0, 15], an unnamed const-qualified bit-field which (if it could be accessed) would contain values in either the range [−15, +15] or [−16, +15], and one named r that contains values in one of the ranges [0, 31], [−15, +15], or [−16, +15]. (The choice of range is implementation-defined.)
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Аватара пользователя
леня
Это не хвост, это антенна
Сообщения: 1399
Зарегистрирован: Пн сен 13, 2010 17:34:06
Откуда: калуга
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение леня »

как нажатием на кнопку к переменной единичку прибавить ?
ВРУБАЙ !!!
И будь что будет !!!
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Может так.....

Код: Выделить всё

If (key_press()) var++;
Аватара пользователя
леня
Это не хвост, это антенна
Сообщения: 1399
Зарегистрирован: Пн сен 13, 2010 17:34:06
Откуда: калуга
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение леня »

не в микроконтроллере
ВРУБАЙ !!!
И будь что будет !!!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

леня писал(а):
как нажатием на кнопку к переменной единичку прибавить ?

леня писал(а):
не в микроконтроллере

Я темой ошибся или как?
Вроде подфорум: микроконтроллеры и ПЛИСС
тема :Вопросы по си.
Откуда нам известно где вам единичку добавить нужно?Вам ответили согласно теме.Поясните или задайте вопрос в соответствующей вопросу теме.
В поисках истины человек развивается.
Ответить

Вернуться в «Разные вопросы по МК»