Цитата(Сергей Борщ @ Mar 20 2007, 21:52)

Код
#define CONTEXT_SWITCH_INT VIC_SW
#define RaiseContextSwitch() \
do \
{ \
VICSoftInt = (1<<CONTEXT_SWITCH_INT); \
VICIntEnable = (1<<CONTEXT_SWITCH_INT); \
} \
while (0) // set flag and enable interrupt
#endif
Оно?
Вы путаетесь в понятиях. Вам нужно переключить режим процессора из Supervisor в System. Как это сделать - трудно посоветовать, не зная каким компилятором вы пользуетесь. При этом можно одновременно разрешить прерывания.
В IAR это примерно так и реализовано. Ветвление по номеру swi компилятор выполняет сам. Ищите в описании компилятора по ключевому слову swiю
(Из супервизора НАДО выйти, но непрекращая __swi). - это просто неправильная фраза, никто никуда сейчас не выходит - мы еще работаем. Извините.
/работаю с Keil uVision3 V3.20a с родным комполятором/
Надо испытать под ARTX:
/ARTX config/ (кусок)
/*--------------------------- os_switch_tasks -------------------------------*/
void os_switch_tasks (P_TCB p_new) __swi (0) {
/* Switch to next task (identified by "p_new"). Saving old and restoring */
/* new context is written in assembly (module: Swi_ARTX.s) */
/////// тут что-то типа:
t_Command=os_tsk_create(Command,0); //что-то нужное
///////
os_runtask->full_ctx = FALSE;
os_runtask = p_new;
p_new->state = RUNNING;
#if (OS_ROBIN == 1)
os_tsk_robin = p_new;
#endif
/* Tsk_Unlock */
OS_UNLOCK();
} /* end of os_switch_tasks */
//то самое нужное
void Command(void) __task
{
.... //какой - то код
}
при этом не трогать никакие переключения режимов ядра.
и про разрешение прерывания забыь?
сработает?
А как бы красиво оформить обратную ситуацию - в прерывании возникает необходимость запустить при выходе из прерывания "фоновую задачу"? -вы наверное это имели ввиду?
Извините если что не так! с уважением PARAMON!