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

 
 
> Помогите! Не работают OS*Post из прерываний
vitek101
сообщение Aug 25 2009, 11:09
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013



Пишу для XMega128, IAR 5.20. Не работают вызовы OSMboxPost, OSSemPost и OSQPost из обработчика прерывания. Между задачами вызовы работают прекрасно, сами прерывания тоже работают (диоды моргают, байты в UART бегают). Что делать ума не приложу 07.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Vladimir_T
сообщение Aug 25 2009, 16:25
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Непосредственно из прерывания сервисы ОС вызывать нельзя. Можно находясь в прерывании вызвать вспомогательную функцию в которой и устанавливается, например, семафор:
OSSemPost (Sem_LCD); // установить семафор для прорисовки дисплея
В отладчике можно проследить за переменной-семафором.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Aug 26 2009, 08:08
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(Vladimir_T @ Aug 25 2009, 20:25) *
Непосредственно из прерывания сервисы ОС вызывать нельзя.

Почему?

Цитата
Можно находясь в прерывании вызвать вспомогательную функцию в которой и устанавливается, например, семафор:

Чем прямой вызов OSSemPost будет принципиально отличаться от его вызова через промежуточную функцию?


Цитата(vitek101 @ Aug 26 2009, 08:42) *
Сейчас попробовал - не работает. Смотрю в отладчике, при вызове OSSemPost параметр pevent равен нулю и в жирном месте процедура вылетает. Если вызываю из задачи, то все нормально. Сам этот параметр при вызове располагается в регистрах R24-R25. Не может система при вызове прерывания как-нибудь кривить их? 05.gif

По моему у вас проблемы не с ОС, а с Си. Код покажите. Как вы семафор объявляете, как инициализируете. Вы уверены, что он успевает инициализироваться до первого прерывания?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
vitek101
сообщение Aug 26 2009, 09:42
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 24-08-09
Пользователь №: 52 013



По моему у вас проблемы не с ОС, а с Си. Код покажите. Как вы семафор объявляете, как инициализируете. Вы уверены, что он успевает инициализироваться до первого прерывания?
[/quote]

Я думаю успевает, т.к. прерывание от УАРТа, а оно происходит по нажатию клавиши на клавиатуре (ну если конечно ему не 5 минут на инициализацию надо).
Вот код. В BSP_Init настраиваю УАРТ, разрешаю его прерывания, настраиваю таймер и порт для светодиода. Задача просто ждет семафора и моргает диодом (должна моргать, но не моргает huh.gif ). Приоритет задачи 5, таймера 63.

#define APP_CFG_TASK1_STK_SIZE 360

static void App_Task1 (void *p_arg);

static OS_STK App_Task1Stk[APP_CFG_TASK1_STK_SIZE];

static OS_EVENT *App_Sem;

void main (void)
{
BSP_IntDisAll(); /* Disable all interrupts until we are ready to accept them */
/* IMPORTANT: MUST be setup before calling 'OSInit()' */
OSTaskStkSize = OS_TASK_IDLE_STK_SIZE; /* Setup the default stack size */
OSTaskStkSizeHard = OS_TASK_STK_SIZE_HARD; /* Setup the default hardware stack size */

OSInit(); /* Initialize "uC/OS-II, The Real-Time Kernel" */

BSP_Init(); /* Initialize the BSP */

App_TaskCreate(); /* Create the application tasks */
App_EventCreate(); /* Create the application events */

OSStart(); /* Start multitasking (i.e. give control to uC/OS-II) */
}

static void App_TaskCreate (void)
{
#if (OS_TASK_NAME_SIZE > 13)
CPU_INT08U os_err;
#endif

OSTaskCreateExt((void (*)(void *)) App_Task1,
(void *) 0,
(OS_STK *)&App_Task1Stk[APP_CFG_TASK1_STK_SIZE - 1],
(INT8U ) APP_CFG_TASK1_PRIO,
(INT16U ) APP_CFG_TASK1_PRIO,
(OS_STK *)&App_Task1Stk[0],
(INT32U ) APP_CFG_TASK1_STK_SIZE,
(void *) 0,
(INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
#if (OS_TASK_NAME_SIZE > 13)
OSTaskNameSet(APP_CFG_TASK1_PRIO, "Task1", &os_err);
#endif
}

static void App_EventCreate (void)
{
CPU_INT08U os_err;

App_Sem = OSSemCreate(1);


#if (OS_EVENT_NAME_SIZE > 8)
OSEventNameSet(App_Sem, "Semafor", &os_err);
#else
void(os_err);
#endif

}


static void App_Task1 (void *p_arg)
{
(void)p_arg;

while (DEF_TRUE) {
OSSemPend(App_Sem);

BSP_LED_Toggle(1);
}
}



Может у кого есть рабочий проект хотя бы для ATmega128. Если не жалко поделитесь. help.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 07:29
Рейтинг@Mail.ru


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