Ответ: Вот!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено ДМ 13 апреля 2004 г. 19:17
В ответ на: В смысле исходный текст программы. отправлено Сидоргек 13 апреля 2004 г. 18:13

Вызов функции:
OS_Task_Create( tsk_Diagnostic, &Diagnostic );

фрагмент заголовочного файла:

#pragma used+
void OS_Task_Create(char Task_Nr, int Adr);
void OS_Manager(void);
#pragma used-
#pragma library task_mng.lib

Фрагмент файла task_mng.lib

#if funcused OS_Task_Create
void OS_Task_Create(char Task_Nr, int Adr)
{
#asm
ldd r0, Y+2; load Task_Nr
ldi zl, size_Task_cont
mul zl, r0; Task_Nr * size_Task_cont
SetPtr_s Z, Task_context
ADDWRR zl, zh, r0, r1
ldi xl, 1<< I; primordialy interrupt should be endbled
std z + SRcon, xl
movw xh:xl, zh:zl

; Store value for SP
adiw xl, CS_SS + size_Hard_stack - 4
std z + SPLcn, xl
std z + SPHcn, xh

; Store value for Y
adiw xl, size_Soft_stack + 5
std z + YLcon, xl
std z + YHcon, xh

; Store value for Task return address
ldd xh, Y+1;
ldd xl, Y+0;
std z + CS_SS + size_Hard_stack - 2, xl
std z + CS_SS + size_Hard_stack - 3, xh

; Store value for Kernel return address
ldi xh, high(kernel_ret);
ldi xl, low(kernel_ret);
std z + CS_SS + size_Hard_stack - 0, xl
std z + CS_SS + size_Hard_stack - 1, xh
#endasm
}
#endif

#if funcused OS_Manager
void OS_Manager(void)
{
char dummy;
#asm("pop r16")
#asm("pop r16")
if ( from_Kernel )
{
#asm("pop r16")
#asm("pop r16")
#asm("ldi r16, low(TM_beg)")
#asm("push r16")
#asm("ldi r16, high(TM_beg)")
#asm("push r16")
}
else
{
#asm("ldi r16, low(_OS_Dispatcher)")
#asm("push r16")
#asm("ldi r16, high(_OS_Dispatcher)")
#asm("push r16")
}
}
#endif

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru