Как & ldquo; Real-Time & rdquo; такое Linux 2.6?

Короткие и простые: поскольку элементы, которые вы ищете, не существуют в документе (пока).


В оставшуюся часть этого ответа я буду использовать getElementById как пример, но то же самое относится к getElementsByTagName , querySelector и любому другому методу DOM, который выбирает элементы.

Возможные причины

Есть две причины, по которым элемент может не существовать:

  1. Элемент с переданным идентификатором действительно не существует в документе. Вы должны дважды проверить, что идентификатор, который вы передаете на getElementById, действительно соответствует идентификатору существующего элемента в (сгенерированном) HTML и что у вас не было с ошибкой идентификатор (идентификаторы чувствительный !). Кстати, в большинстве современных браузеров , которые реализуют методы querySelector() и querySelectorAll(), нотация стиля CSS используется для извлечения элемента его id, например: document.querySelector('#elementID'), в отличие от способа, с помощью которого элемент извлекается его id в [[16]; в первом символе # необходимо, во втором это приведет к тому, что элемент не будет извлечен.
  2. Элемент не существует в данный момент , который вы вызываете getElementById ].

Последний случай довольно распространен. Браузеры анализируют и обрабатывают HTML сверху вниз. Это означает, что любой вызов элемента DOM, который встречается до появления этого элемента DOM в HTML, не будет выполнен.

Рассмотрим следующий пример:



Появляется div после script. В настоящий момент сценарий выполняется, элемент не существует , но и getElementById вернут null.

jQuery

То же самое относится к все селекторы с jQuery. jQuery не найдет элементов, если вы ошибочно написали ваш селектор, или вы пытаетесь выбрать их , прежде чем они на самом деле существуют .

Добавленный поворот - это когда jQuery не найден потому, что вы загрузили скрипт без протокола и запускаетесь из файловой системы:


этот синтаксис используется, чтобы позволить сценарию загружаться через HTTPS на странице с протоколом https: // и для загрузки HTTP-версии на странице с протоколом http: //

У этого есть неудачный побочный эффект попытки и невозможность загрузить file://somecdn.somewhere.com...


Решения

Прежде чем позвонить getElementById (или любой метод DOM, если на то пошло), убедитесь, что элементы, к которым вы хотите получить доступ, существуют, т. е. загружается DOM.

Это может быть обеспечено просто добавив ваш JavaScript после к соответствующему элементу DOM

, и в этом случае вы также можете поместить код непосредственно перед тегом закрывающего тела () (все DOM элементы будут доступны в момент выполнения скрипта). [/ g3 6]

Другие решения включают прослушивание событий load [MDN] или DOMContentLoaded [MDN] . В этих случаях не имеет значения, где в документе вы помещаете код JavaScript, вам просто нужно запомнить, чтобы весь обработчик DOM обрабатывался в обработчиках событий.

Пример:

window.onload = function() {
    // process DOM elements here
};

// or

// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
    // process DOM elements here
});

Более подробную информацию об обработке событий и различиях браузера см. в статьях на странице quirksmode.org .

jQuery

Сначала убедитесь, что jQuery загружен правильно , Используйте инструменты разработчика браузера , чтобы узнать, был ли найден файл jQuery и исправлен ли URL-адрес, если он не был (например, добавьте схему http: или https: в начале, отрегулируйте путь, и т. д.)

Прослушивание событий load / DOMContentLoaded - это именно то, что делает jQuery с .ready() [docs] . Весь ваш код jQuery, который влияет на элемент DOM, должен находиться внутри этого обработчика событий.

На самом деле в учебнике j8uery явно указано:

Как почти все, что мы делаем при использовании jQuery, читает или манипулирует объектной моделью документа (DOM), мы должны убедиться, что мы начинаем добавлять события и т. д., как только DOM готов.

Для этого мы регистрируем готовое событие для документа.

$(document).ready(function() {
   // do stuff when DOM is ready
});
blockquote>

В качестве альтернативы вы также можете использовать сокращенный синтаксис:

$(function() {
    // do stuff when DOM is ready
});

Оба эквивалентны.

28
задан Robert 1 September 2009 в 15:42
поделиться

4 ответа

Вы можете получить большую часть своих ответов из вики Linux и FAQ

Каковы возможности в реальном времени стандартного ядра Linux 2.6?

Обычно ядро ​​Linux разрешает одному процессу вытеснять другой только при определенных обстоятельствах:

  • Когда ЦП выполняет код пользовательского режима
  • Когда код ядра возвращается из системного вызова или прерывания обратно пользователю пробел
  • Когда код ядра блокируется на мьютексе или явно передает управление другому процессу

Если код ядра выполняется, когда происходит какое-то событие, которое требует запуска потока с высоким приоритетом, поток с высоким приоритетом не может вытеснить работающий код ядра, пока код ядра явно не передаст управление. В худшем случае задержка может составить сотни миллисекунд или больше.

Параметр конфигурации Linux 2.6 CONFIG_PREEMPT_VOLUNTARY вводит проверки наиболее распространенных причин длительных задержек, чтобы ядро ​​могло добровольно передать управление задаче с более высоким приоритетом, ожидающей выполнения. Это может быть полезно, но, хотя оно снижает вероятность возникновения длительных задержек (от сотен миллисекунд до потенциально секунд или более), оно не устраняет их. Однако в отличие от CONFIG_PREEMPT (обсуждается ниже), CONFIG_PREEMPT_VOLUNTARY оказывает гораздо меньшее влияние на общую пропускную способность системы. (Как всегда, существует классический компромисс между пропускной способностью --- общей эффективностью системы --- и задержкой. С более быстрыми процессорами современных систем часто имеет смысл найти компромисс между пропускной способностью и меньшими задержками, но системы серверных классов, которым не требуются гарантии минимальной задержки, вполне могут выбрать использование либо CONFIG_PREEMPT_VOLUNTARY, либо придерживаться традиционной конструкции ядра без вытеснения.)

Ядро Linux 2.6 имеет дополнительную опцию конфигурации CONFIG_PREEMPT, которая вызывает весь код ядра за пределами защищенных спин-блокировкой областей и обработчиков прерываний должен иметь право на недобровольное вытеснение потоками ядра с более высоким приоритетом. С этой опцией задержка в худшем случае снижается до (примерно) однозначных миллисекунд, хотя некоторые драйверы устройств могут иметь обработчики прерываний, которые значительно увеличивают задержку. Если приложение Linux в реальном времени требует задержек меньше, чем однозначные миллисекунды, настоятельно рекомендуется использовать патч CONFIG_PREEMPT_RT.

У них также есть список "Попался" ум при записи в реальном времени приложений?

Позаботьтесь о следующем во время начальная фаза запуска:

  • Как можно скорее вызвать mlockall () из main ().
  • Создайте все потоки во время запуска приложения и коснитесь каждой страницы всего стека каждого потока. Никогда не запускайте потоки динамически во время показа RT, это нарушит поведение RT.
  • Никогда не используйте системные вызовы, которые, как известно, генерируют ошибки страниц, такие как fopen (). (Открытие файлов делает системный вызов mmap (), который генерирует page-fault).
  • Если вы используете 'глобальные переменные времени компиляции' и / или 'глобальные переменные времени компиляции массивов ', затем используйте mlockall () для предотвратить ошибки страницы при доступе их.

дополнительная информация: HOWTO: создание RT-application

У них также есть большая страница публикаций , которую вы, возможно, захотите проверить.

36
ответ дан 28 November 2019 в 01:45
поделиться

Существует два принципиально разных подхода к реализации возможностей реального времени в Linux.

1) Исправьте существующее ядро ​​такими вещами, как исправления rt-preempt. В конечном итоге это приведет к полностью вытесняющему ядру

2) Двухъядерный подход (например, xenomai, RTLinux, RTAI, ...)

Есть много ошибок, переходящих с RTOS на Linux.

Может быть, вам действительно не нужен режим реального времени?

Я говорю о Linux реального времени в моем обучении: http://www.reliableembeddedsystems.com/embedded-systems_7. HTML

2
ответ дан robert.berger 1 September 2009 в 15:42
поделиться

Вы видели Xenomai ? Это позволит вам запускать процессы в «жестком реальном времени» над Linux, при этом позволяя вам получить доступ к обычным API Linux для всех потребностей, не связанных с реальным временем.

5
ответ дан 28 November 2019 в 01:45
поделиться

Ответ, вероятно, «достаточно хороший ".

Если вы используете встроенную систему, вы, вероятно, контролируете все или большую часть программного обеспечения на коробке.

Стандартный Linux 2.6 имеет несколько функций, подходящих для задач с малой задержкой, в основном это:

  • Политики планирования
  • Блокировка памяти

Предполагая, что вы используете одноядерный компьютер, если у вас есть только одна задача, которая установила свою политику планирования на SCHED_FIFO или SCHED_RR (не имеет значения, что, если у вас есть только одна задача), И заблокировал всю свою память с помощью mlockall (), тогда она БУДЕТ запланирована, как только она будет готова к запуску.

Тогда единственное, что ты »

1
ответ дан 28 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: