-
- Дожил до "#define SET_CH1 { asm("SBI 0x18, 0x05"); }. UPD: оказалось что причина в банальной ошибке: вместо PORTB &= ~(1<<PB5); указал без инверсии &= (1<<PB5), что было тупо скопировано с PORTB |= (1<<PB5); De_User(187 знак., 16.07.2019 09:49 - 22:32)
- PORTB очевидно в дефайнах прописан как volatile. Может есть intrinsic функция или макрос? - misyachniy(16.07.2019 15:00)
- Как это он может читать PINB, если операция производится с PORTB? Компилятор не способен к таким вольностям. В ассемблерный код загляните - неужели такое может быть? Можно ли этот кусок кода сюда выложить? - Ксения(16.07.2019 11:16)
- Спасибо! - ошибся. Читает PORTB. Но от этого не легче. Компилятор дважды использовал способ "чтение - модификация - запись" и один раз SBI. De_User(1432 знак., 16.07.2019 11:33 - 11:45)
- компилятор правильно генерит код: 3m(239 знак., 16.07.2019 13:14)
- По логике биты должны были меняться строго поочерёдно, максимум два одновременно (и то по недосмотру). Если компилятор решил эту пару так объединить (при полностью отключенных оптимизациях), то нехороший человек его писал :( - De_User(16.07.2019 13:29)
- Там есть "юридическая тонкость". Регистр PORTB должен быть прочитан и записан. Происходит ли это в рамках инструкции SBI - вопрос интерпретации. Но если ни одно животное в результате не страдает, то и спорить не о чем. - SciFi(16.07.2019 13:24)
- компилятор правильно генерит код: 3m(239 знак., 16.07.2019 13:14)
- Спасибо! - ошибся. Читает PORTB. Но от этого не легче. Компилятор дважды использовал способ "чтение - модификация - запись" и один раз SBI. De_User(1432 знак., 16.07.2019 11:33 - 11:45)
- Мне интересно кто ни будь с седьмой студии на MPLAB перелез? С "Атмеловскими" ARM-ами там она сильно не дружит в плане генерирования встроенного HAL, а 7 они забросили не развивают... хоть на СТМ переходи полностью. - PeterD(16.07.2019 11:32)
- При оптимизации по размеру I2C тоже должен работать. А если код работает в зависимости от метода оптимизации, то он плохо написан. Скорее всего, volatile где-то пропущено. Лично у меня оптимизация по размеру - любимый вариант. - Ксения(15.07.2019 20:17)
- Можно скопировать какую-нибудь строку исходника, и поискать её в листинге. Для разных уровней оптимизации. Когда-то давно, таким образом я изучал повадки компилятора. )) - vpv.vpv(16.07.2019 09:11)
- Спасибо! Было бы время... - De_User(16.07.2019 09:43)
- Повадки компилятора - это, конечно, познавательно, но гораздо полезнее мануалы. Однако, в природе встречаются ымбеддеры, считающие, что мануалы придумал трус, и познающие свойства языка цэ эмпирическим путём :-) - SciFi(16.07.2019 09:48, ссылка)
- Не надо эмпирический путь. Достаточно прочитать и понять книжку равноапостольных Ритчи и Кернигана. :)) - vpv.vpv(16.07.2019 14:00)
- Любой мануал должен начинаться с фразы: "Ну что, уже сломал?" :) - LightElf(16.07.2019 12:28)
- Ох и сильный же я электронщик :) - De_User(16.07.2019 13:08)
- Повадки компилятора - это, конечно, познавательно, но гораздо полезнее мануалы. Однако, в природе встречаются ымбеддеры, считающие, что мануалы придумал трус, и познающие свойства языка цэ эмпирическим путём :-) - SciFi(16.07.2019 09:48, ссылка)
- Спасибо! Было бы время... - De_User(16.07.2019 09:43)
- тю --> - SciFi(15.07.2019 21:25, ссылка)
- говнокод lite :) - VLLV(16.07.2019 09:40)
- Можно скопировать какую-нибудь строку исходника, и поискать её в листинге. Для разных уровней оптимизации. Когда-то давно, таким образом я изучал повадки компилятора. )) - vpv.vpv(16.07.2019 09:11)
- Ой, да ладно. Менять версию компилятора и надеяться, что говнокод, рассчитанный по тактам, не сломается, - это трэш и угар. - SciFi(15.07.2019 19:56)
- Дожил до "#define SET_CH1 { asm("SBI 0x18, 0x05"); }. UPD: оказалось что причина в банальной ошибке: вместо PORTB &= ~(1<<PB5); указал без инверсии &= (1<<PB5), что было тупо скопировано с PORTB |= (1<<PB5); De_User(187 знак., 16.07.2019 09:49 - 22:32)