Сейчас у себя убрал volatile, и все стало точно как у вас..... Что это было.....
Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Да ужжжжж.
Сейчас у себя убрал volatile, и все стало точно как у вас..... Что это было.....

Сейчас у себя убрал volatile, и все стало точно как у вас..... Что это было.....
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Я, конечно, в АВРах ни бум-бум, но мне кажется, что для установки одного бита 5 команд это слишком
В АВРах разьве нет команды "установить бит в регистре" ?
PS: Что за команда STS ?
MCC18:
Просто установка младшего бита, и всё 
В АВРах разьве нет команды "установить бит в регистре" ?
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:
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
не путайте сдвиг четырехбайтного числа и изменение одного бита.
изменение одного бита как раз происходит одной командой.
Сохранение числа еще четырьмя.все логично.
Тем более, если неизвестно в каком месте программы может быть изменена переменная.С помощью ручной оптимизации конечно можно уменьшить размер, но ведь нельзя быть уверенным, что это будет всегда правильно работать.
что такое STS на картинке написано- прямое сохранение в оперативную память.
изменение одного бита как раз происходит одной командой.
Код: Выделить всё
ori r24,0x01Сохранение числа еще четырьмя.все логично.
Тем более, если неизвестно в каком месте программы может быть изменена переменная.С помощью ручной оптимизации конечно можно уменьшить размер, но ведь нельзя быть уверенным, что это будет всегда правильно работать.
что такое STS на картинке написано- прямое сохранение в оперативную память.
В поисках истины человек развивается.
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Но всё равно там в цитате кода pic18 есть и сдвиг, и установка младшего бита. Поскольку у pic всё делается непосредственно над (банкированным) полем памяти, тут код вышел компактнее.
Нет только проверки на HI >= LO, это добавит еще несколько команд, но код будет все равно короче, чем для AVR (где LDS/STS вообще двухсловные).
По времени выполнения нужно смотреть, команд меньше, но они не однотактовые. Хотя и у AVR команды LDS/STS двухтактовые.
Нет только проверки на HI >= LO, это добавит еще несколько команд, но код будет все равно короче, чем для AVR (где LDS/STS вообще двухсловные).
По времени выполнения нужно смотреть, команд меньше, но они не однотактовые. Хотя и у AVR команды LDS/STS двухтактовые.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
vitalik_1984, Вы меня не поняли.
Я не путаю сдвиг с установкой бита, в моем коде представлены обе операции. Я речь вёл про сдвиг.
В коде, приведённом shads, я вижу, что переменная сначала куда-то пересылается, потом в этом "где-то" делается с ней всё что нужно, а затем пересылается обратно. Это же через .опу
В очередной раз убеждаюсь в том, что АВРы не предмет экономии скорости и памяти...
Я не путаю сдвиг с установкой бита, в моем коде представлены обе операции. Я речь вёл про сдвиг.
В коде, приведённом shads, я вижу, что переменная сначала куда-то пересылается, потом в этом "где-то" делается с ней всё что нужно, а затем пересылается обратно. Это же через .опу
В очередной раз убеждаюсь в том, что АВРы не предмет экономии скорости и памяти...
Re: Вопросы по С/С++ (СИ)
Ну во первых никто здесь и не говорил что AVR лучше, а PIC хуже (или наоборот). Все дело в том что и у тех и у других, есть свои преимущества и свои недостатки. Также у них сильно отличается архитектура, поэтому их даже сравнивать сложно.
У AVR всего 32 регистра в которых можно выполнять вычисления, поэтому если инфы много, ее нужно хранить в ОЗУ. При этом на пересытку из ОЗУ в рабочие регистры, конечно тратится время. Но зато оперативная память линейна, что на асме просто благословение.....
У PIC все регистры могут производить вычисления, т.е. не надо никуда пересылать данные, но при этом есть матня с переключением страниц памяти, что на асме просто кашмарный сон (я это знаю т.к. долго программировал на асме ZILOG, а там тоже страничная организация памяти)
Конечно это все не волнует если программируеш на С. Тем более если взять в общем, то я думаю что увеличение кода за счет пересылок у AVR примерно равно увеличению кода при манипуляциях с переключением банок у PIC. Так что по размеру кода мне каж-ся они одинаковы.
А вот если взять скорость выполнения кода, то тут помоему AVR бесспорно впереди т.к. у AVR большинство команд выполняются за 1 такт, а у PIC вроде за 4.....
У AVR всего 32 регистра в которых можно выполнять вычисления, поэтому если инфы много, ее нужно хранить в ОЗУ. При этом на пересытку из ОЗУ в рабочие регистры, конечно тратится время. Но зато оперативная память линейна, что на асме просто благословение.....
У PIC все регистры могут производить вычисления, т.е. не надо никуда пересылать данные, но при этом есть матня с переключением страниц памяти, что на асме просто кашмарный сон (я это знаю т.к. долго программировал на асме ZILOG, а там тоже страничная организация памяти)
Конечно это все не волнует если программируеш на С. Тем более если взять в общем, то я думаю что увеличение кода за счет пересылок у AVR примерно равно увеличению кода при манипуляциях с переключением банок у PIC. Так что по размеру кода мне каж-ся они одинаковы.
А вот если взять скорость выполнения кода, то тут помоему AVR бесспорно впереди т.к. у AVR большинство команд выполняются за 1 такт, а у PIC вроде за 4.....
Re: Вопросы по С/С++ (СИ)
Еще вопросик, чтобы не расслаблялись.....
Решил теперь перевести на С и передающий контроллер.
Надо последовательно выдать в линию 32 бита глобальной переменной unsigned long TransmitData, делаю так
А он мне сволочь тока младшие 16 бит выдает, а старшие куда то ныкает.
Пробовал конкретно адресовать (не переменной а константой) старшие 16 бит, компиль ошибку выдает. Он что тока short может обрабатывать операцией <<.
Решил теперь перевести на С и передающий контроллер.
Надо последовательно выдать в линию 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: Вопросы по С/С++ (СИ)
В PIC18 есть множитель тактовой частоты на 4, так что 1 маш. цикл = такту генератора. И все команды проходят за 1 М/Ц, кроме переходов.а у PIC вроде за 4.....
По этому, я бы ещё поспорил на счёт скорости выполнения. Но не буду, т.к. это будет вечный спор и не по теме
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Еще вопросик, чтобы не расслаблялись.....
Попробуйте так
Код: Выделить всё
void Transmit (void)
{
TransmitData=0x00ff00ff;
for (unsigned char i=0; i<32; i++)
{
if (TransmitData & (0x80000000)) // Или &(1<<31)
TransmitBit1();
else
TransmitBit0();
TransmitData <<=1;
}
}
Re: Вопросы по С/С++ (СИ)
так вроде проглатывает.....Аlex писал(а):& 0x80000000
а так пишет "warning: left shift count >= width of type" хотя тип long как я понимаю состоит из 32 бит.....Аlex писал(а):& (1<<31)
И кстати на сдвиг в диапазоне 0-15 нормально проходит, а в диапазоне 16-31 выдает вот такое.....
Re: Вопросы по С/С++ (СИ)
Вместо вот этой строчки
if (TransmitData & (1<<(31-i)))
вот так
if (TransmitData & (1UL<<(31-i)))
Видать у вашего компилятора целый тип по умолчанию - 16-битный. Что, в общем то, не удивительно.
Надо принудительно объявить константу как unsigned long.
if (TransmitData & (1<<(31-i)))
вот так
if (TransmitData & (1UL<<(31-i)))
Видать у вашего компилятора целый тип по умолчанию - 16-битный. Что, в общем то, не удивительно.
Надо принудительно объявить константу как unsigned long.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Re: Вопросы по С/С++ (СИ)
Ой да шоп я без вас делал..... умные вы мои.....Kavka писал(а):if (TransmitData & (1UL<<(31-i)))
Опять пошла вода по трубам (блин ну и замудреный этот С.....)
- avreal
- Опытный кот
- Сообщения: 842
- Зарегистрирован: Чт дек 31, 2009 19:27:45
- Откуда: Бровари, Україна
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Так а причём тут множитель? Кому-то можно xасовой кварц поставить и PLL-кой разогнать до 100МГц, так что, сравним быстродействие с pic18 при часовом кварце?Аlex писал(а):В PIC18 есть множитель тактовой частоты на 4, так что 1 маш. цикл = такту генератора. И все команды проходят за 1 М/Ц, кроме переходов.
По этому, я бы ещё поспорил на счёт скорости выполнения. Но не буду, т.к. это будет вечный спор и не по теме
Сравнивать надо, например, на максимальных тактовых для каждого, и неважно, откуда эта тактовая получена (и на сколько её тактов растягивается команда) -- напрямую или с умножителя. Главное, что это абсолютнный максимум.
Или при равных потреблениях. Или еще как-то, зависимо от задачи (и описав задачу).
А при равном кварце -- неинформативно.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
А причём тут часовой кварц ? Тот, кто ставит его, всяко не задумывается о быстродействии. Какой может быть разговор о производительности при использовании часового кварца, о чём Вы говорите ?
Давайте уж, если сравнивать, то на максимальных частотах.
Я разгонял ПИК (26K22) до 100 Мгц, причём без всяких усилий, и работал он во всём его диапазоне питания.
25 MIPS на выполнение команд и тактирование таймеров на 100 МГц.
С учётом того, что АВРы работают с переменными через ... караганду, то ПИКи всяко выинрывают по скорости, даже без всяких множителей. А уж и с ними - и говорить нечего...
Я беру МК из разряда дешёвых, <=80 р.
PS: Спор этот бесконечен, не стоит начинать его тут. Хотите поговорить об этом - создавайте соответствующую тему или пишите в ЛС - поговорим
Давайте уж, если сравнивать, то на максимальных частотах.
Я разгонял ПИК (26K22) до 100 Мгц, причём без всяких усилий, и работал он во всём его диапазоне питания.
25 MIPS на выполнение команд и тактирование таймеров на 100 МГц.
С учётом того, что АВРы работают с переменными через ... караганду, то ПИКи всяко выинрывают по скорости, даже без всяких множителей. А уж и с ними - и говорить нечего...
Я беру МК из разряда дешёвых, <=80 р.
PS: Спор этот бесконечен, не стоит начинать его тут. Хотите поговорить об этом - создавайте соответствующую тему или пишите в ЛС - поговорим
Re: Вопросы по С/С++ (СИ)
Подскажите плз кто как с битовыми флагами работает?
Я пока вот как то так сообразил (я так в ассемблере делаю).
В принципе устраивает. Если флагов больше чем 8, то следующий регистр будет называться Flags2, и все биты в нем начинаются с b2...... Так что не запутаешся какой бит в каком регистре хранится. Если работаеш с битом в первом регистре, то Flags1 / b1....., если со вторым то Flags2 / b2..... и т.д.
А на С как правильно с битовыми полями работать? Возможно ли не привязываться к отдельным байтам, а работать чисто с именами битов?
Я пока вот как то так сообразил (я так в ассемблере делаю).
Код: Выделить всё
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: Вопросы по С/С++ (СИ)
Например, в соответствии с ISO/IEC 9899:1999:shads писал(а):А на С как правильно с битовыми полями работать? Возможно ли не привязываться к отдельным байтам, а работать чисто с именами битов?
EXAMPLE 3 The following obscure constructionsdeclare 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.)Код: Выделить всё
typedef signed int t;
typedef int plain;
struct tag {
unsigned t:4;
const t:5;
plain r:5;
};
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
J. Ganssle
- леня
- Это не хвост, это антенна
- Сообщения: 1399
- Зарегистрирован: Пн сен 13, 2010 17:34:06
- Откуда: калуга
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
как нажатием на кнопку к переменной единичку прибавить ?
ВРУБАЙ !!!
И будь что будет !!!
И будь что будет !!!
Re: Вопросы по С/С++ (СИ)
Может так.....
Код: Выделить всё
If (key_press()) var++;- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
леня писал(а):
как нажатием на кнопку к переменной единичку прибавить ?
леня писал(а):
не в микроконтроллере
Я темой ошибся или как?
Вроде подфорум: микроконтроллеры и ПЛИСС
тема :Вопросы по си.
Откуда нам известно где вам единичку добавить нужно?Вам ответили согласно теме.Поясните или задайте вопрос в соответствующей вопросу теме.
В поисках истины человек развивается.