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

 
 
> 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 23 2017, 19:31
Сообщение #2


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

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



Простите, не понял сразу.

CODE
PendSV_Handler

#if defined __ARM_ARCH_6M__ // Cortex-M0(+)/Cortex-M1
CPSID I // Prevent interruption during context switch
MRS R0, PSP // Load process stack pointer to R0
SUBS R0, R0, #32 // Adjust R0 to point to top of saved context in stack
MOV R1, R0 // Preserve R0 (needed for os_context_switch_hook() call)
STMIA R1!, {R4-R7} // Save low portion of remaining registers (r4-7) on process stack
MOV R4, R8 // Move high portion of remaining registers (r8-11) to low registers
MOV R5, R9
MOV R6, R10
MOV R7, R11
STMIA R1!, {R4-R7} // Save high portion of remaining registers (r8-11) on process stack

// At this point, entire context of process has been saved
PUSH {LR} // we must save LR (exc_return value) until exception return
LDR R1, =os_context_switch_hook // call os_context_switch_hook();
BLX R1

// R0 is new process SP;
ADDS R0, R0, #16 // Adjust R0 to point to high registers (r8-11)
LDMIA R0!, {R4-R7} // Restore r8-11 from new process stack
MOV R8, R4 // Move restored values to high registers (r8-11)
MOV R9, R5
MOV R10, R6
MOV R11, R7
MSR PSP, R0 // R0 at this point is new process SP
SUBS R0, R0, #32 // Adjust R0 to point to low registers
LDMIA R0!, {R4-R7} // Restore r4-7
CPSIE I
POP {PC} // Return to saved exc_return. Exception return will restore remaining context

#else


Если есть необходимость, могу загрузить проект. Но Вы под IAR-ом не работаете.

Для визуального контроля границ стеков процессов добавил в функцию TBaseProcess::init_stack_frame возможность записи заголовков в формате "ProcXX".
Хорошо видно тогда в дампе памяти дно стека. Если затёрт заголовок полностью - хана, стек закончился!

А выглядит это так:


или вот так:


Код функции:
CODE
//------------------------------------------------------------------------------
void TBaseProcess::init_stack_frame( stack_item_t * Stack
, void (*exec)()
#if scmRTOS_DEBUG_ENABLE == 1
, stack_item_t * StackBegin
#endif
)
{
// ARM Architecture Procedure Call Standard [AAPCS] requires 8-byte stack alignment:
StackPointer = (stack_item_t*)((uintptr_t)Stack & 0xFFFFFFF8);
// Prepare Process Stack Frame.
*(--StackPointer) = 0x01000000UL; // xPSR
*(--StackPointer) = reinterpret_cast<uint32_t>(exec); // Entry Point
StackPointer -= 14; // emulate "push R14,R12,R3,R2,R1,R0,R11-R4"

#if scmRTOS_DEBUG_ENABLE == 1
for (stack_item_t* pDst = StackBegin; pDst < StackPointer; ++pDst)
*pDst = STACK_DEFAULT_PATTERN;
stack_item_t* pDst = StackBegin;
*pDst++ = 0x636f7250;
int a = this->priority()& 0x0000003F;
if (a == prIDLE)
{
*pDst = 0x454c4449;
return;
}
#if scmRTOS_PRIORITY_ORDER > 0
a = scmRTOS_PROCESS_COUNT - a;
#endif
int b = 48;
while (a>10)
{
b++;
a -= 10;
}
b += (a+48)<<8;
*pDst = b;
#endif // scmRTOS_DEBUG_ENABLE
}


Эту фичу можно включить с помощью макроса scmRTOS_DEBUG_ENABLE
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 23 2017, 20:03
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



С обработчиком порядок, он один-в-один как в порте GCC. Ещё посмотрите приоритеты прерываний. Прерывание PendSV должно иметь минимальный приоритет.
На всякий случай, если есть возможность, попробуйте собрать проект другой версией IAR, или поменять уровень оптимизации.
Больше пока ничего в голову не приходит.


--------------------
Если бы я знал, что такое электричество...
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   Доброго дня! Решил поднять тему вот таким воп...   Jan 18 2017, 11:23
|- - Сергей Борщ   QUOTE (SergNK @ Jan 18 2017, 13:23) Вылет...   Jan 18 2017, 12:04
- - 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   Вот приоритеты: 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 Текстовая версия Сейчас: 24th June 2025 - 21:28
Рейтинг@Mail.ru


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