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

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

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

Сообщение FreshMan »

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

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

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

Сообщение ARV »

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

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

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

Сообщение oleg63m »

ARV писал(а):после чего снова "схлопнется"...

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

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

Сообщение 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 такта выполняется :)
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
FreshMan
Друг Кота
Сообщения: 6296
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Откуда: Ukraine

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

Сообщение FreshMan »

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

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

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

if((flag ^= 1) & 1) x++;

так тоже будет правильно ?

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

if(flag ^= 1)  x++;

а есть ли эллегантное решение когда надобно пропустить N переполнений ?
Tell Me The Truth
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение 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-ый прогон. для программного счета времени я такое частенько использую
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

Сообщение FreshMan »

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

спасибо за подсказку, я доселе использую для каждого флага по 1 байту :oops:
понял что это в корни не правильно
допустим я обявил переменную flag

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

unsigned char flag;

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

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

Сообщение Alexeyslav »

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

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

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

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

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

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

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

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

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

Аlex писал(а):Нельзя назначить имя отдельному биту в переменной и работать с ним через это имя.

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

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

Сообщение ARV »

КРАМ писал(а):
Аlex писал(а):Нельзя назначить имя отдельному биту в переменной и работать с ним через это имя.

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

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

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

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

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

Сообщение FreshMan »

Аlex писал(а):Нельзя назначить имя отдельному биту в переменной и работать с ним через это имя.

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

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

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

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

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

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

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

Сообщение ARV »

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

более того, эта сладость ни каким образом стандарту Си не соответствует!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

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

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

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

Можно поподробнее?
Каким образом может быть прямая адресация и отсутствовать косвенная? Разве шине адреса есть какое то дело до того, кто выставит на ней код?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

для поподробнее вам бы к докам обратиться... в MCS-51 часть ячеек ОЗУ имеладвойную адресацию - для обращения к байту и к каждлму из битов. для этих двух видов использовались разные команды. к ОЗУ можно было обратиться косвенно, к битам - нет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Просто лысый решил поумничать... Не у всех Cortex есть bit banding... в М0 он отсутствует...
================
На мелких проектах и при нынешнем обилии ОЗУ... в битах вообще особого смысла нет...
Для любителей извращений можно посоветовать заюзать неиспользуемые регистры...
Таким макаром МЭЛТ когда-то в своих платах защиту делал... играл на разнице в регистрах МК51 Themic и Philips...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25151
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

Посмотрел.
Это не вполне непосредственная битовая адресация. Скорее это ОТОБРАЖЕНИЕ битовых команд на общее адресное поле.
Все битовые команды сначала попадают в битовый сопроцессор, который расширяет адресное поле для битов.
Фактически это ничем не отличается от битовых команд в архитектурах Атмела и Микрочипа. Там если рассмотреть структуру кода команды, то в ней условно разделены зоны опкода и адреса бита. Но на самом деле выборка происходит побайтно и дешифратор команд преобразует этот адрес бита в МАСКУ.
В этом смысле в 16-разрядном Микрочипе есть и "косвенная адресация" бит через команду BSW. Но собственно к адресации бит она никакого отношения не имеет.
Впрочем, я не вполне пока разобрался с архитектурой адресации бит в АРМ-Кортекс, вполне возможно, что и там это по сути псевдоадрес....
HHIMERA писал(а):Просто лысый решил поумничать... Не у всех Cortex есть bit banding... в М0 он отсутствует...
================
На мелких проектах и при нынешнем обилии ОЗУ... в битах вообще особого смысла нет...

Ну уж куда мне до Ххимеры... :wink:
Правда некоторые математические операции требуют побитовой обработки ОДНОГО слова, но это так... к слову... :wink:
И размер ОЗУ тут вообще ни к селу, ни к городу...
Если в кодах Хемминга требуется перестановка бит в ПОТОКЕ данных, то отсутствие адресации бит ЗАМЕДЛЯЕТ обработку...
Да и Бог с ним, с Хэммингом... Обработка графических полей для монохромных LCD превращается в громоздкий индусский код...

ЗЫ. К вопросу об универсальности копеечных М0. При отсутствии битовых команд и битового расширения адресов любая битовая команда превращается в НАБОР команд. Тогда и заявленная производительность - фикция...
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

КРАМ писал(а):Правда некоторые математические операции требуют побитовой обработки ОДНОГО слова, но это так... к слову... :wink:

Разве что к слову... пустому...
В М0 битовые операции повеселее... чем в том же АВР...
И размер ОЗУ тут вообще ни к селу, ни к городу...

Та да... 256 байт вполне хватит... :facepalm:
Если в кодах Хемминга требуется перестановка бит в ПОТОКЕ данных, то отсутствие адресации бит ЗАМЕДЛЯЕТ обработку...
Да и Бог с ним, с Хэммингом... Обработка графических полей для монохромных LCD превращается в громоздкий индусский код...

От незнания к вере???
Для монохромных дисплеев скорости М0 уж по любому хватает... там видео не требуется...
К вопросу об универсальности копеечных М0. При отсутствии битовых команд и битового расширения адресов любая битовая команда превращается в НАБОР команд. Тогда и заявленная производительность - фикция...

Фикция - это не разобравшись в архитектуре пытаться давать умные советы...
М0 это заменитель восьмибиток... и надо сказать - хороший заменитель... Всё остальное от незнания или непонимания... т.е. пустой трёп...
"Я не даю готовых решений, я заставляю думать!"(С)
Ответить

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