Перейти к содержанию

Alex

Moderators
  • Постов

    5 333
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Alex стал победителем дня 3 декабря 2017

Alex имел наиболее популярный контент!

Информация о Alex

  • День рождения 01.01.1981

Контакты

  • ICQ
    461500721

Информация

  • Пол
    Мужчина
  • Интересы
    Микроконтроллеры, программирование.
  • Город
    Планета Земля

Электроника

  • Стаж в электронике
    10-20 лет
  • Сфера радиоэлектроники
    Микроконтроллеры
  • Оборудование
    Нет у меня ничего, я нищий...

Посетители профиля

202 050 просмотров профиля

Достижения Alex

Наставник

Наставник (12/14)

  • 10 постов на форуме
  • Пост-машина Редкий
  • 10 лет  на форуме
  • Преданный
  • Неделя на форуме

Последние значки

643

Репутация

  1. Да. Сравнение идёт в несколько этапов, побайтово. По этому, как значение становится 768 (это 0x0300), и сравнивается старший байт, мы получаем истинное условие. Это в двух словах. Более детально - нужно смотреть дизасм и разбираться. volatile не обязывает компилятор делать атомарную операцию. Её может реализовать только программист, учитывая конкретную ситуацию и всякие там нюансы железа. volatile говорит компилятору только лишь одно - пожалуйста, не трогай эту переменную (не вырезай из программы её существование и обработку), т.к. я сам слежу за ней. Оптимизатор, просматривая часть кода, не находя связей с какой-то переменной, может её обработку вырезать к чертям собачим. И будет прав. По этому, при доступе к переменной из разных потоков, нужно оптимизатору связать руки, сказав, что ты сам - хозяин существования этой переменной. А как сказать это ? - правильно, добавить квалификтор volatile.
  2. Это было в адрес слов о глючности компилятора ) Как правильно сделать - Вам уже написали. Попытайтесь понять, отчего возникают проблемы. Почитайте про атомарный доступ к переменным.
  3. Главное - понять, почему он работает, а предыдущий - нет. Это важно !
  4. @Demonrostov , пишите такой код : di(); // Запретить прерывания uint16_t u16_temp = timer_16; ei(); // Разрешить прерывания if(u16_temp > 1000) { Удивляетесь, что он работает. Пытаетесь понять почему. Понимаете. Радуетесь. Жесть ) И Вы ещё что-то плохое хотите сказать о разработчиках компилятора ? Это - не рабочий варик, а костыль. Который, как уже сказали выше, так-же будет глючить, но реже.
  5. Такое ощущение, что да ) Вам выше уже намекнули про прерывания и атомарность. Копайте в этом направлении. Надеюсь, Вы в состоянии догадаться сравнить 2 числа (1010 и 768) в hex-представлении понять в чём проблема ? )
  6. Да. Это означает, что полностью отключена оптимизация. Но не означает, что компилятор делает эту операцию атомарной. RMW, по определению, не может быть атомарной Реализация атомрности - забота программиста, а не компилятора. Только программист адекватно может оценить ситуацию. В любой нормальной ОС, например, имеются инструменты (средства синхронизации) для атомарного доступа к объектам.
  7. Зачем мне пробовать элементарное действие ? Ни один компилятор не позволит себе заглючить в такой простой конструкции. Что, кстати, не скажешь о Протезе. Подозреваю, Вы понимаете о чём выше шла речь, но упорно продолжаете тут нас троллить, показывая на скринах какую-то ересть. Небольшая поправочка - программист должен это делать, а не компилятор
  8. Вам, как бы, намекнули, что по Вашему скрину невозможно понять, в какой момент выполнения программы Вы смотрите на это значение. Думается, что Вы и сами не знаете этот момент. ПыСы: Мало вероятно, что компилятор глючит на таком элементарном выражении. Скорее, глюк где-то в алгоритме, заложенном программистом.
  9. Прямая ссылка - https://ww1.microchip.com/downloads/en/DeviceDoc/MPLABX-v5.10-windows-installer.exe
  10. На сколько я помню, нужно использовать секцию UDATA. Погуглите "MPASM".
  11. По Протеусу есть отдельная тема , задавайте по нему вопросы там.
  12. А Вы почитайте правила, тогда ответите сами на свой вопрос. И что значит ботоводство по-вашему ?
×
×
  • Создать...