Подкажите решение:
1) есть проограмма, сейчас на М3 (lpc1768) но вообще будет на М4 (stm32f4), без ОС.
в ней выполняются фоновые задачи, в т.ч и пересылка DMA, и есть циклы типа while()
2) есть довольно высокочастотное прерывание (неважно от чего) INT1 с регулярной частотой (периодом - T1)
3) после каждых N должна выполниться подпрограмма SUB1, время выполнения SUB1 - T2
Естественно, T2< N*T1,
но - T2>T1.
Т.е. во время выплонения SUB1 обязательно произойдет прерывание INT1.
4) пропустить INT нельзя, как нельзя пропустить и SUB1.
Первой что пришло в голову - крутить в INT1 счетчик, когда он досчитал до N - выставлять флаг.
В SUB1 его проверять, но при в основной программе во всех циклах вставлять вызов SUB1
Код
#define N 10
u8 IntFlag=0;
//-----
void INT1(void){
static cnt=0;
.........
if(++cnt>N){
cnt=0;
IntFlag=1;
}
}
//-----
void SUB1(void){
if(IntFlag){
IntFlag=0;
...........
}
}
//
int main(void){
.......
while(xxxx){
.....
SUB1();
}
........
}
Проблемы:
1) не пропустить бы какой-то while/for, это надо из все просматривать во всей программе, е везде вставлять вызов SUB1
2) на многочисленные вызовы SUB1 тратиться довольно много времени, так например скорость записи в SD-флешку (по DMA!) падает процентов на 20-30 (хотя и огстается в пределат требуемогодля моей задачи).
Может кто подскажет более элегантное решение ?
Может оформить SUB1 как прерывание более низкого уровня чем INT1 и вместо установки флага, как-то его иничиировать в конце N-ного INT1 ? но как это сделать ?