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

 
 
> 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
сообщение Feb 6 2017, 19:18
Сообщение #2


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

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



Удалось-таки победить. Вот что вышло:

Это обработчик прерывания для среды IAR:
CODE
extern "C" void PendSV_Handler()
{
#if (defined __ARM_ARCH_6M__) // Cortex-M0(+)/Cortex-M1
asm volatile (
" CPSID I \n" // Prevent interruption during context switch
" MRS R0, PSP \n" // Load process stack pointer to R0
" SUBS R0, R0, #32 \n" // Adjust R0 to point to top of saved context in stack
" MOV R1, R0 \n" // Preserve R0
" MOV R2, R0 \n" // Preserve R0 (needed for os_context_switch_hook() call)
" STMIA R1!, {R4-R7} \n" // Save low portion of remaining registers (r4-7) on process stack
" MOV R4, R8 \n" // Move high portion of remaining registers (r8-11) to low registers
" MOV R5, R9 \n"
" MOV R6, R10 \n"
" MOV R7, R11 \n"
" STMIA R1!, {R4-R7} \n" // Save high portion of remaining registers (r8-11) on process stack
: :
);
asm volatile (
// At this point, entire context of process has been saved
" PUSH {LR} \n" // we must save LR (exc_return value) until exception return
" MOV R1, %0 \n" // load os_context_switch_hook() address;
" MOV R0, R2 \n" // Restore R0 (needed for os_context_switch_hook() call)
" BLX R1 \n" // call os_context_switch_hook();
// R0 is new process SP;
" ADDS R0, R0, #16 \n" // Adjust R0 to point to high registers (r8-11)
" LDMIA R0!, {R4-R7} \n" // Restore r8-11 from new process stack
" MOV R8, R4 \n" // Move restored values to high registers (r8-11)
" MOV R9, R5 \n"
" MOV R10, R6 \n"
" MOV R11, R7 \n"
" MSR PSP, R0 \n" // R0 at this point is new process SP
" SUBs R0, R0, #32 \n" // Adjust R0 to point to low registers
" LDMIA R0!, {R4-R7} \n" // Restore r4-7
" CPSIE I \n"
" POP {PC} \n" // Return to saved exc_return. Exception return will restore remaining context
: : "r" (os_context_switch_hook)
);
#else // #if (defined __ARM_ARCH_6M__)

#if (defined __SOFTFP__)
// M3/M4 cores without FPU
asm volatile (
" CPSID I \n" // Prevent interruption during context switch
" MRS R0, PSP \n" // PSP is process stack pointer
" STMDB R0!, {R4-R11} \n" // Save remaining regs r4-11 on process stack

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

// R0 is new process SP;
" LDMIA R0!, {R4-R11} \n" // Restore r4-11 from new process stack
" MSR PSP, R0 \n" // Load PSP with new process SP
" CPSIE I \n"
" POP {PC} \n" // Return to saved exc_return. Exception return will restore remaining context
: :
);

#else // #if (defined __SOFTFP__)
// Core with FPU (cortex-M4F)
asm volatile (
" CPSID I \n" // Prevent interruption during context switch
" MRS R0, PSP \n" // PSP is process stack pointer
" TST LR, #0x10 \n" // exc_return[4]=0? (it means that current process
" IT EQ \n" // has active floating point context)
" VSTMDBEQ R0!, {S16-S31} \n" // if so - save it.
" STMDB R0!, {R4-R11, LR} \n" // save remaining regs r4-11 and LR on process stack

// At this point, entire context of process has been saved
" LDR R1, =os_context_switch_hook \n" // call os_context_switch_hook();
" BLX R1 \n"

// R0 is new process SP;
" LDMIA R0!, {R4-R11, LR} \n" // Restore r4-11 and LR from new process stack
" TST LR, #0x10 \n" // exc_return[4]=0? (it means that new process
" IT EQ \n" // has active floating point context)
" VLDMIAEQ R0!, {S16-S31} \n" // if so - restore it.
" MSR PSP, R0 \n" // Load PSP with new process SP
" CPSIE I \n"
" BX LR \n" // Return to saved exc_return. Exception return will restore remaining context
: :
);
#endif // #if (defined __SOFTFP__)
#endif // #if (defined __ARM_ARCH_6M__)
}


А это функция старта оси, также для среды IAR:
CODE
extern "C" NORETURN void os_start(stack_item_t *sp)
{
// Set PendSV lowest priority value
#if (defined SHP3_WORD_ACCESS)
SHPR3 |= (0xFF << 16);
#else
PendSvPriority = 0xFF;
#endif

#if (!defined __SOFTFP__)
FPCCR |= ASPEN | LSPEN;
#endif

asm volatile (
#if (defined __SOFTFP__) // code without FPU
" LDR R4, [%[stack], #(4 * 14)] \n" // Load process entry point into R4
" ADDS %[stack], #(4 * 16) \n" // emulate context restore
#else
" LDR R4, [%[stack], #(4 * 15)] \n" // Load process entry point into R4
" ADD %[stack], #(4 * 17) \n" // emulate context restore
#endif
" MSR PSP, %[stack] \n" // store process SP to PSP
" MOVS R0, #2 \n" // set up the current (thread) mode: use PSP as stack pointer, privileged level
" MSR CONTROL, R0 \n"
" ISB \n" // Insert a barrier
: [stack]"+r" (sp) // output
);
asm volatile (
" MOV R1, %0 \n" // Init and run system timer
" BLX R1 \n" //
" CPSIE I \n" // Enable interrupts at processor level
" BX R4 \n" // Jump to process exec() function
: :"r" (__init_system_timer) // output
);
}


В результате я перенёс некоторые функции, приведя в соответствие с версией для GCC и избавился от файла os_target_asm.s

Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 7 2017, 07:18
Сообщение #3


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



QUOTE (SergNK @ Feb 7 2017, 02:18) *
Удалось-таки победить. Вот что вышло:

<...>

В результате я перенёс некоторые функции, приведя в соответствие с версией для GCC и избавился от файла os_target_asm.s

Я правильно понимаю, что вы сделали универсальный порт Cortex-M под 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   Простите, не понял сразу. 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   Можно. Я отладил код под 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 Текстовая версия Сейчас: 23rd June 2025 - 00:53
Рейтинг@Mail.ru


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