Para finalizar, uma breve discussão sobre a inicialização do sistema, através da função main(), listada a seguir:
int main(void)
{ /* Saving the current stack pointer. It will be used by the scheduler. */
SaveSchedStackPointer();
EnterCriticalSection();
/* initialize control structures and create all user tasks */
BRTOS_Initialize();
/* call user initialization: you must create at least one thread */
BRTOS_Application_Initialize();
/* the stack pointer should point to the first available task stack,
and the context should be subtracted. This way, the calling of
GoToScheduler will not fail
*/
asBrtosTasks[ucCurrentTask].pusStackPtr += NUM_REGS_IN_CONTEXT;
RestoreStackPointer();
LeaveCriticalSection();
/* go to to scheduler routine*/
GoToScheduler();
}
Várias tarefas são esperadas e não requerem explicações. Percebam que o escalonador vai compartilhar a pilha desta função, já que o SP dele é salvo a partir dela. O que tem de estranho aqui é a manipulação feita no ponteiro da pilha da tarefa corrente e no SP. No fundo, estamos recriando a situação de pilha que acontece no caso de uma interrupção, por isso removemos os registros de R3 a R15, restauramos o SP da tarefa e realizamos um salto para o escalonador, como se esta fosse realmente a tarefa corrente. Depois deste ponto, o processamento segue normalmente.
Os pontos de entrada dentro do escalonador (save_context_entry e dont_save_context_entry) foram inicialmente criados para permitir entrada no escalonador com ou sem salvamento de contexto mas no final eu optei por entrar da forma explicada, mesmo que perdendo algum tempo fazendo e desfazendo a pilha.
Bom, este post encerra esta série. Eu aprendi muito fazendo este sistema em 2005 e ele está longe de ser perfeito ou de ser qualquer referência absoluta no assunto mas ele deixa claro os problemas que enfrentamos ao construir um RTOS.
Espero que tenham gostado.!
#1 by jeroavf on agosto 11, 2010 - 4:08 am
Muito bom Marcelo. A serie e a disponibilidade do codigo vão despertar o interesse de muitas pessoas em sistemas operacionais. Por que “faço voce mesmo” ?
Jeronimo
http://www.blogdoje.com.br
#2 by jedizone on agosto 11, 2010 - 12:22 pm
Erro de digitação só visto depois do último post por um amigo … troquei o título mas não os links, que vão continuar errados.