Да пофигу что использовал ТС... RMW ещё никто не отменял... и дело здесь не в стандарте СИ...ARV писал(а):если бы топикстартер не использовал нестандартные трюки компилятора, на битовые операции он не нарвался бы никогда? ну, во всяком случае, при соответствии его компилятора стандарту Си...
Программный I2C
Re: Программный I2C
"Я не даю готовых решений, я заставляю думать!"(С)
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18560
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программный I2C
объясняю: если эта переменная volatile, компилятор ОБЯЗАН считывать ее значение всякий раз, когда встречает ее в тексте программы. два ваших ЭКВИВАЛЕНТНЫХ выражения заставят ОБЯЗАТЕЛЬНО считать эту переменную - куда же, спрашивается, компилятор может считать переменную, если не во временную (регистровую) переменную, создаваемую им по ходу работы?! и это будет так НЕЗАВИСИМО от включенного или отключенного оптимизатора - ТАК НАДО ПО СТАНДАРТУ.Аlex писал(а):Объясните мне тогда (а лучше ткните носом где это написано) то, что строку a=a|(1<<7); , c отключеной оптимизацией для переменной "a", компилятор должен создать ещё одну переменную. Не вижу никакой логической связи этой строки с использованием дополнительной памяти. И это с учётом того, что для компилятора эта строка абсолютно эквивалентна строке a |= (1<<7);
если переменная не-volatile, оптимизатор компилятора ИМЕЕТ ПРАВО использовать В ОБОИХ случаях команду битовой модификации переменной (если она регистровая или существует такая команда в ядре) вместо явно описанной последовательности СЧИТЫВАНИЕ-МОДИФИКАЦИЯ-ЗАПИСЬ, т.е. обойтись без промежуточного считывания переменной.
что тут не понятного?
Последний раз редактировалось ARV Пт апр 25, 2014 23:35:53, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18560
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программный I2C
у вас в подписи хорошо сказано - воспользуйтесь этим для себяHHIMERA писал(а):RMW ещё никто не отменял... и дело здесь не в стандарте СИ...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Программный I2C
У ТС'а как бы не совсем проблема, связанная с ЧМЗ. Всё дело в структуре портов.ARV писал(а):повторяю: модификация отдельного бита в регистре/порте делается, как вы говорите, - я в курсе. но делается это ассемблерными командами, например, SBI или SBR.
однако пока не вижу, каким боком это соотносится с моим высказыванием о том, что если бы топикстартер не использовал нестандартные трюки компилятора, на битовые операции он не нарвался бы никогда? ну, во всяком случае, при соответствии его компилятора стандарту Си...
Я не зря ему задал вопрос :
, прикрепив его ссылкой.А как Вы думаете, после перенаправления бита порта, что будет находится в защёлке ?
Дело в том, что ТС оперирует только направлением порта, а это - не есть гуд.
Когда у него вывод на I2C насроен на вход, и он дёргает какой либо ногой этого же порта, у него в защёлку записывается реальное значение, приложенное на вывод (а там пуллап
Вот и всё....
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Программный I2C
Почему он обязан её прочитать ? Отключить оптимизацию - да, согласен. Выполнил с ней какие-то действия, и всё... Но читать то почему он обязан, для чего ? В каком это стандарте описано ?ARV писал(а):если эта переменная volatile, компилятор ОБЯЗАН считывать ее значение всякий раз, когда встречает ее в тексте программы
- Реклама
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18560
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программный I2C
я так понимаю, что все это происходит как раз именно из-за того, что ТС использует манипуляции отдельными битами порта, используя "расширения" компилятора. если бы он пользовал только стандартные операции для языка Си, он на это "защелкивание" не напоролся бы - так? ведь не смотря на схожесть принципов работы портов в PIC и AVR, я лично никогда на подобные проблемы не нарывался, хотя ногодрыгание и ввод-вывод на одном порту смешивал постоянно... или я чего-то в архитектуре PIC-ов не допонял?Аlex писал(а):Вот и всё....
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Программный I2C
Это для вас, а не для меня... Никогда не видели как code reordering бред этажерочкой выкладывает??? GCC... кстати... И плевать компилятору, что все регистры SPI с атрибутом volatile...ARV писал(а):в подписи хорошо сказано
Так что... сразу GCC запишем в "как не соответствующий стандарту СИ"... или сойдёмся на истине, что высокий уровень оптимизации может содержать определённые риски???
"Я не даю готовых решений, я заставляю думать!"(С)
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Программный I2C
Не совсем. Это происходит из-за того, что во время дрыганья другими лапками порта, данные в защёлке меняются. О чём ТС не задумывается, наивно полагая, что одной записи, в начале программы, в защёлку достаточно.ARV писал(а):я так понимаю, что все это происходит как раз именно из-за того, что ТС использует манипуляции отдельными битами порта, используя "расширения" компилятора. если бы он пользовал только стандартные операции для языка Си, он на это "защелкивание" не напоролся бы - так?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18560
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программный I2C
да потому что она - volatile! то есть ее содержимое может измениться в любой точке исполнения программы!!!Аlex писал(а):Почему он обязан её прочитать ?
Код: Выделить всё
volatile int vol;
int var;
vol = 5;
var = vol; // будет СЧИТАНО значение vol, а не занесено 5 напрямую - даже если это более оптимально!!!
vol = vol; // будет считано vol и снова туда же записано!!!!
var = var; // может быть выброшено компилятором
vol; // будет просто считано vol и потеряно
var; // компилятор варнингнет и может ничего тут не сделать!!!если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Программный I2C
Не понятно почему тебе не понятно .ARV писал(а): если переменная не-volatile, оптимизатор компилятора ИМЕЕТ ПРАВО использовать В ОБОИХ случаях команду битовой модификации переменной (если она регистровая или существует такая команда в ядре) вместо явно описанной последовательности СЧИТЫВАНИЕ-МОДИФИКАЦИЯ-ЗАПИСЬ, т.е. обойтись без промежуточного считывания переменной.
что тут не понятного?
Попробую объяснить на "пальцах" , для случая именно с пЫк Mid Range .
Речь не о том во что преобразует компилятор пЫк инструкции типа PORTA|=1;
Дело в том что сама команда ассемблера BSF PORTA,1 будет произведена именно в такой последовательности :
Чтение всего порта , модификация бита с порядковым номером 1 , и записью всего результата обратно ...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18560
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программный I2C
оно порой и вам не помешало быHHIMERA писал(а):Это для вас, а не для меня...
я видел некоторые закидоны GCC, но описанного вами не виделHHIMERA писал(а):Никогда не видели как code reordering бред этажерочкой выкладывает???
Последний раз редактировалось ARV Сб апр 26, 2014 00:06:29, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Программный I2C
А чего там не понимать??? Излишняя нагрузка или ёмкость на пине может искажать работу с портом из-за конечного быстродействия и нагрузочной способности... Выводится через защёлку, а читается то всегда реальный уровень на пине... который при быстрых манипуляциях может не соответствовать ожидаемому...ARV писал(а):или я чего-то в архитектуре PIC-ов не допонял?
"Я не даю готовых решений, я заставляю думать!"(С)
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18560
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программный I2C
даже не знаю, поможет ли... но рискну:dosikus писал(а):Дело в том что сама команда ассемблера BSF PORTA,1 будет произведена именно в такой последовательности :
Чтение всего порта , модификация бита с порядковым номером 1 , и записью всего результата обратно ...
Я В КУРСЕ ЭТОГО!!!
словить баг из-за RMW-инструкции можно только в том случае, если в коде будет команда BSF - если ее не будет, а будет какая-то команда типа OUT PORTА, W (я пиковского ассемблера не знаю - пишу наугад) - никакого RMW не будет и не будет связанных с ним глюков!!! об этом и писал urry - что если заменить команды с RMW-доступом на последовательность команд без RMW, все будет хорошо...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Программный I2C
Сам охренел когда увидел... Благо окно дизасма висит на постой...ARV писал(а):описанного вами не видел![]()
"Я не даю готовых решений, я заставляю думать!"(С)
Re: Программный I2C
А вот нет таких команд, окромя NOP , в случае ТС .ARV писал(а):что если заменить команды с RMW-доступом на последовательность команд без RMW, все будет хорошо...
А по предыдущим твоим постам совсем не понятно что ты в курсе, один volatile мелькал ...
Последний раз редактировалось dosikus Сб апр 26, 2014 00:09:27, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18560
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программный I2C
мда... чукча не читатель - чукча писатель...dosikus писал(а):А вот нет таких команд, окроме NOP , в случае ТС .Про что здесь тебе и долбили .
я в первом своем посте обратил внимание на то, что ТС использует нестандартные фичи компилятора, которые заставляют генерировать "оптимальный код" с BSF... позже я высказал предположение, что если бы он использовал исключительно стандартные возможности, этого не произошло бы... или в PIC-ах нет команды вывода байта в порт целиком?!
P.S. пожалуй, я начинаю понимать, из-за чего возникло недопонимание... я привык к архитектуре AVR, где порты для считывания состояния на пинах и защелки для вывода на пины разделены... а у PIC-ов, похоже, как и у классических MCS51, запись-чтение осуществляется через один и тот же порт, но только запись идет в защелку, а чтение - с пинов... тогда, пожалуй, даже вывод целиком байта в порт, как я предлагал, может порой давать сбои... ну, что я PIC-и не знаю - я и не скрывал
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Программный I2C
ARV , не расстраивайся .
Во первых не много потерял, во вторых в пЫк появились LATCH . Правда уже давно .
А в третьих в задницу и пЫк и AVR , STM рулит ...
Во первых не много потерял, во вторых в пЫк появились LATCH . Правда уже давно .
А в третьих в задницу и пЫк и AVR , STM рулит ...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18560
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Программный I2C
уже пошел явный оффтоп... но я и не расстраиваюсь: еще в далекие времена первых пиков (12-ых еще, что ли...) я пытался их освоить... но когда прочитал, что узнать о том, что таймер переполнился, можно только путем переодической проверки содержимого его регистра-счетчика, я был настолько глубоко поражен этим архитектурным изыском, что раз и навсегда поклялся пики в руки не брать 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Программный I2C
В довольно таки старых где прерываний и не было вовсе. Но согласись на фоне фузов AVR, это мелочи .ARV писал(а): узнать о том, что таймер переполнился, можно только путем переодической проверки содержимого его регистра-счетчика,
Я о том давнем времени , когда начинали .
Re: Программный I2C
Нда, "вот и встретились три одиночества". Досик, привет!!! Уж не наезжай так на фузы АВР, да и на самого ARV попутно. Не так они страшны, эти фузы. Один раз невовремя "убитый" камень - и ... память на всю оставшуюся жисТь. Да и лечится это в АВР-ках. Лечилки теперь вплоть до автономных клеют.dosikus писал(а):Но согласись на фоне фузов AVR, это мелочи . Для каждого свои страшилки.


