|
Прерывание в прерывании, Для реализации Super Simple Tasker |
|
|
|
 |
Ответов
|
Nov 17 2017, 10:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368

|
Возвращаясь к оригинальной теме по поводу прерывания из прерывания. У меня попроще задача и я не думал, что в ARM ее не так просто решить в лоб. Грубо говоря допустим нужен примитивный Preemptive Scheduler, который бы запускал две функции Step_10ms() и Step_1s() с определенными интервалами 10мс и 1с соответственно. Step_10ms имеет высший приоритет, чем Step_1s(). Функции полностью независимые, железа и общей памяти не используют. Step_10ms() исполняется миллисекунды за 3, Step_1s() - за 100мс. То есть Step_10ms() должна прерывать исполнение Step_1s(), когда нужно. Обе функции защищены от overrun - при запуске выставляют флаг, так что если функция вдруг вызовется опять во время своего исполнения - она это проконтролирует и система вылетит в ошибку. Я, недолго думая, дописал в SysTick_handler (обработчик SysTick, который вызывается раз в 1мс) указанную конструкцию (псевдокод без намека на правильный синтаксис, приоритеты не расставлены) Код void SysTick_handler(void) { static uint16_t Timer_10ms = 9; static uint16_t Timer_1s = 999;
if (Timer_10ms) Timer_10ms--; else { Timer_10ms = 9u; Step_10ms(); //Вызываем 10мс функцию }
if (Timer_1s) Timer_1s--; else { Timer_1s = 999u; Step_1s(); //Вызываем 1с функцию } } Каково же было мое удивление, когда оказалось, что ARM не поддерживает reentrant прерывания и выполнение Step_1s() полностью блокирует прерывание и Step_10ms() при этом не исполняется. Нашел в инете, что народ играется ассемблером и пытается восстанавливать стек и прочие вещи, чтобы процессор опять мог заходить в это же прерывание, но хотелось бы узнать - есть ли простое решение, без RTOS, так как кроме этой функции RTOS будет не нужна.
|
|
|
|
|
Nov 17 2017, 12:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 817
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368

|
Цитата(scifi @ Nov 17 2017, 14:15)  Всё он поддерживает. Обработчик прерывания не будет вызван повторно, пока он выполняется. Вообще-то это разумно, не находите? Для того, чтобы он был прерван, должно произойти прерывание с более высоким приоритетом, а не с равным. Ну я нахожу разумным, если есть возможность выбора - так или этак. И мое представление об обработчике прерывания очень простое - произошло прерывание - процессор должен безусловно перейти на адрес обработчика. Если пользователь хочет - не снимает флаг, пока не обработает все прерывание и теряет возможность поимки следующего прерывания, пришедшего во время обработки. Если хочет - снимает, и не теряет. Насколько я помню 8051-ых так было реализовано.
|
|
|
|
Сообщений в этой теме
arhiv6 Прерывание в прерывании Nov 7 2017, 12:00 Forger Цитата(arhiv6 @ Nov 7 2017, 15:00) один и... Nov 7 2017, 13:02 Студент заборстроительного Цитата(Forger @ Nov 7 2017, 16:02) Цитата... Nov 8 2017, 16:41  Forger Цитата(Студент заборстроительного @ Nov 8 201... Nov 8 2017, 20:41   ig_z QUOTE (Forger @ Nov 8 2017, 22:41) С друг... Nov 9 2017, 20:15    Forger Цитата(ig_z @ Nov 9 2017, 23:15) в каждой... Nov 9 2017, 21:41 arhiv6 Как минимум, это интересно - попробовать разные по... Nov 7 2017, 13:17 Forger Цитата(arhiv6 @ Nov 7 2017, 16:17) А ещё ... Nov 7 2017, 13:30  DASM Цитата(Forger @ Nov 7 2017, 16:30) В мелк... Nov 7 2017, 14:28   Forger Цитата(DASM @ Nov 7 2017, 17:28) Я отказа... Nov 7 2017, 14:45   jcxz Цитата(DASM @ Nov 7 2017, 16:28) Я отказа... Nov 7 2017, 15:04 jcxz Цитата(arhiv6 @ Nov 7 2017, 15:17) Как ми... Nov 7 2017, 15:00 Obam Цитата(arhiv6 @ Nov 7 2017, 16:00) нужно ... Nov 7 2017, 13:44 AHTOXA Цитата(arhiv6 @ Nov 7 2017, 17:00) Как эт... Nov 7 2017, 14:17 ViKo Подтверждаю, RTX RTOS от Keil - весьма достойная п... Nov 7 2017, 14:52 DASM "прихожу лишь к одному выводу " - приход... Nov 7 2017, 14:53 jcxz Цитата(DASM @ Nov 7 2017, 16:53) Вы лучше... Nov 7 2017, 15:08 Forger Цитата(DASM @ Nov 7 2017, 17:53) "пр... Nov 7 2017, 15:18 scifi Гугл вводит на гитхаб. Возможно, всё украдено до н... Nov 7 2017, 15:04 DASM Так может Вы дадите совет, сколько памяти давать к... Nov 7 2017, 15:08 jcxz Цитата(DASM @ Nov 7 2017, 17:08) Так може... Nov 7 2017, 15:11  DASM Цитата(jcxz @ Nov 7 2017, 18:11) А в чём ... Nov 7 2017, 15:29   jcxz Цитата(DASM @ Nov 7 2017, 17:29) Тем, что... Nov 7 2017, 15:58 DASM Я немного преувеличил для ясности. Эти РТОС замеча... Nov 7 2017, 15:11 Forger Цитата(DASM @ Nov 7 2017, 18:11) Эти РТОС... Nov 7 2017, 15:38 DASM Да никто не хает, каждый до..ит как хочет. Просто ... Nov 7 2017, 15:39 Forger Цитата(DASM @ Nov 7 2017, 18:39) Ваши РТО... Nov 7 2017, 15:46 jcxz Цитата(DASM @ Nov 7 2017, 17:39) но навск... Nov 7 2017, 16:11  Forger Цитата(jcxz @ Nov 7 2017, 19:11) Чтобы по... Nov 7 2017, 16:13 arhiv6 Цитата(AHTOXA @ Nov 7 2017, 21:17) Здесь ... Nov 7 2017, 15:59 jcxz Цитата(arhiv6 @ Nov 7 2017, 17:59) Пожалу... Nov 7 2017, 16:16  Forger Цитата(jcxz @ Nov 7 2017, 19:16) Наверное... Nov 7 2017, 17:56 arhiv6 Смотрел я исходники ОС, но они все по похожему при... Nov 7 2017, 17:28 Forger Цитата(arhiv6 @ Nov 7 2017, 20:28) Как пр... Nov 7 2017, 18:27  arhiv6 Цитата(Forger @ Nov 8 2017, 01:27) Как бы... Nov 7 2017, 19:00 jcxz Цитата(arhiv6 @ Nov 7 2017, 19:28) Смотре... Nov 7 2017, 21:33 arhiv6 jcxz, Forger, я не знаю, как правильно сделать, по... Nov 7 2017, 18:14 DASM Меня устраивает карусель кооперативная на таймерах... Nov 7 2017, 18:50 Forger Цитата(DASM @ Nov 7 2017, 21:50) void Led... Nov 7 2017, 19:01 DASM Первое, что приходит в голову так: о как, у меня т... Nov 7 2017, 19:05 Forger Цитата(DASM @ Nov 7 2017, 22:02) Просто к... Nov 7 2017, 19:05  DASM Цитата(Forger @ Nov 7 2017, 22:05) Ну-ну,... Nov 7 2017, 19:08 arhiv6 Цитата(DASM @ Nov 8 2017, 02:05) Первое, ... Nov 7 2017, 19:08 Forger Цитата(DASM @ Nov 7 2017, 22:05) Первое, ... Nov 7 2017, 19:21 jcxz Цитата(DASM @ Nov 7 2017, 21:05) вы шину ... Nov 7 2017, 21:46 DASM Ну да , тут собственно у меня так и есть Nov 7 2017, 19:13 DASM @ Читайте матчасть по ARM Cortex.@ Ладно, спорить ... Nov 7 2017, 19:29 Forger Цитата(DASM @ Nov 7 2017, 22:29) @ Читайт... Nov 7 2017, 19:36  AlexandrY Цитата(Forger @ Nov 7 2017, 21:36) Для те... Nov 7 2017, 20:41   Forger Цитата(AlexandrY @ Nov 7 2017, 23:41) Да ... Nov 7 2017, 21:44  AVR Цитата(Forger @ Nov 7 2017, 22:36) ОК, сл... Nov 8 2017, 08:44   Forger Цитата(AVR @ Nov 8 2017, 11:44) Ради него... Nov 8 2017, 12:53  jcxz Цитата(Forger @ Nov 7 2017, 21:36) Для те... Nov 8 2017, 20:49   Forger Цитата(jcxz @ Nov 8 2017, 23:49) может ес... Nov 8 2017, 20:54 DASM А где тут DMA и что и куда оно грузит? Nov 7 2017, 21:01 AlexandrY Цитата(DASM @ Nov 7 2017, 23:01) А где ту... Nov 8 2017, 06:13 DASM Ну не знаю, у меня на Ардуино все проще, а на мали... Nov 7 2017, 22:35 DASM Да уж.. сколько чудных открытий человек недавно п... Nov 8 2017, 21:23 Forger Цитата(DASM @ Nov 9 2017, 00:23) склетон ... Nov 8 2017, 23:29 Forger Цитата(syoma @ Nov 17 2017, 13:45) что AR... Nov 17 2017, 11:07  Forger Цитата(scifi @ Nov 17 2017, 14:15) Всё он... Nov 17 2017, 11:37   Obam Цитата(syoma @ Nov 17 2017, 16:02) …Если ... Nov 17 2017, 13:03   AlexandrY Цитата(syoma @ Nov 17 2017, 14:02) Ну я н... Nov 17 2017, 13:42   jcxz Цитата(syoma @ Nov 17 2017, 14:02) Наскол... Nov 17 2017, 13:44 Timmy Цитата(syoma @ Nov 17 2017, 13:45) Каково... Nov 17 2017, 12:01 syoma Знающие люди подсказали такой вариант. У них работ... Nov 17 2017, 18:04 AlexandrY Цитата(syoma @ Nov 17 2017, 20:04) Знающи... Nov 17 2017, 18:56  syoma Цитата(AlexandrY @ Nov 17 2017, 21:56) Кт... Nov 17 2017, 20:51   AlexandrY Цитата(syoma @ Nov 17 2017, 22:51) Если б... Nov 17 2017, 21:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|