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

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

Сообщение shads »

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

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

Сообщение А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:
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

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

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

  ori r24,0x01

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

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

Сообщение avreal »

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

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

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

Сообщение shads »

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

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

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

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

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

Сообщение 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 может обрабатывать операцией <<.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

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

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

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

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

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

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

Сообщение shads »

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

Сообщение Kavka »

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

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

вот так

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

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

Сообщение shads »

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

Сообщение avreal »

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

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

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

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

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

Сообщение 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..... и т.д.

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

Сообщение 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
Откуда: калуга

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

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

Сообщение shads »

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

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

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

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

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

Сообщение vitalik_1984 »

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

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

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