ibiza11 писал(а):Я читаю, что я пишу. Прошу указать мне, в каких сообщениях у меня разыгралось воображение по Вашему мнению.
Разыгралось там, где речь шла об
изменении части данных порта (я ниже напишу, что я под этим понимаю), а именно
сама операция присваивания в общем случае изменяет ВСЕ данные порта! Если даже был лог."0" и записывается лог."0", то он перезаписывается, а не копируется!
Следовательно, по Вашему, сам факт перезаписывания (даже тем же значением) битов в регистре является изменением. Что явно не так. Т.е. воображение отождествило перезапись и изменение.
ibiza11 писал(а): - частный случай. По Вашему код:
будет преобразован в 7 последовательных команд
sbi? Компилятор явно умнее и он сначала прочитает порт, а потом, изменив, запишет обратно.
Начнем с того, что даже частный случай опровергает придуманное Вами правило:
1)если надо изменить часть данных порта в/в и это не просто инверсия бита, то без операции чтения не обойтись.
Поскольку является исключением из него. Я не зря сказал, что при т
акой постановке вопроса чтение не нужно, на что Вы сделали круглые глаза, спросив как же без чтения... Выражайтесь точнее, другими словами.
ibiza11 писал(а): Конечно я не знаю что в каждом порту в любом месте программы! Мало ли что в прерывании могло поменяться.
разве что только при выводе в порт случайных чисел до этого
Приведу пример. По окончанию приема пакета по UART, по таймеру запускается мигание светодиодом (PORTx бит №0), а в это время идет программная передача данных (пусть будет параллельный интерфейс 4 бита) на микросхему внешней памяти висящей на PORTx биты [1:6]. Подрограмма передающая данные на внешнюю память ни сном, ни духом о том в каком состоянии светодиод сейчас находится. По-вашему, она будет изменять это значение, как ей заблагорассудится? А если там не светодиод, а вывод управления двигателем? И такие моменты ...
Мало что понял из этого потока сознания, но скажу, что я могу и сам представить когда может понадобится знать состояние регистра перед записью. Но, повторяю, в большинстве случаев этого не надо. В моих программах я даже не вспомню такие места, где нужно читать перед записью. И не надо внутреннюю кухню, а именно особенности ассемблера (в частности команду ori, не способную работать с регистрами портов) выдавать за логическую необходимость чтения. Не думаю, что человека только начавшего работать с МК на Си, волнует что компилятор там себе считывает регистр иногда.
Про изменение - если стояли на порту где-то нули, где-то единицы, в регистр записали что-либо (командой присваивания), перезаписались все биты, согласен. Но изменились не все (!). Поскольку где писались одинаковые данные изменения нетуууу! Детский сад, чесслово, объяснять такие вещи. Пытаетесь формулировать, так делайте это точно.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...