Высота панели уведомлений может быть получена с помощью средства получения свойств. Когда эта высота изменяется, вызовите ChangeDetectorRef.detectChanges
, чтобы избежать исключения, которое возникнет, когда высота будет применена к элементу div
.
@ViewChild("notificationBar") private notificationBarRef: ElementRef;
private _notificationBarHeight: number = null;
public get notificationBarHeight(): number {
const height = this.notificationBarRef ? this.notificationBarRef.nativeElement.offsetHeight : null;
if (Math.abs(height - this._notificationBarHeight) > 0.1) {
this._notificationBarHeight = height;
this.changeDetectorRef.detectChanges();
}
return this._notificationBarHeight;
}
В шаблоне установите высоту элемента div
в пикселях с привязкой [style.height.px]
:
См. этот стек-блиц для демонстрации.
Добавьте неинициализированную глобальную переменную, которая установлена на различные значения всюду по коду. А именно, установите его прежде и после основных вызовов функции.
Поместите точку останова в начале основного.
То, когда процессор сбросит глобальную переменную, будет все еще иметь последнее значение, на которое это было установлено. Продолжайте добавлять эти "панировочные сухари" для сужения к проблемной функции.
Я использую основанное на состоянии программирование и прием, который я всегда хотел использовать, должен был зарезервировать один выходной порт для текущего состояния в двоичном файле. Затем поднимите трубку анализатор логики и посмотрите синхронизации изменений состояния. Вы могли сделать что-то подобное здесь: Сделайте то, что сказал Robert, и создайте глобальную переменную и измените ее значение в ключевых пунктах - предпочтительно с функцией, которая сразу устанавливает значение порта к текущему состоянию (т.е. changeState (nextState);) Изменение состояние при вводе функции, которая ударяет собаку, затем возвратите ее к предыдущему состоянию перед отъездом функции. Необходимо смочь видеть, от каких функций это не становится ударенным и затем можно работать над теми.
Удача, это походит на проблему синхронизации, и это жестко решить.
Обычно сторожевая задача/поток работает в низком приоритете. Таким образом, если сторожевой таймер не становится ударенным, это должно быть то, потому что процессор занят, делая что-то еще - вероятно, что-то, что он не должен делать.
Было бы действительно полезно разгрузить контекст выполнения (локальный стек, планируя состояние и т.д.) для каждой задачи/потока незадолго до сброса процессора. С небольшим количеством удачи и работы, Вы сможете определить то, что препятствует сторожевой задаче ударить таймер.
Подвергните сомнению каждое предположение, которое Вы делаете, дважды:
И удивление, что различия там между 'продвижением через' и одним только выполнением; синхронизация ограничений будет, конечно, иметь значение.
Много сторожевых таймеров программного обеспечения автоматически отключены при присоединении отладчика (чтобы препятствовать тому, чтобы он перезапустил, в то время как отладчику остановили приложение).
Тем не менее вот некоторые основы:
Действительно ли это - многопоточные приложения? Вы используете планировщик RT? Если так, Ваша сторожевая задача исчерпана ресурсы?
Удостоверьтесь, что Ваша сторожевая задача не может застрять ни на чем (незаконченный семафор, ожидающий сообщения, и т.д.). Иногда, функции могут заблокироваться способами, которыми Вы не могли бы ожидать; например, у меня есть платформа Linux, я продолжаю работать прямо сейчас, где я могу заставить printf блокироваться довольно легко.
Если это является единственным, распараллелил, профилировщик может помочь Вам определить проблемы синхронизации.
Если это - новая система, удостоверьтесь, что сторожевой таймер работает правильно; протестируйте простой код, который просто поражает WD и затем спит в бесконечном цикле.
Я использовал бы дополнительный выходной контакт, установил бы высоко затем низко в соответствующих точках в коде для ограничения объема того, где я смотрю. Затем я проследил бы его на цифровом объеме или анализаторе логики. Это эквивалентно методу навигационных цепочек, упомянутому другим плакатом, но Вы сможете к корреляту времени к импульсу сброса намного лучше.