coolnik> по поводу предыдущего поста,
>>Ну я не знал что размер кода отрабатываемого в самом худшем
>>случае (т.е. 5мкс + 10мкс + 50 мкс, произойдет тогда когда будет
>>уже 9 вхождений) укладывается в 5 мкс.
coolnik> а разве можно сделать так, чтобы период был 5 мкс, а код в обработчике, например 15мкс? И никаких глюков по фронтам?
Ну не совсем так, абсолютно синхронно будет приходить 5 мкс фронт, остальные фронты будут запаздывать на +вход/выход из прерывание и длину кода отрабатывающего 5мкс. Что при этом важно !!! При этом важно что бы стек был довольно большим. Вот как будет выгдяеть вход в обработчик:
EVENT0: // + 2 такта
код процедуры обработки 5 мкс // + X тактов
if(status.not_stopped == 1) SKIP // +1,2,3 такта
reti // +4 такта
10mks:
if(counter10mks == rNULL) SKIP // +1,2,3 такта
rjmp 50mks // +2 такта
10mks_count -> counter10mks // +1
status &= bitset_10mks|bitset_notstopped // +1
//======================================
код процедуры обработки 10 mks // +Y тактов
//======================================
status & =bitclear_10mks&bitclear_notstopped // +1
50mks:
if(counter50mks == rNULL) SKIP // +1,2,3 такта
reti
50mks_count -> counter10mks // +1
status &= bitset_50mks|bitset_notstopped // +1
//======================================
код процедуры обработки 50 mks
//======================================
status & =bitclear_50mks&bitclear_notstopped // +1
reti
Такакя бяка называется реентерабельным прерыванием и используется для того что бы никогда не происходило потери прерывания, что в Linux например явление
частое (политика отложенных прерываний) при возникновении онных чаще чем
может обеспечить механизм обработки. Происходит следующее 5мкс отрабаытвается независиом находится обработчик в 10 мкс процедуре, 50 мкс процедуре. Но после отработки 5 мкс происходит возврат в прерванную часть прерывания. Таким образом 5 мкс приходит гарантированно а вов фронты 10мкс и 50 мкс периодически могут гулять (при условии что 10мкс + 50 мкс по тактам превысит 5 мкс) в сторону увеличения периода на 6+Х тактов, где Х-тактов длительность процедуры 5 мкс. Причем!!! процедура надо понимать в виде макропроцедуры, т.е. без вызова (и так тактов мало) и возврата.
Что важно если ты затянешь 10 мкс и 50 мкс на непрогнозируемое значение
то стек просто переполнится и в отличии от PC где это можно контролировать через систему исключений, микроконтроллерное ядро просто рухнет по непрогнозируемому ветктору.
А бритва Оккама навязывает нам (что абсолютно правильно) не множить сущности без достаточной на это необходимости ж-) Так что это так мозги поразминать ж-)
>>Открыть даташит и на последней странички есть табличка в конце каждой строки приведены такты.
coolnik> как обычно понял. Посмотрел... Только я на асме не пишу... так что опять же реально оценить не получится [»]
Ну тогда VAR Algorithm Builder прямой тебе помощник, мало чем от Си отличается д аеще и удобный такой - отладка с мониторингом по тому же интерфейсу по которому и шьешь. А интерфейс еще проще чем PonyProg.