реклама на сайте
подробности

 
 
> TEventFlag.Signal_isr()
abutorin
сообщение Mar 8 2015, 21:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 3-09-12
Пользователь №: 73 374



Доброго времени суток.
Пробую использовать TEventFlag для оповещения основного цикла программы о завершении передачи даннных через SPI на STM32F103. В основном цикле очищаю флаг события, записываю данные в регистр, начинаю ждать событие. В обработчике прерывания взвожу флаг события методом signal_isr. Все работает, но остается одна проблема, процесс ожидающий этого события пробуждается только после следующего планирования процессов по системному таймеру, т.е. только примерно через 1мс. Мне казалось что такой задержки быть не должно. Я что-то делаю не так, или непонимаю как это должно работать. Подскажите кто чем может.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SergNK
сообщение Jan 18 2017, 11:23
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 139
Регистрация: 30-03-11
Из: Фаниполь (Минск)
Пользователь №: 63 991



Доброго дня!

Решил поднять тему вот таким вопросом.
Создаю ПО под Freescale M0+ с использованием scmRTOS. Четыре процесса:
CODE
typedef OS::process<OS::pr0, 512> TProc1;
typedef OS::process<OS::pr1, 512> TProc2;
typedef OS::process<OS::pr2, 512> I2C0_TASK;
typedef OS::process<OS::pr3, 1024> TBackgroundProc;

Есть прерывания:
CODE
TRTC rtc;
OS_INTERRUPT void RTC_second_Handler()
{
OS::TISRW TISRW_O;
rtc.RtcSecondIrqHandler();
OneSecondFlag.signal_isr();
}

Устанавливаю флаг в прерывании и ловлю его в процессе TProc1:
CODE
template<> OS_PROCESS void TProc1::exec()
{
for(;;)
{
OneSecondFlag.wait();
// while (!rtc.getNewSecondFlag());
led_bl.Cpl();
sleep(5);

}
}

Вылетает по HardFault. Если закомментировать OneSecondFlag.signal_isr(); то не вылетает. Ковыряюсь уже довольно долго. Накопал, что при восстановлении контекстов из критических секций происходит лишнее действие, которое затирает правильно восстановленный контекст.
Если использовать флаг rtc.getNewSecondFlag(), вызываемый из объекта, то всё ОК.
Куда копать?

Вдогонку:

Вылетает при выполнении кода:
CODE
bool OS::TEventFlag::wait(timeout_t timeout)
{
TCritSect cs;

if(Value) // if flag already signaled
{
Value = efOff; // clear flag
return true;
}
else
{
cur_proc_timeout() = timeout;

suspend(ProcessMap);

if(is_timeouted(ProcessMap))
return false; // waked up by timeout or by externals

cur_proc_timeout() = 0; <== вылетает при попытке выполнить эту инструкцию - обращение к несуществующей памяти
return true; // otherwise waked up by signal() or signal_isr()
}
}
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 18 2017, 12:04
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (SergNK @ Jan 18 2017, 13:23) *
Вылетает при выполнении кода:

Смотрим, во что выливается этот код:
CODE
Kernel.ProcessTable[Kernel.CurProcPriority]->Timeout = 0;
Давайте начнем с того, чему равен Kernel.CurProcPriority до вызова wait() и перед падением. Потом посмотрим, куда указывает ProcessTable[Kernel.CurProcPriority]. И дальше надо искать, кто портит одну из этих переменных.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- abutorin   TEventFlag.Signal_isr()   Mar 8 2015, 21:06
- - DmitryM   Цитата(abutorin @ Mar 9 2015, 00:06) Добр...   Mar 9 2015, 06:08
- - Сергей Борщ   Цитата(abutorin @ Mar 8 2015, 23:06) Подс...   Mar 9 2015, 06:45
|- - abutorin   Цитата(Сергей Борщ @ Mar 9 2015, 09:45) В...   Mar 9 2015, 09:14
|- - Сергей Борщ   Цитата(abutorin @ Mar 9 2015, 11:14) Созд...   Mar 9 2015, 10:10
|- - abutorin   Цитата(Сергей Борщ @ Mar 9 2015, 13:10) В...   Mar 9 2015, 11:49
- - SergNK   Ща попробую Контекст портится после suspend(Proce...   Jan 18 2017, 12:41
- - SergNK   Словил за хвост эту проблему. Словами или кодом оп...   Jan 20 2017, 21:04
- - SergNK   Весь день просидел и пытался подобраться поближе к...   Jan 22 2017, 20:39
|- - AHTOXA   Извините за банальность, но не пробовали ли вы вык...   Jan 22 2017, 21:42
- - SergNK   Это было сделано в первую очередь. Я не новичок в ...   Jan 23 2017, 04:41
|- - AHTOXA   Не обижайтесь, но раз вы этого явно не написали, к...   Jan 23 2017, 06:23
- - SergNK   scmRTOS v5.1 IAR 7.70 Windows 10   Jan 23 2017, 15:46
|- - AHTOXA   Понятно. Свой порт под IAR для M0+? Давайте тепер...   Jan 23 2017, 16:41
- - SergNK   Да, не видно. То, что удалось словить, - это уже с...   Jan 23 2017, 17:15
|- - AHTOXA   Вы не ответили про порт. Что за порт? Покажите код...   Jan 23 2017, 17:19
- - SergNK   Простите, не понял сразу. CODEPendSV_Handler #if...   Jan 23 2017, 19:31
|- - AHTOXA   С обработчиком порядок, он один-в-один как в порте...   Jan 23 2017, 20:03
- - SergNK   Вот приоритеты: CODE//----------------------------...   Jan 23 2017, 20:23
|- - AHTOXA   Ага, вот оно! В M0 нет побайтового доступа к р...   Jan 23 2017, 21:09
- - SergNK   Только сегодня добрался до проекта. Работа, однако...   Jan 28 2017, 20:43
|- - AHTOXA   Цитата(SergNK @ Jan 29 2017, 01:43) Как с...   Jan 28 2017, 20:56
||- - SergNK   Цитата(AHTOXA @ Jan 28 2017, 23:56) Код E...   Jan 28 2017, 21:31
|- - esaulenka   Цитата(SergNK @ Jan 28 2017, 23:43) Как с...   Jan 30 2017, 13:44
- - SergNK   Удалось-таки победить. Вот что вышло: Это обработ...   Feb 6 2017, 19:18
|- - dxp   QUOTE (SergNK @ Feb 7 2017, 02:18) Удалос...   Feb 7 2017, 07:18
- - SergNK   Можно. Я отладил код под Freescale M0+. Подчистить...   Feb 7 2017, 07:28
|- - dxp   QUOTE (SergNK @ Feb 7 2017, 14:28) Можно....   Feb 7 2017, 07:44
- - SergNK   Спасибо за доверие! Первый вариант.   Feb 7 2017, 08:14
- - dxp   QUOTE (SergNK @ Feb 7 2017, 15:14) Спасиб...   Feb 7 2017, 08:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 14:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01363 секунд с 7
ELECTRONIX ©2004-2016