Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18829
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):я так полагаю что надо еще обязательно дописать

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

if (flag==255) flag=0
так ?
зачем?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

мы flag назначили тип uint8_t
а он предполагает максимум 255
не задымится ли мк когда я буду дальше продолжать инкриментирование ? :))
Tell Me The Truth
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18829
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

мда... такого я от вас не ожидал :)

в принципе, если вас что-то смущает, можно поступить иначе:

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

if((flag ^= 1) & 1) x++;
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Не задыится, на самом деле пойдет считать в 9-й бит. который называется флагом переноса и вполне безопасно игнорируется в дальнейшем.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ARV писал(а):мда... такого я от вас не ожидал
ну насчет задымится то я пошутил :wink:
так шо можна под переменную выделить байт и инкриментировать ее до БЕСКОНЕЧНОСТИ не опасаясь за "рассудок" МК ?
Tell Me The Truth
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18829
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

FreshMan писал(а):так шо можна под переменную выделить байт и инкриментировать ее до БЕСКОНЕЧНОСТИ ?
нет, до бесконечности нельзя: ученые считают, что вселенная просуществует еще несколько миллиардов лет, после чего снова "схлопнется"...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20132
Зарегистрирован: Чт сен 01, 2011 12:53:27
Откуда: ТьмуТаракания. Почетный житель подмостовья

Сообщение oleg63m »

ARV писал(а):после чего снова "схлопнется"...
Бляха муха, хорошо что сказал, надо будет микроконтроллеров накупить, ато потом где брать то будем? :shock: :shock: :shock:
Шекспир сказал: Судить меня -дано лишь Богу, другим я укажу дорогу... https://natribu.org/
Я его полностью поддерживаю.
Программирую на Fuse AtmelAVR.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3874
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Хрен знает как это на Си будет выглядеть, но можно так:

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

	COM	flag
	SUB	x,flag ;результат 0 1 1 2 2 3 3..., если flag инициализировать 0, и 0 0 1 1 2 2 3 3..., если флаг инициализировать числом 255
        [далее проверка что x>=6]
Зато всегда за 2 такта выполняется :)
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ARV писал(а):мда... такого я от вас не ожидал :)

в принципе, если вас что-то смущает, можно поступить иначе:

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

if((flag ^= 1) & 1) x++;
так тоже будет правильно ?

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

if(flag ^= 1)  x++;
а есть ли эллегантное решение когда надобно пропустить N переполнений ?
Tell Me The Truth
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18829
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

if(flag ^= 1)  x++;
так будет правильно только в том случае, если flag был проинициализирован значением 0 или 1. если вдруг там было, например, 2, то работать не будет. я обычно переменную с именем flag использую для хранения до 8 независимых флагов - в целях экономии ОЗУ :)

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

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

if(++flag & _BV(3)) x++;
это будет пропускать 8 итераций, а затем 8 раз подряд инкрементировать х... ну и аналогично можно разные варианты подобрать. все это может выродиться и в предложенный вами вариант:

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

#define SKIP_CNT 10

static uint8_t flag = SKIP_CNT;
if(!--flag){
   flag = SКIP_CNT;
   x++;
}
так будет инкремент на каждый SKIP_CNT-ый прогон. для программного счета времени я такое частенько использую
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

ARV писал(а):я обычно переменную с именем flag использую для хранения до 8 независимых флагов - в целях экономии ОЗУ
спасибо за подсказку, я доселе использую для каждого флага по 1 байту :oops:
понял что это в корни не правильно
допустим я обявил переменную flag

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

unsigned char flag;
как каждому биту данной переменной назначить свое имя ?
как, в зависимости от событий в программе, сбрасывать или устанавливать эти флажки ?
Tell Me The Truth
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Логическими операциями. Забиндить такие операции на удобные дефайны и использовать.
А для ассемблера есть такой флаг T - через него удобно ветвится и проверять(BST)/устанавливать(BLD) флаги в регистрах. Для флагов делаешь удобные дефайны которые привязывают номер бита к имени и все. Правда, флаги от разных переменных могут путаться друг с другом поэтому надо следить в оба чтобы имена флагов использовались строго с именами переменных, понятно что для этого надо будет включить в имя флага имя переменной.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

FreshMan писал(а):допустим я обявил переменную flag

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

unsigned char flag;
как каждому биту данной переменной назначить свое имя ?
как, в зависимости от событий в программе, сбрасывать или устанавливать эти флажки ?
Битовые поля Вам в помощь.

Нельзя назначить имя отдельному биту в переменной и работать с ним через это имя. Отдельный бит можно только сбрасывать, устанавливать и проверять на 0/1, логическими операциями, что собственно сказано постом выше.
Можно, конечно, извернуться через структуры, указатели на них, дефайны, ... но оно того не стоит. Применение битовых полей и лог. операций достаточно для большинства задач.
Друг Кота
Аватара пользователя
Сообщения: 26094
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

Аlex писал(а): Нельзя назначить имя отдельному биту в переменной и работать с ним через это имя.
Строго говоря, можно.
Если архитектура допускает прямую адресацию битов.
В ARM Cortex-M это возможно.
И не только возможно, но и единственно возможно. Его система команд вообще не имеет битовых операций.
Несмотря на то, что для доступа к биту в Си для АРМ применяют структуры, вполне можно и без структуры вычислить указатель на бит...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18829
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

КРАМ писал(а):
Аlex писал(а): Нельзя назначить имя отдельному биту в переменной и работать с ним через это имя.
Строго говоря, можно.
Если архитектура допускает прямую адресацию битов.
В ARM Cortex-M это возможно.
новое - хорошо забытое старое. прямая адресация битов была доступна еще в древнем MCS-51 :) жаль, косвенной не было...

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

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

Сообщение FreshMan »

Аlex писал(а):Нельзя назначить имя отдельному биту в переменной и работать с ним через это имя.
а как же это сделали разработчики "пресловутого" CodeVision ?
ведь в оной IDE допустима запись PORTB.5=1;
Tell Me The Truth
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

а как же это сделали разработчики...
PORTB не переменная а I/O register
The bit level access to the I/O registers can be also accomplished by using bit selectors appended after the name of the I/O register.
Because bit level access to I/O registers is done using the CBI, SBI, SBIC and SBIS instructions, the register address must be in the 0 to 1Fh range for sfrb and in the 0 to 1Eh range for sfrw.
на порту F в меге128 не работает:
Note: Bit selector access to I/O registers located in internal RAM above address 5Fh (like PORTF for the ATmega128 for example) will not work, because the CBI, SBI, SBIC and SBIS instructions can't be used for RAM access.
есть в CV хидер iobits.h там макросы для работы с битами:
SETBIT(port,b) - sets bit b of port to logic 1 state, CLRBIT(port,b) - sets bit b of port to logic 0 state и т.д.
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

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

FreshMan писал(а):а как же это сделали разработчики "пресловутого" CodeVision ?
ведь в оной IDE допустима запись PORTB.5=1;
Ну взяли и добавили в свой компилятор фишку, для доступа к отдельным битам регистров порта. Это всё "сладости" компиляторов, и к языку программирования не имеют никакого отношения.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18829
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Аlex писал(а):Ну взяли и добавили в свой компилятор фишку, для доступа к отдельным битам регистров порта. Это всё "сладости" компиляторов, и к языку программирования не имеют никакого отношения.
более того, эта сладость ни каким образом стандарту Си не соответствует!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 26094
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

ARV писал(а):прямая адресация битов была доступна еще в древнем MCS-51 :) жаль, косвенной не было...
Можно поподробнее?
Каким образом может быть прямая адресация и отсутствовать косвенная? Разве шине адреса есть какое то дело до того, кто выставит на ней код?
Ответить

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