|
|
  |
Начало работы with scmRTOS, Несколько вопросиков |
|
|
|
Nov 11 2012, 22:21
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(ReAl @ Nov 11 2012, 23:53)  Или делать переключение свободным отложенным прерыванием. Тогда из всех тех прерыываний вышли, все уровни очистили и только потом пойдёт прерывание переключения, кторое тоже за собой почистит. Ой! Что-то мне начинает казаться, что для AVR (порт MEGA, на XMEGA я так толком и не смотрел) как раз в переключении прерыванием могут быть неприятности, там ситуация зеркальная. Тут reti не влияет на бит глобального разрешения EA, но приоритеты обслуживаются аппаратно и очищаются reti Там вход в прерывание выключает, а reti включает прерывания. Но при синхронном переключении (те же .wait() или там .push()) в недрах вызова ОС могла быть критическая секция и восстановить надо бы состояние запрещённых прерываний, как выше писано. Что-то я сейчас уже сонный, а с понедельника не до того. Забил гвоздик в scmRTOS-блокнотике tomboy, но вот не забыть бы туда заглянуть.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 14 2012, 13:45
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
порт AVR scmRTOS_TARGET_CFG.h Код namespace OS { #if scmRTOS_CONTEXT_SWITCH_SCHEME == 0 #pragma vector=SYSTEM_TIMER_VECTOR OS_INTERRUPT void OS_SystemTimer_ISR(); #else #pragma vector=SYSTEM_TIMER_VECTOR __interrupt void SystemTimer_ISR(); #endif // scmRTOS_CONTEXT_SWITCH_SCHEME } Если scmRTOS_CONTEXT_SWITCH_SCHEME =1 , то пользователю нужно в обязательном порядке писать обработчик системного таймера.
Сообщение отредактировал a9d - Nov 14 2012, 13:47
|
|
|
|
|
Nov 14 2012, 19:10
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(a9d @ Nov 14 2012, 15:45)  порт AVR scmRTOS_TARGET_CFG.h Ффухх, я уже за порт испугался. Спасибо, подправлю как-нибудь те недочистки. Только не «порт AVR», а « примеры к порту AVR/ IAR». В AVR/GCC вообще всё в порядке и в порту и в примерах, а в AVR/IAR порт в порядке, а в примерах недочищено. Цитата(a9d @ Nov 14 2012, 15:45)  Если scmRTOS_CONTEXT_SWITCH_SCHEME =1 , то пользователю нужно в обязательном порядке писать обработчик системного таймера. Не нужно. Посмотрите примеры 2 и 3, они в репозитории лежат с scmRTOS_CONTEXT_SWITCH_SCHEME 1 и они так прекрасно собираются. Сборка проверялась и с 0, и с 1, только для scmRTOS_CONTEXT_SWITCH_SCHEME 0 ещё нужно scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE 0 В OS_Target_cpp.cpp лежит самодостаточный обработчик, который подключается и работает при любых настройках scmRTOS, так как не охвачен никакими условиями. Код //------------------------------------------------------------------------------ #pragma vector=SYSTEM_TIMER_VECTOR OS_INTERRUPT void OS_SystemTimer_ISR() { scmRTOS_ISRW_TYPE ISR;
#if scmRTOS_SYSTIMER_HOOK_ENABLE == 1 system_timer_user_hook(); #endif
Kernel.system_timer();
#if scmRTOS_SYSTIMER_NEST_INTS_ENABLE == 1 ENABLE_NESTED_INTERRUPTS(); #endif
} и те предварительные объявления на данный момент никому не нужны и никому не мешают. Вот только что на всякий случай проверил -- в виртуалке стоит EWB 5.51, пересобрал все примеры.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 23 2012, 09:11
|
Местный
  
Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532

|
из документации Цитата адрес указателя стека текущего процесса, куда будет помещен сам указатель по окончании сохранения контекста текущего процесса. Зачем при прямой передаче управления обновлять указатель стека? Ведь мы можем просто знать, что контекст всегда храниться в начале стека процесса. Передача с программным прерывание лучше, потому-что при входе в прерывание компилятор не сохранит/воcстановит локальный контекс ?
Сообщение отредактировал a9d - Nov 23 2012, 15:57
|
|
|
|
|
Feb 18 2013, 07:06
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
всем добрый день! подскажите пожалуйста можно ли принудительно вызвать деструктор TCritSect не дожидаясь конца блока, когда это сделает компилятор? и если да, то как это организовать?
|
|
|
|
|
Feb 18 2013, 08:42
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(Сергей Борщ @ Feb 18 2013, 12:18)  Возможно стоит вынести кусок кода в отдельную функцию, по return будет вызван деструктор. как начал, так и бросил! только граблей понавтыкаю. я использую стм-овский драйвер SD карты. сейчас пробую руками запрещать/разрешать прерывания. пока успеха не добился. возможно и придётся переписать их драйвер под ОС.
|
|
|
|
|
Feb 19 2013, 12:33
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(IgorKossak @ Feb 18 2013, 22:18)  Или обрамить блоком нужный кусок и в начале этого блока объявить TCritSect cs. спасибо. как раз в тему.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|