ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
502305
fk0, легенда (31.03.2014 18:42, просмотров: 4432)
PIC24, dsPIC. Критические секции. Если использовать SET_AND_SAVE_CPU_IP и RESTORE_CPU_IPL, то генерирующийся объём кода поражает воображение. Подумал я вот чего, на входе пусть будет x=DISICNT и DISI #0x3fff, а на выходе DISICNT=x. Всего 3 команды! Но критическая секция должна гарантированно в 16383 такта выполниться. Иначе трудноуловимые глюки. Тогда поступим так: возьмём какое-либо прерывание, например INT4, точно не используемое. Ставим ему приоритет 6 и (DISI запрещает по 6-й включительно). И разрешаем и его, и устанавливаем флаг после входа в критическую секцию (1 команда). И на выходе из критической секции если x (значение DISICNT на входе) нулевое -- сбрасываем флаг прерывание и восстанавливаем DISICNT. Таким образом, если DISICNT кончится раньше завершения критической секции, то получаем срабатывание этого прерывания и диагностику ошибки. А если не кончится, то на выходе из секции прерывание INT4 будет разрешено только в случае, если было разрешено на входе в секцию (и DISICNT значит ненулевое было). Т.е. критические секции могут быть вложенные и есть диагностика зависания в критической секции. Что тут плохо?
[ZX]