|
М3/М4 - как сделать трюк с прерываниями? |
|
|
|
Oct 23 2012, 11:30
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Подкажите решение: 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 ? но как это сделать ?
|
|
|
|
|
 |
Ответов
|
Oct 23 2012, 16:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата Не очень вьехал чем отличается PreemptionPriority от SubPriority? Первое - приоритет для вложенных прерываний. Если будет запрос на прерывание, у которого preemption будет выше, чем у текущего исполняющегося прерывания, будет вызвано высокоприоритетное. Второе - порядок выполнения прерываний, если вдруг два запроса поступили одновременно.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Oct 23 2012, 18:23
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(esaulenka @ Oct 23 2012, 18:54)  Первое - приоритет для вложенных прерываний. Если будет запрос на прерывание, у которого preemption будет выше, чем у текущего исполняющегося прерывания, будет вызвано высокоприоритетное. Это понятно, непонятно зачем два уровня распределения приоритетов? Цитата Второе - порядок выполнения прерываний, если вдруг два запроса поступили одновременно. Если эти два запроса имеют один приоритет? Т.е. это распределение приоритета среди прерываний с одинаковым приоритетом? Т.е. один номер это группа (0-N), второй - номер внутри группы (0-M), интересно - чем это лучше чем один список приоритетов 0-N*M ?
|
|
|
|
|
Oct 23 2012, 19:06
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Allregia @ Oct 23 2012, 21:23)  Это понятно, непонятно зачем два уровня распределения приоритетов? Появляется возможность задать приоритет внутри группы. Цитата(Allregia @ Oct 23 2012, 21:23)  Если эти два запроса имеют один приоритет? Т.е. это распределение приоритета среди прерываний с одинаковым приоритетом? Да Цитата(Allregia @ Oct 23 2012, 21:23)  Т.е. один номер это группа (0-N), второй - номер внутри группы (0-M), интересно - чем это лучше чем один список приоритетов 0-N*M ? в списке нет возможности задать порядок вызова прерываний с одинаковым приоритетом - первым вызовется тот у кого номер меньше, а не тот какой вы хотели бы. Может и не лучше...но так сделано.
|
|
|
|
|
Oct 23 2012, 20:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(_Артём_ @ Oct 23 2012, 21:06)  Появляется возможность задать приоритет внутри группы.
Да
в списке нет возможности задать порядок вызова прерываний с одинаковым приоритетом - первым вызовется тот у кого номер меньше, а не тот какой вы хотели бы. Может и не лучше...но так сделано. Я вот о чем - предположим есть 3 группы, A,B,C, внутри каждой два прерывания, 0 и 1: A 0,0 B 0,1 C 0,1 порядок приоритетов ведь все равно будет такой: A0,A1, B0, B1, C0, C1 так какая разница, если это будет порядок: 0,1,2,3,4,5 где: 0=A0 1=A1 2=B0 3=B1 4=C0 5=C1 ведь тоже самое? но раз так сделали, значит о чем-то думали, вот и пытаюсь найти скрытый смысл  --------------- ну ладно, это все теории, а что с тем что я спросил в #9 ?
|
|
|
|
Сообщений в этой теме
Allregia М3/М4 - как сделать трюк с прерываниями? Oct 23 2012, 11:30 _Артём_ Цитата(Allregia @ Oct 23 2012, 14:30) Мож... Oct 23 2012, 11:38 Allregia Цитата(_Артём_ @ Oct 23 2012, 13:38) Код ... Oct 23 2012, 12:32  _Артём_ Цитата(Allregia @ Oct 23 2012, 15:32) Я в... Oct 23 2012, 13:00 Flexz Если высокочастотное прерывание идет от внешнего и... Oct 23 2012, 12:00 Flexz Цитата(Allregia @ Oct 23 2012, 16:32) EXT... Oct 23 2012, 12:50 Allregia Т.е как я понял. проще всего через EXTI:
Код//выс... Oct 23 2012, 14:04 _Артём_ Цитата(Allregia @ Oct 23 2012, 17:04) Т.е... Oct 23 2012, 14:27 Allregia Я пока с NVIC до конца не разобрался.
Не очень вье... Oct 23 2012, 15:46 _Артём_ Цитата(Allregia @ Oct 23 2012, 18:46) Или... Oct 23 2012, 20:31  AHTOXA Есть ещё удобная функция
Кодuint32_t NVIC_EncodePr... Oct 23 2012, 20:32  ReAl Цитата(Allregia @ Oct 23 2012, 21:23) Т.е... Oct 23 2012, 20:05   Allregia Цитата(ReAl @ Oct 23 2012, 22:05) Тем, чт... Oct 23 2012, 20:18 Allregia Понятно, вначале я включаю приоритеты вызовом NVIC... Oct 23 2012, 20:47 _Артём_ Цитата(Allregia @ Oct 23 2012, 23:47) Пон... Oct 23 2012, 20:55  SSerge Цитата(_Артём_ @ Oct 24 2012, 03:55) Это ... Oct 24 2012, 07:30  demiurg_spb Цитата(_Артём_ @ Oct 24 2012, 00:55) Стра... Oct 24 2012, 12:05
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|