Нет там никаких 3х этапов, путаете что-то. И конечно не совсем атомарно, будет всё-равно RMW, при этом M в 2 операции - AND, OR. Но запись будет именно в 1 операцию уже.
я сказал "напрямую", т.е. невозможно заранее предсказать, какой именно код получится от 1, 2 или 3 строчной записи одного и того же действия. например, в случае не-volatile может и 100500 строк превратиться в одну команду
NStorm писал(а):
Нет там никаких 3х этапов, путаете что-то.
не поленился, поднял документы... ошибаетесь вы:
Shuspano писал(а):
Как узнать длину строки в такой конструкции, не считая это вручную:
в конкретно вашем примере, как вам посоветовали, через sizeof. но вообще-то для этого есть в модуле avr/pgmspace.h специальная функция strlen_P, которая вычислит длину любой строки в памяти программ.
ARV, это не о том. Полностью же написано всё. Речь идет о том, что в Status Flags нельзя с помощью инструкций CBI/SBI записать, т.к. они работают только с регистрами с 0х00 по 0х1F. Поэтому чтобы записать в Status Flags будет операция RMW - считается Status в один из этих регистров, затем он меняется с помощью CBI/SBI и записывается назад. Если будете менять регистр с 0x00 по 0x1F - он поменяется напрямую SBI/CBI атомарно и в одну операцию (которая 2 такта Fclk выполняется).
EDIT: Тут выше я уже сам запутался и не так перевел. Действительно, в некоторых старых AVR возможно эти инструкции так криво работали. В новых - неактуально, ниже в комментарии описал.
Последний раз редактировалось NStorm Чт май 14, 2020 18:33:14, всего редактировалось 1 раз.
Добавлено after 4 minutes 41 second: кстати, RMW и атомарность тут тоже не совсем связаны. атомарность - это то, что не может быть прервано по ходу исполнения, так? RMW-операция не может быть прервана, но выолняется в три этапа, что может давать побочные эффекты, если состояние бита меняется от чтения регистра.
Добавлено after 2 minutes 22 seconds: кстати, даже стало любопытно, что будет, если послать в USART байт 0xFF, а в обработчике прерываний сделать CBI UDR, 1 ? хотя, конечно, это не совсем то, о чем мы тут говорим, но зато убедительно докажет RMW или не-RMW команда CBI/SBI
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
как не о том?! написано же: берет все биты и записывает обратно установенные в 1 - чистое RMW
Ну там не совсем так написано. Там написано просто, что некоторые биты очищаются путем записи 1 в них. Поэтому запись в такой флаг 1 на самом деле очищает его. По ссылке более интересно. Надо подробнее почитать, может я ошибаюсь.
Цитата:
кстати, даже стало любопытно, что будет, если послать в USART байт 0xFF, а в обработчике прерываний сделать CBI UDR, 1 ? хотя, конечно, это не совсем то, о чем мы тут говорим, но зато убедительно докажет RMW или не-RMW команда CBI/SBI
Тут не выйдет ) UDR всего лишь буфер. Регистры там внутренние другие RXB, TXB. Поэтому UDR в принципе не поддерживает RMW. Потому что читать вы будете из другого регистра входящего буфера.
Добавлено after 10 minutes 53 seconds: Короче не всё так однозначно. По ссылке же следующий пост сразу где эти фраза из ДШ уже по-другому звучит:
Цитата:
Цитата из ДШ мега48
Some of the Status Flags are cleared by writing a logical one to them. Note that, unlike most other AVRs, the CBI and SBI instructions will only operate on the specified bit, and can therefore be used on registers containing such Status Flags. The CBI and SBI instructions work with registers 0x00 to 0x1F only.
И такое поведение команд CBI и SBI свойственно для всех АВРок, начиная с тини13, то есть, все выпущенные за последние 3 года модели. Неужели некоторые уже 3 года не читали даташитов? А вера здесь не при чём.
I believe that these are actually incorrect. In older AVRs the sbi/cbi opcodes did indeed affect other bits in the register and therefore one had to be careful not to use them in registers that contained interrupt flags. However, as the line I quoted above says, in newer AVRs these opcodes only affect the desired bit. Likely these are just copy-paste errors from older datasheets.
В общем для "новых" (те, что после tiny13 были) AVR не актуально. Для старых тоже надо смотреть, как бы не ошибочная копипаста в ДШ.
В древних AVR да, получается было когда-то CBI/SBI не прямой записью, а атомарным RMW получается по сути. Т.е. они атомарны (не могут прерываться), но при этом RMW. Соб-но и есть ответ на вопрос не связи RMW и атомарности (я кстати нигде это тождественными понятиями не записывал).
WiseLord, ну как обычно, углубились. Интересно на самом деле получается. Я не знал, что где-то оно так работало и вопрос не так просто про CBI/SBI инструкции. ARV правильно написал сначала, признаю, что я сам уже с переводом напутал и действительно скрин из мануала выше имеет отношение к тому, что SBI/CBI на каких-то AVR могут выполняться как RMW. Но на новых AVR это уже не так. Тоже стоит учитывать такие различия.
Тут вот вопрос - актуально ли это для С. Знает ли компилятор на каких "подархитектурах" AVR SBI/CBI работает независимо с битом, а где как RMW.
Добавлено after 5 minutes 17 seconds: Вот вы говорите вбросил. Это разве вбросил? А тем временем GCC 10 теперь вот так умеет. Мопед не мой, пример с офсайта.
Жесть! Я просто думал как нибудь скукожить подпрограммы для индикатора, они непомерно много места занимают, а тиня нерезиновая
ПростоНуб писал(а):
Ну и кодировку учитывайте при кириллице. Если вдруг в utf-8 запишите, будет 13 байт соотв, по 2 байта на символ.
,
Разумеется. Индикатор по ходу только US-ASCII понимает. Ну еще что-то японокитайское, я увидел это, когда накосячил с передачей тетрад. Есть с кириллицей, но он новый.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения