Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2020-мар-31 08:42

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 92 сообщения ]  На страницу « 1 2 3 4 5 6 7 »
Автор Сообщение
СообщениеДобавлено: 2019-окт-11 10:50 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 732
Откуда: г. Санкт-Петербург
Vasiliy писал(а):
...
2 - использовать SPL, где автор уже сделал все правильно....
По моему мнению это весьма спорное утверждение.


Вернуться к началу
СообщениеДобавлено: 2019-окт-11 11:35 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 472
Организация: Milandr
Откуда: ПКК "Миландр"
vasili писал(а):
Vasiliy писал(а):
...
2 - использовать SPL, где автор уже сделал все правильно....
По моему мнению это весьма спорное утверждение.
На текущий момент все присланные нам ошибки исправлены. Ждем новых замечаний.

Из анонсов, совместно со startmilndr пишется библиотека которая под едиными API накроет все наши микроконтроллеры. ...

UPD: Перенес сюда: viewtopic.php?f=22&t=4096


Вернуться к началу
СообщениеДобавлено: 2019-окт-11 17:53 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
У битового поля есть 3 характеристики:
Длина - количество бит в поле
Позиция - равна позиции нулевого (самого младшего) бита поля внутри регистра.
Значение.

Так вот, 0 - это позиция битового поля, а 5 - значение.
Если заглянуть в .h файл описания микроконтроллера, то там есть именованные константы для всех битовых полей всех регистров периферии. Для каждого поля определены его позиция и маска. Их стоит использовать вместо магических чисел:
reg = (~MSK & reg) | (NEW_VAL << POS);
MSK - маска битового поля
POS - позиция битового поля в регистре
NEW_VAL - новое значение битового поля.


Вернуться к началу
СообщениеДобавлено: 2019-окт-11 18:23 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
Vasiliy писал(а):
По поводу маскирования бит в регистре или прямого выставления, то тут есть разница в быстродействии. OE |= mask всегда подразумевает предварительно вычитывание регистра ядром, а это "ядро - AHB шина - APB шина - регистр в периферии". Прямая запись готового значения пройдет быстрее. С маской часто требуется стирание REG = REG & ~maskCLR | maskOR. Но маскирование более универсальный метод, меньше шансов ошибиться.
Не сказали главного. При прямом выставлении всегда переопределяется значение ВСЕХ битовых полей в регистре. Т.е. вы безвозвратно портите значения не интересующих вас в данный момент бит. При маскировании вы меняете только нужные биты. Все прочие биты при этом не изменяются (не портятся).
Пример: надо задать значение 5 битовому полю из 3 бит в 1 позиции регистра reg:
// Так правильно
reg = (~0x0E & reg) | (5 << 1);
// А так неправильно
reg = 5<<1;
// И так неправильно
reg |= 5<<1;
// Так тоже неправильно
reg |= (1<<3)|(0<<2)|(1<<1);


Вернуться к началу
СообщениеДобавлено: 2019-окт-11 20:16 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 732
Откуда: г. Санкт-Петербург
Vasiliy писал(а):
vasili писал(а):
Vasiliy писал(а):
...
2 - использовать SPL, где автор уже сделал все правильно....
По моему мнению это весьма спорное утверждение.
На текущий момент все присланные нам ошибки исправлены. Ждем новых замечаний.

Из анонсов, совместно со startmilndr пишется библиотека которая под едиными API накроет все наши микроконтроллеры. ...

UPD: Перенес сюда: viewtopic.php?f=22&t=4096
Фрагмент файла MDR_Timer.h
//=====================   Управление прерываниями   ==================
__STATIC_INLINE void     MDR_Timer_ClearEvent(MDR_TIMER_Type *TIMERx, uint32_t eventFlags) {TIMERx->STATUS &= ~eventFlags;}
Во время выполнения "чтение модификация запись" возможна потеря нового события. Д.б. TIMERx->STATUS = ~eventFlags;
Об этой ошибке писал на форумe еще в 12 г.
viewtopic.php?f=34&t=537&p=3100&hilit=status#p3087
Но воз и ныне там.


Вернуться к началу
СообщениеДобавлено: 2019-окт-12 10:53 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Professor Chaos писал(а):
Vasiliy писал(а):
Не сказали главного. При прямом выставлении всегда переопределяется значение ВСЕХ битовых полей в регистре. Т.е. вы безвозвратно портите значения не интересующих вас в данный момент бит. При маскировании вы меняете только нужные биты. Все прочие биты при этом не изменяются (не портятся).
Пример: надо задать значение 5 битовому полю из 3 бит в 1 позиции регистра reg:
// Так правильно
reg = (~0x0E & reg) | (5 << 1);....
Из сказанного я понял, что при попытке изменения нужных мне бит в регистре я должен озаботиться тем, чтобы остальные биты (не используемые мной) сохранились неизменными. Правда для меня эта мысль пока не очень убедительна. Для чего мне заботится о том, то мне не нужно? И еще. Что означает сей символ - (~0x0E & reg)? Вернее мне понятно, что это т.н. маска остальных бит регистра но как это видно?


Вернуться к началу
СообщениеДобавлено: 2019-окт-12 13:46 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
vladh писал(а):
Из сказанного я понял, что при попытке изменения нужных мне бит в регистре я должен озаботиться тем, чтобы остальные биты (не используемые мной) сохранились неизменными. Правда для меня эта мысль пока не очень убедительна. Для чего мне заботится о том, то мне не нужно?
Верно поняли. Надо это, чтобы не сломать то, что уже было настроено ранее и работало.
Иначе после вашей настройки что-то внезапно перестанет работать. Главный принцип - не навреди.
Вот вам аналогия.
Надо накрыть стол в ресторане: расставить посуду, разложить столовые приборы. Шеф рисует общую схему расстановки всех предметов. А затем из неё делает три раздельных: схему расстановки тарелок, расстановки стаконов и раскладки столовых приборов. Далее он зовёт трёх официантов и ставит задачу первому: расставить на столе тарелки по схеме расстановки тарелок. Тот берёт тарелки и расставляет их строго по схеме. Второму шеф ставит задачу расставить стаканы по схеме расстановки стаканов. Тот приходит со стаканами, убирает всё со стола и расставляет стаканы на чистом столе - строго по схеме. Третьему шеф говорит разложить столовые приборы - ложки, вилки, ножи. И выдаёт схему их размещения. Тот приходит к столу, сметает с него всё, что там уже наставлено и раскладывает на пустом столе столовые приборы. Все строго по схеме. Приходит шеф в надежде увидеть полностью накрытый стол. А видит на пустом столе разложенные столовые приборы. Ни тарелок, ни стаканов. Кто виноват? Каждый из официантов выполнил свою задачу в соответствии с выданной ему схемой. Вот только по ходу её выполнения каждый из них аннулировал результат труда предыдущего, считая, что всё, что не касается его текущей задачи является ненужным и подлежащим ликвидации - ведь на его схеме ничего этого не было.

0х0Е - это маска битового поля длиной 3 бита, расположенного в позиции 1 регистра (0х0Е = 00001110b). Действие
reg &= ~0x0E;
зануляет все биты этого битового поля, "расчищая" место под новое значение, записываемое операцией побитового ИЛИ.
Если этого не сделать, то нельзя будет гарантировать, что битовое поля примет требуемое значение. Результат будет зависеть от его предыдущего значения, т.к. операция побитового ИЛИ не может изменить значения "1" на "0". Если до этого бит был равен "1", а его новое значение "0", то после наложения по ИЛИ результат будет "1". А требуется "0".
Откройте .h файл описания периферии микроконтроллера и увидите там описания таких масок для всех битовых полей регистров периферии.
В Си это обычно делается через макроопределения (директивой препроцессора #define). В С++ лучше использовать квалификатор constexpr - он специально для этого создан.


Вернуться к началу
СообщениеДобавлено: 2019-окт-13 10:44 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Уважаемый Professor Chaos, а разве такая запись reg |= (1<<3)|(0<<2)|(1<<1) не означает, то, что надо установить 1, 2 и 3 биты регистра, а остальные не трогать. В моих натуральных экспериментах с отладочной платой так и происходило. Простите, вник в предыдущий Ваш пост и понял, что не означает. Точнее не всегда означает.


Вернуться к началу
СообщениеДобавлено: 2019-окт-13 11:02 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
vladh писал(а):
Простите, вник в предыдущий Ваш пост и понял, что не означает. Точнее не всегда означает.
Рад, что к вам пришло понимание этого.


Вернуться к началу
СообщениеДобавлено: 2019-окт-13 11:09 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Но тогда не лучше ли такая запись: reg = 0х0А? Т.е. прямое изменение требуемых первых четырех бит регистра.


Вернуться к началу
СообщениеДобавлено: 2019-окт-13 12:20 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
vladh писал(а):
Но тогда не лучше ли такая запись: reg = 0х0А? Т.е. прямое изменение требуемых первых четырех бит регистра.
От вас требовалось установить новое значение битового поля, не более того. Вы это сделали. Только попутно испортили значения всех остальных битовых полей в этом регистре. Вы их занулили. Этого от вас никто не просил. Их надо было оставить неизменными. Там были прописаны какие-то настройки, разрешения, флаги и признаки событий и т.п. Вы же своей прямой записью в регистр их безвозвратно уничтожили, приравняли к нулю.
Почитайте ещё раз мой пример про официантов, накрывающих стол в ресторане. Вы поступили прямо как они. Каждый видит только свою часть работы и считает её единственной, разрушая всё, что сделали на столе другие официанты до него.

Ещё одна метафора, может быть так будет понятнее.
Если вам сказали надеть шапку - что вы сделаете?
Просто наденете шапку и всё?
Или сначала разденетесь догола и наденете шапку? Подразумевает ли надевание шапки снятие с себя всей прочей одежды? Судя по вашим действиям над регистром, вы это именно так понимаете.


Вернуться к началу
СообщениеДобавлено: 2019-окт-13 12:43 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Вы меня не поняли, да и я не правильно сформулировал свой пример. Поскольку мы до этого говорили только о 4 битах регистра, я и привел пример для четырех бит. Но вообще имел ввиду весь регистр. Т.е. в этом примере надо помнить состояние остальных бит регистра и записывать новое состояние с учетом предыдущего. Т.е. пусть состояние регистра было reg = 0хСССССССС после моих изменений я должен буду записать reg = 0xCCCCCCCA. Правда в этом случае я должен буду постоянно контролировать все биты регистра. В Вашем случае можно не контролировать. Кстати, Ваш пример с рестораном не корректен. При такой расстановке тарелок reg = (1<<3 | (0<<2) | (1<<1); совсем не требуется убирать со стола все, то там уже стояло. Может быть придется предмет, который занимает место, на котором по схеме должна стоять тарелка.


Вернуться к началу
СообщениеДобавлено: 2019-окт-13 16:57 
Не в сети

Зарегистрирован: 2018-янв-05 23:41
Сообщения: 154
Организация: ФГУП "РФЯЦ-ВНИИЭФ"
Давайте подробно сформулируем задачу: в регистре reg требуется установить битовому полю новое значение.
Характеристики битового поля:
- длина 3 бита,
- позиция в регистре 1,
- новое значение 5.
Требования к решению:
1. Новое значение битового поля должно установиться в любом случае, независимо от текущего состояния бит в регистре.
2. Нельзя изменять значения бит регистра вне указанного битового поля. Они не должны измениться.

Проверяйте все ваши варианты решения на выполнение этих двух требований.
То, что вы назвали "должен контролировать все биты регистра" - следствие требования 2. Без этого его не выполнить. Без предварительного чтения регистра вы не сможете вернуть им (битам регистра вне требуемого битового поля) прежнее состояние. Вы их перезапишите нулями.


Вернуться к началу
СообщениеДобавлено: 2019-окт-14 08:05 
Не в сети

Зарегистрирован: 2017-авг-09 12:38
Сообщения: 147
Организация: НПФ "Авангард"
Professor Chaos писал(а):
То, что вы назвали "должен контролировать все биты регистра" - следствие требования 2. Без этого его не выполнить. Без предварительного чтения регистра вы не сможете вернуть им (битам регистра вне требуемого битового поля) прежнее состояние. Вы их перезапишите нулями.
Не всегда надо предварительно знать предыдущее состояние. Вот пример, который я проверил с регистром функций порта В в режиме инициализации регистров порта:
PORTB->FUNC = 0x1111111111;
PORTB->FUNC = (PORTB->FUNC) | (0x5);
В результате получил reg == 0x11111115. Но задача должна быть более общей. Как изменить несколько бит необязательно расположенных последовательно, при этом не изменяя других бит.
И еще во время этих экспериментов у меня не получалось так просто изменять регистр RXTX. После подключения тактового генератора к регистру его значение становилось 0х0000FFFF. В следующих строках я пытался изменить его значение, но ничего не происходило. Почему? Кстати попробовал с другими регистрами этого порта. Все можно менять.


Вернуться к началу
СообщениеДобавлено: 2019-окт-14 09:21 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 472
Организация: Milandr
Откуда: ПКК "Миландр"
vasili писал(а):
Фрагмент файла MDR_Timer.h
//=====================   Управление прерываниями   ==================
__STATIC_INLINE void     MDR_Timer_ClearEvent(MDR_TIMER_Type *TIMERx, uint32_t eventFlags) {TIMERx->STATUS &= ~eventFlags;}
Во время выполнения "чтение модификация запись" возможна потеря нового события. Д.б. TIMERx->STATUS = ~eventFlags;
Об этой ошибке писал на форумe еще в 12 г.
viewtopic.php?f=34&t=537&p=3100&hilit=status#p3087
Но воз и ныне там.
Действительно, спасибо, исправил. Текущая версия - https://github.com/StartMilandr/Pack_VEx
Vasiliy писал(а):
На текущий момент все присланные нам ошибки исправлены. Ждем новых замечаний.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 92 сообщения ]  На страницу « 1 2 3 4 5 6 7 »

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 3 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB