Разумнее было бы, то что вы написали обзывать програмно-аппаратной реализацией, к тому же она ближе к аппаратной, будьте вдумчевее, не пытайтесь поймать меня "за язык" :)
Программно-аппаратная реализация - это когда нужно что-то спаять, а потом что-то запрограммировать. Я же паять не предлагал, правда?
Не правда. Аппаратная реализаци - функция реализуемая автоматически аппаратным комплексом. Прерывания по таймингам - аппаратная функция. Поскольку действие происходит благодаря устройствам жесткой логики встроеным в микропроцессор :) Можно да же схему увидеть в даташите, правда логическую. Понятие програмной или аппаратной реализации применимо к различным уровням устройств и может иметь различное значение на различных уровнях. Есть простое уточнение, все что реализованно не програмно - реализованно аппаратно :)
Но вам нужно отдать должное, вы конечно были правы приведя ,как пример, такой способ реализации последовательного интерфейса. И естественно там будет буфер. Все очнь относительно везде есть программные действия, но они разной нагрузки на процессорное время. Одно можно сказать точно, буфер нужен там где программист сеансово теряет полный контроль над действиями процессора, а этого не должно быть в програмной части устройства.
Увеличение задержки в 52 строке делали ? Ну скажем секунд до двух ?
Там это не помогает, я как раз на этом этапе объяснять взялся. Короче пока закомменчено, переменная а принимает всякий мусор и есс-но массив не заполняется. А если снять комментарий, то заполнение идет корректно. Компилятор - ?
Переменная а явно проинициализирована . Все равно мусор ? А если объявить ее как static ?
Там получалось следующее:
Пишем int a,b,c; Получаем незаполненый массив, мониторил "а" - она показывала что-то вроде 2337.
Если добавляем a=0; то дальше все корректно. Оттуда родился Лебедев с локальными переменными.
А вот почему корректно работает если раскомментировать строки вывода в монитор? Предполагаю, что в этом случае вмешивается компилятор и уже сам инициализирует а с 0 значением?
А вот почему корректно работает если раскомментировать строки вывода в монитор? Предполагаю, что в этом случае вмешивается компилятор и уже сам инициализирует а с 0 значением?
Говорю же я, дружным хором, вместе со всеми Лебедевыми, и вообще с любой книжкой "С для чайников" - не инициализируются, по умолчанию, локальные переменные в C/C++.
И никуда компилятор не вмешивается, и переменная a остаётся не инициализированной, т.е. с каким-то случайным значением. Просто, при каких-то условиях, это случайное значение может случайно оказаться нулевым. И тогда программа начинает работать, вроде-бы... но как-то не всегда. Получаем самые неприятные, трудноотлавливаемые ошибки. Оно нам надо? :)
Компилятор С, изначально, был заточен под получение очень эффективного кода. При правильном использовании он, вообще, мало уступает ассемблерному.
Для инициализации локальных переменных понадобилось бы несколько лишних процессорых команд при каждом входе в функцию, в цикл, и т.п. На такую жертву разработчики высокоэффективного языка никогда бы не пошли.
С глобальными переменными, или со статическими локальными, ситуация совсем другая. Они инициализируются только один раз, перед стартом программы, и с этим вполне можно смириться.
А вот почему корректно работает если раскомментировать строки вывода в монитор? Предполагаю, что в этом случае вмешивается компилятор и уже сам инициализирует а с 0 значением?
Говорю же я, дружным хором, вместе со всеми Лебедевыми, и вообще с любой книжкой "С для чайников" - не инициализируются, по умолчанию, локальные переменные в C/C++.
И никуда компилятор не вмешивается, и переменная a остаётся не инициализированной, т.е. с каким-то случайным значением. Просто, при каких-то условиях, это случайное значение может случайно оказаться нулевым. И тогда программа начинает работать, вроде-бы... но как-то не всегда. Получаем самые неприятные, трудноотлавливаемые ошибки. Оно нам надо? :)
Компилятор С, изначально, был заточен под получение очень эффективного кода. При правильном использовании он, вообще, мало уступает ассемблерному.
Для инициализации локальных переменных понадобилось бы несколько лишних процессорых команд при каждом входе в функцию, в цикл, и т.п. На такую жертву разработчики высокоэффективного языка никогда бы не пошли.
С глобальными переменными, или со статическими локальными, ситуация совсем другая. Они инициализируются только один раз, перед стартом программы, и с этим вполне можно смириться.
Так я на эту тему и не спорю, просто стало интересно почему такая фича получается. Для себя давно поставил, либо глобальная, либо инициализация.
Программно-аппаратная реализация - это когда нужно что-то спаять, а потом что-то запрограммировать. Я же паять не предлагал, правда?
Не правда. Аппаратная реализаци - функция реализуемая автоматически аппаратным комплексом. Прерывания по таймингам - аппаратная функция. Поскольку действие происходит благодаря устройствам жесткой логики встроеным в микропроцессор :) Можно да же схему увидеть в даташите, правда логическую. Понятие програмной или аппаратной реализации применимо к различным уровням устройств и может иметь различное значение на различных уровнях. Есть простое уточнение, все что реализованно не програмно - реализованно аппаратно :)
Но вам нужно отдать должное, вы конечно были правы приведя ,как пример, такой способ реализации последовательного интерфейса. И естественно там будет буфер. Все очнь относительно везде есть программные действия, но они разной нагрузки на процессорное время. Одно можно сказать точно, буфер нужен там где программист сеансово теряет полный контроль над действиями процессора, а этого не должно быть в програмной части устройства.
Угу, так согласен. :) В конце концов, это вопрос терминологии, и незачем спорить, говоря друг другу одно и то же разными словами.
В моем случае тоже работало при выводе в порт. Если в порт не выводить, то не раоботало.
Нужен пример. Без кода ничего не понятно.
Нужен пример. Без кода ничего не понятно.
Это пост №16 второй код, где после 45стр закомменчены. Если комментарии убрать, то начинает работать корректно
Увеличение задержки в 52 строке делали ? Ну скажем секунд до двух ?
Увеличение задержки в 52 строке делали ? Ну скажем секунд до двух ?
Там это не помогает, я как раз на этом этапе объяснять взялся. Короче пока закомменчено, переменная а принимает всякий мусор и есс-но массив не заполняется. А если снять комментарий, то заполнение идет корректно. Компилятор - ?
Переменная а явно проинициализирована . Все равно мусор ? А если объявить ее как static ?
Переменная а явно проинициализирована . Все равно мусор ? А если объявить ее как static ?
Там получалось следующее:
Пишем int a,b,c; Получаем незаполненый массив, мониторил "а" - она показывала что-то вроде 2337.
Если добавляем a=0; то дальше все корректно. Оттуда родился Лебедев с локальными переменными.
А вот почему корректно работает если раскомментировать строки вывода в монитор? Предполагаю, что в этом случае вмешивается компилятор и уже сам инициализирует а с 0 значением?
Говорю же я, дружным хором, вместе со всеми Лебедевыми, и вообще с любой книжкой "С для чайников" - не инициализируются, по умолчанию, локальные переменные в C/C++.
И никуда компилятор не вмешивается, и переменная a остаётся не инициализированной, т.е. с каким-то случайным значением. Просто, при каких-то условиях, это случайное значение может случайно оказаться нулевым. И тогда программа начинает работать, вроде-бы... но как-то не всегда. Получаем самые неприятные, трудноотлавливаемые ошибки. Оно нам надо? :)
Компилятор С, изначально, был заточен под получение очень эффективного кода. При правильном использовании он, вообще, мало уступает ассемблерному.
Для инициализации локальных переменных понадобилось бы несколько лишних процессорых команд при каждом входе в функцию, в цикл, и т.п. На такую жертву разработчики высокоэффективного языка никогда бы не пошли.
С глобальными переменными, или со статическими локальными, ситуация совсем другая. Они инициализируются только один раз, перед стартом программы, и с этим вполне можно смириться.
Говорю же я, дружным хором, вместе со всеми Лебедевыми, и вообще с любой книжкой "С для чайников" - не инициализируются, по умолчанию, локальные переменные в C/C++.
И никуда компилятор не вмешивается, и переменная a остаётся не инициализированной, т.е. с каким-то случайным значением. Просто, при каких-то условиях, это случайное значение может случайно оказаться нулевым. И тогда программа начинает работать, вроде-бы... но как-то не всегда. Получаем самые неприятные, трудноотлавливаемые ошибки. Оно нам надо? :)
Компилятор С, изначально, был заточен под получение очень эффективного кода. При правильном использовании он, вообще, мало уступает ассемблерному.
Для инициализации локальных переменных понадобилось бы несколько лишних процессорых команд при каждом входе в функцию, в цикл, и т.п. На такую жертву разработчики высокоэффективного языка никогда бы не пошли.
С глобальными переменными, или со статическими локальными, ситуация совсем другая. Они инициализируются только один раз, перед стартом программы, и с этим вполне можно смириться.
Так я на эту тему и не спорю, просто стало интересно почему такая фича получается. Для себя давно поставил, либо глобальная, либо инициализация.