|
主程序是:
void main(void)
{
PORTC = 0x07;
DDRC = 0x07;
PORTD = 0xFC;
DDRD = 0xFC;
PORTB = 0xFF;
DDRB = 0xFF;
Uart_Init();
OS_Init();
OS_CreateTask(TASK0,TASK0_STACK+TASK_STACK_LEN_Medium,0);
OS_CreateTask(TASK1,TASK1_STACK+TASK_STACK_LEN_Medium,1);
OS_CreateTask(TASK2,TASK2_STACK+TASK_STACK_LEN_Medium,2);
OS_CreateTask(TASK3,TASK3_STACK+TASK_STACK_LEN_Medium,3);
OS_CreateTask(TASK4,TASK4_STACK+TASK_STACK_LEN_Medium,4);
OS_CreateTask(TASK5,TASK5_STACK+TASK_STACK_LEN_Medium,5);
OS_CreateTask(TASK6,TASK6_STACK+TASK_STACK_LEN_Large,6);
OS_Start();
}
---------------------------------------------------------------------------
那么开始操作应该是:OS_Start(); 这个!
这个函数是这样的:
void OS_Start(void)
{
__enable_interrupt();
StartTaskRunning(Current_TCB->Stack);
}
---------------------------------------------------------------------------
那么引出了StartTaskRunning(Current_TCB->Stack); 这个函数!
---------------------------------------------------------------------------
这个函数在 os_asm.h 里这样定义的:
#ifndef _OS_ASM_
#define _OS_ASM_
#include "userdef.h"
void StartTaskRunning(INT8U *);
void OS_Scheduler(void);
#endif /* _OS_ASM_ */
所以我判断是调用了 os_asm.s90 或 os_asm.r90 文件里面的汇编指令来实现入栈出栈的。
--------------------------------------------------------------------------------
请教一下这个指令在GCC下好象可以这样 “SP=pStack;”来实现,在 IAR 里难道没有这样的指令吗?我试过了,告诉我类型不匹配。强制转换了可以,但是可能有后患。
或者hunter0773 说说你用汇编怎么实现的,用汇编的可能是比用C 做的速度快吧。不然用起来咪咪忽忽的。(见笑了,本人水平低,不对的多多拍砖哦。)
-----此内容被goblin于2006-05-22,10:09:09编辑过 |
|