最好是hunter0773解释一下,其他人明白也欢迎拍砖,miRTOS人工堆栈入栈出栈的指令呢
主程序是: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"
voidStartTaskRunning(INT8U *);
voidOS_Scheduler(void);
#endif/* _OS_ASM_ */
所以我判断是调用了os_asm.s90 或 os_asm.r90 文件里面的汇编指令来实现入栈出栈的。
--------------------------------------------------------------------------------
请教一下这个指令在GCC下好象可以这样“SP=pStack;”来实现,在 IAR 里难道没有这样的指令吗?我试过了,告诉我类型不匹配。强制转换了可以,但是可能有后患。
或者hunter0773 说说你用汇编怎么实现的,用汇编的可能是比用C 做的速度快吧。不然用起来咪咪忽忽的。(见笑了,本人水平低,不对的多多拍砖哦。)
-----此内容被goblin于2006-05-22,10:09:09编辑过 不懂
不过你发那么容易被删的 我也不懂, 不过我一看整个屏幕是同一个问题, 就知道其实不是什么问题. 也没有听过写程序就象坐火车, 原来也要进站出站 晕倒! 还想着会怎么拍砖呢,拍的够歪的啊你。呵呵呵呵,我马上修改回来吧。 没有用过miRTOS, 无法给你准确的答案
如果GCC里可以SP=pStack的话, 那么IAR里也是可以的. 判断的方法: pStack的值是什么, 如果确实是栈指针, 那么就应该是这样子的.
也欢迎拍砖. 等待高人解释。。。ing
页:
[1]