|
楼主 |
发表于 2009-6-12 13:08:36
|
显示全部楼层
更新一下:20090612
简化移植。
移植只需要重写两个函数CTX_Init和CTX_Swap(另外还有临界段)。
IAREWAVR:
#include "VT.h"
#if STACK_DOUL!=1
#error "STACK_DOUL must be 1 in avriar"
#endif
//上下文初始化,IAR是双堆栈,GCC是单堆栈
void CTX_Init(TContext **ppContext,TTaskProc *TaskCode,void *Stack1,void *Stack2)
{
ctx_sp_t *ctx_sp;
ctx_y_t *ctx_y;
ctx_y=(ctx_y_t *)((char *)Stack1) - 1;
ctx_sp=(ctx_sp_t *)Stack2 - 1;
ctx_sp->_pcl = (uint16)TaskCode%256;
ctx_sp->_pch = (uint16)TaskCode/256;
ctx_y->_spl = (uint16)ctx_sp%256;
ctx_y->_sph = (uint16)ctx_sp/256;
//ctx_y->_sreg = 0x00;
ctx_y->_r27 = 0x27;
ctx_y->_r26 = 0x26;
ctx_y->_r25 = 0x25;
ctx_y->_r24 = 0x24;
ctx_y->_r15 = 0x15;
ctx_y->_r14 = 0x14;
ctx_y->_r13 = 0x13;
ctx_y->_r12 = 0x12;
ctx_y->_r11 = 0x11;
ctx_y->_r10 = 0x10;
ctx_y->_r9 = 0x9;
ctx_y->_r8 = 0x8;
ctx_y->_r7 = 0x7;
ctx_y->_r6 = 0x6;
ctx_y->_r5 = 0x5;
ctx_y->_r4 = 0x4;
CRITICAL()
{
*ppContext=ctx_y;
}
}
//寄存器分为 "草稿寄存器“和 "存储寄存器" --------个人叫法
//外部函数可以任意使用草稿寄存器而不必恢复,而使用存储寄存器必须先保护
//AVRIAR
//草稿寄存器 R0-R3,R16-R23,R30-R31
//存储寄存器 R4-15,R24-R27
//特殊寄存器 R28-R29
//AVRGCC
//草稿寄存器 R18-R27,R30-R31
//存储寄存器 R2-R17,R28-R29
//特殊寄存器 R0-R1
//上下文切换只保护存储寄存器寄存器,sp
#define SAVE_CONTEXT() \
do{ \
asm ("ST -Y, R4 "); \
asm ("ST -Y, R5 "); \
asm ("ST -Y, R6 "); \
asm ("ST -Y, R7 "); \
asm ("ST -Y, R8 "); \
asm ("ST -Y, R9 "); \
asm ("ST -Y, R10 "); \
asm ("ST -Y, R11 "); \
asm ("ST -Y, R12 "); \
asm ("ST -Y, R13 "); \
asm ("ST -Y, R14 "); \
asm ("ST -Y, R15 "); \
asm ("ST -Y, R24 "); \
asm ("ST -Y, R25 "); \
asm ("ST -Y, R26 "); \
asm ("ST -Y, R27 "); \
asm ("in R24, 0x3D "); \
asm ("ST -Y, R24 "); \
asm ("IN R24, 0x3E "); \
asm ("ST -Y, R24 "); \
}while(0)
#define RESTORE_CONTEXT() \
do{ \
asm ("LD R24, Y+ "); \
asm ("OUT 0X3E, R24 "); \
asm ("LD R24, Y+ "); \
asm ("OUT 0X3D, R24 "); \
asm ("LD R27, Y+ "); \
asm ("LD R26, Y+ "); \
asm ("LD R25, Y+ "); \
asm ("LD R24, Y+ "); \
asm ("LD R15, Y+ "); \
asm ("LD R14, Y+ "); \
asm ("LD R13, Y+ "); \
asm ("LD R12, Y+ "); \
asm ("LD R11, Y+ "); \
asm ("LD R10, Y+ "); \
asm ("LD R9, Y+ "); \
asm ("LD R8, Y+ "); \
asm ("LD R7, Y+ "); \
asm ("LD R6, Y+ "); \
asm ("LD R5, Y+ "); \
asm ("LD R4, Y+ "); \
}while(0)
// R16:R17 R18:R19
void CTX_Swap(TContext **ppContext1,TContext **ppContext2)
{
SAVE_CONTEXT();
asm ("movw r30,r16"); //Z=ppContext1
asm ("st z+, r28"); //*ppContext1=Y
asm ("st z, r29");
asm ("movw r30,r18"); //Z=ppContext2
asm ("ld r28, z+"); //Y=*ppContext2
asm ("ld r29, z");
RESTORE_CONTEXT();
asm ("ret");
}
点击此处下载 ourdev_452919.rar(文件大小:200K) (原文件名:VoidTask.7z.rar) |
|