ARM移植.docx
- 文档编号:26102033
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:21
- 大小:19.05KB
ARM移植.docx
《ARM移植.docx》由会员分享,可在线阅读,更多相关《ARM移植.docx(21页珍藏版)》请在冰豆网上搜索。
ARM移植
;**文件名:
os_cpu_s.s
;**描述:
μCOS-II在LPC210x上的移植代码汇编代码部分,用ADS1.2编译
**********************************************/
;定义系统模式堆栈的大小
SVC_STACK_LEGTHEQU32
NoIntEQU0x80
USR32ModeEQU0x10
SVC32ModeEQU0x13
SYS32ModeEQU0x1f
IRQ32ModeEQU0x12
FIQ32ModeEQU0x11
;T_bit用于检测进入异常前cpu是否处于THUMB状态
T_bitEQU0x20
CODE32
PRESERVE8
AREA|subr|,CODE,READONLY
IMPORTOSTCBCur;指向当前任务TCB的指针
IMPORTOSTCBHighRdy;指向将要运行的任务TCB的指针
IMPORTOSPrioCur;当前任务的优先级
IMPORTOSPrioHighRdy;将要运行的任务的优先级
IMPORTOSTaskSwHook;任务切换的钩子函数
IMPORTOSRunning;uC/OS-II运行标志
IMPORTOsEnterSum;关中断计数器(关中断信号量)
IMPORTSWI_Exception;软中断异常处理程序
EXPORT__OSStartHighRdy
EXPORTOSIntCtxSw;中断退出时的入口,参见startup.s中的IRQ_Handler
EXPORTSoftwareInterrupt;软中断入口
;/*********************************************************************************************************
;**函数名称:
SoftwareInterrupt
;**功能描述:
软件中断,用于提供一些系统服务,功能参考os_cpu_c.c文件
;**输 入:
依功能而定
;**输 出:
依功能而定
;**全局变量:
无
;**调用模块:
SWI_Exception
**************************/
;软件中断
SoftwareInterrupt
LDRSP,StackSvc;重新设置堆栈指针
STMFDSP!
{R0-R3,R12,LR}
MOVR1,SP;R1指向参数存储位置
MRSR3,SPSR
TSTR3,#T_bit;中断前是否是Thumb状态
LDRNEHR0,[LR,#-2];是:
取得Thumb状态SWI号
BICNER0,R0,#0xff00
LDREQR0,[LR,#-4];否:
取得arm状态SWI号
BICEQR0,R0,#0xFF000000
;r0=SWI号,R1指向参数存储位置
CMPR0,#1
LDRLOPC,=OSIntCtxSw
LDREQPC,=__OSStartHighRdy;SWI0x01为第一次任务切换
BLSWI_Exception
LDMFDSP!
{R0-R3,R12,PC}^
StackSvcDCD(SvcStackSpace+SVC_STACK_LEGTH*4-4)
;/*********************************************************************************************************
;**函数名称:
OSIntCtxSw
;**功能描述:
中断退出时的入口
;**输 入:
R3:
当前任务的状态寄存器CPSR(即SPSR的值)
;**R4-R12:
当前任务的R4-R11
;**当前处理器模式的堆栈结构(出栈次序):
R0-R3、R12、PC(当前任务的)
;**输 出:
无
;**全局变量:
OSPrioCur,OSPrioHighRdy,OSPrioCur,OSPrioHighRdy
;**调用模块:
无
;********************************************************************************************************/
OSIntCtxSw
;下面为保存任务环境
LDRR2,[SP,#20];获取PC
LDRR12,[SP,#16];获取R12
MRSR0,CPSR
MSRCPSR_c,#(NoInt|SYS32Mode)
MOVR1,LR
STMFDSP!
{R1-R2};保存LR,PC
STMFDSP!
{R4-R12};保存R4-R12
MSRCPSR_c,R0
LDMFDSP!
{R4-R7};获取R0-R3
ADDSP,SP,#8;出栈R12,PC
MSRCPSR_c,#(NoInt|SYS32Mode)
STMFDSP!
{R4-R7};保存R0-R3
LDRR1,=OsEnterSum;获取OsEnterSum
LDRR2,[R1]
STMFDSP!
{R2,R3};保存CPSR,OsEnterSum
;保存当前任务堆栈指针到当前任务的TCB
LDRR1,=OSTCBCur
LDRR1,[R1]
STRSP,[R1]
BLOSTaskSwHook;调用钩子函数
;OSPrioCur<=OSPrioHighRdy
LDRR4,=OSPrioCur
LDRR5,=OSPrioHighRdy
LDRBR6,[R5]
STRBR6,[R4]
;OSTCBCur<=OSTCBHighRdy
LDRR6,=OSTCBHighRdy
LDRR6,[R6]
LDRR4,=OSTCBCur
STRR6,[R4]
OSIntCtxSw_1
;获取新任务堆栈指针
LDRR4,[R6]
ADDSP,R4,#68;17寄存器CPSR,OsEnterSum,R0-R12,LR,SP
LDRLR,[SP,#-8]
MSRCPSR_c,#(NoInt|SVC32Mode);进入管理模式
MOVSP,R4;设置堆栈指针
LDMFDSP!
{R4,R5};CPSR,OsEnterSum
;恢复新任务的OsEnterSum
LDRR3,=OsEnterSum
STRR4,[R3]
MSRSPSR_cxsf,R5;恢复CPSR
LDMFDSP!
{R0-R12,LR,PC}^;运行新任务
;/*********************************************************************************************************
;**函数名称:
__OSStartHighRdy
;**功能描述:
uC/OS-II启动时使用OSStartHighRdy运行第一个任务,
;**OSStartHighRdy会调用__OSStartHighRdy
;**输 入:
无
;**输 出:
无
;**全局变量:
OSRunning,OSTCBCur,OSTCBHighRdy,OsEnterSum
;**调用模块:
OSTaskSwHook
;********************************************************************************************************/
__OSStartHighRdy
MSRCPSR_c,#(NoInt|SYS32Mode)
;告诉uC/OS-II自身已经运行
LDRR4,=OSRunning
MOVR5,#1
STRBR5,[R4]
BLOSTaskSwHook;调用钩子函数
LDRR6,=OSTCBHighRdy
LDRR6,[R6]
BOSIntCtxSw_1
AREASWIStacks,DATA,NOINIT,ALIGN=2
SvcStackSpaceSPACESVC_STACK_LEGTH*4;管理模式堆栈空间
END
;/*********************************************************************************************************
;**EndOfFile
;********************************************************************************************************/
**文件名:
os_cpu_c.c
**创建人:
陈明计
**描述:
μCOS-II在lpc210x上的移植代码C语言部分,包括任务堆栈初始化代码和钩子函数等
**用ads1.2编译,必须使用ARM方式编译
**
**描 述:
增加函数IsrEnIRQ,使函数OSTaskStkInit代码更简洁
**描 述:
增加软中断服务函数
**描 述:
去除不必要的函数IsrEnIRQ
********************************************************************************************************/
#defineOS_CPU_GLOBALS
#include"..\APP\config.h"
/*********************************************************************************************************
**函数名称:
OSTaskStkInit
**功能描述:
任务堆栈初始化代码,本函数调用失败会使系统崩溃
**输 入:
task:
任务开始执行的地址
**pdata:
传递给任务的参数
**ptos:
任务的堆栈开始位置
**opt:
附加参数,当前版本对于本函数无用,具体意义参见OSTaskCreateExt()的opt参数
**输 出:
栈顶指针位置
**全局变量:
**调用模块:
********************************************************************************************************/
OS_STK*OSTaskStkInit(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT16Uopt)
{
OS_STK*stk;
opt=opt;/*'opt'没有使用。
作用是避免编译器警告*/
stk=ptos;/*获取堆栈指针*/
/*建立任务环境,ADS1.2使用满递减堆栈*/
*stk=(OS_STK)task;/*pc*/
*--stk=(OS_STK)task;/*lr*/
*--stk=0;/*r12*/
*--stk=0;/*r11*/
*--stk=0;/*r10*/
*--stk=0;/*r9*/
*--stk=0;/*r8*/
*--stk=0;/*r7*/
*--stk=0;/*r6*/
*--stk=0;/*r5*/
*--stk=0;/*r4*/
*--stk=0;/*r3*/
*--stk=0;/*r2*/
*--stk=0;/*r1*/
*--stk=(unsignedint)pdata;/*r0,第一个参数使用R0传递*/
*--stk=(USER_USING_MODE|0x00);/*spsr,允许IRQ,FIQ中断*/
*--stk=0;/*关中断计数器OsEnterSum;*/
return(stk);
}
/*********************************************************************************************************
**函数名称:
SWI_Exception
**功能描述:
软中断异常处理程序,提供一些系统服务
**
**输 入:
SWI_Num:
功能号
**Regs[0]为第一个参数,也是返回值
**Regs[1]为第二个参数
**Regs[2]为第三个参数
**Regs[3]为第四个参数
**输 出:
根据功能而定
**
**全局变量:
无
**调用模块:
无
********************************************************************************************************/
#ifOS_SELF_EN>0
externintconst_OSFunctionAddr[];
externintconst_UsrFunctionAddr[];
#endif
voidSWI_Exception(intSWI_Num,int*Regs)
{
OS_TCB*ptcb;
unsignedinttemp;//以前的keilfor2.5或ADS1.2下,这个是不用这样子定义的
//直接用R0即可,,
switch(SWI_Num)
{
//case0x00:
/*任务切换函数OS_TASK_SW,参考os_cpu_s.s文件*/
//break;
//case0x01:
/*启动任务函数OSStartHighRdy,参考os_cpu_s.s文件*/
//break;
case0x02:
/*关中断函数OS_ENTER_CRITICAL(),参考os_cpu.h文件*/
__asm
{
MRStemp,SPSR
ORRtemp,temp,#NoInt
MSRSPSR_c,temp
}
OsEnterSum++;
break;
case0x03:
/*开中断函数OS_EXIT_CRITICAL(),参考os_cpu.h文件*/
if(--OsEnterSum==0)
{
__asm
{
MRStemp,SPSR
BICtemp,temp,#NoInt
MSRSPSR_c,temp
}
}
break;
#ifOS_SELF_EN>0
case0x40:
/*返回指定系统服务函数的地址*/
/*函数地址存于数组_OSFunctionAddr中*/
/*数组_OSFunctionAddr需要另外定义*/
/*Regs[0]为第一个参数,也是返回值*/
/*Regs[1]为第二个参数*/
/*Regs[2]为第三个参数*/
/*Regs[3]为第四个参数*/
/*仅有一个参数为系统服务函数的索引*/
Regs[0]=_OSFunctionAddr[Regs[0]];
break;
case0x41:
/*返回指定用户的服务函数的地址*/
/*函数地址存于数组_UsrFunctionAddr中*/
/*数组_UsrFunctionAddr需要另外定义*/
/*Regs[0]为第一个参数,也是返回值*/
/*Regs[1]为第二个参数*/
/*Regs[2]为第三个参数*/
/*Regs[3]为第四个参数*/
/*仅有一个参数为用户服务函数的索引*/
Regs[0]=_UsrFunctionAddr[Regs[0]];
break;
case0x42:
/*中断开始处理*/
OSIntNesting++;
break;
case0x43:
/*判断中断是否需要切换*/
if(OSTCBHighRdy==OSTCBCur)
{
Regs[0]=0;
}
else
{
Regs[0]=1;
}
break;
#endif
case0x80:
/*任务切换到系统模式*/
__asm
{
MRStemp,SPSR
BICtemp,temp,#0x1f
ORRtemp,temp,#SYS32Mode
MSRSPSR_c,temp
}
break;
case0x81:
/*任务切换到用户模式*/
__asm
{
MRStemp,SPSR
BICtemp,temp,#0x1f
ORRtemp,temp,#USR32Mode
MSRSPSR_c,temp
}
break;
case0x82:
/*任务是ARM代码*/
if(Regs[0]<=OS_LOWEST_PRIO)
{
ptcb=OSTCBPrioTbl[Regs[0]];
if(ptcb!
=NULL)
{
ptcb->OSTCBStkPtr[1]&=~(1<<5);
}
}
break;
case0x83:
/*任务是THUMB代码*/
if(Regs[0]<=OS_LOWEST_PRIO)
{
ptcb=OSTCBPrioTbl[Regs[0]];
if(ptcb!
=NULL)
{
ptcb->OSTCBStkPtr[1]|=(1<<5);
}
}
break;
default:
break;
}
}
/*********************************************************************************************************
**函数名称:
OSStartHighRdy
**功能描述:
uC/OS-II启动时使用OSStartHighRdy运行第一个任务,
**实质是产生swi1指令
**输 入:
无
**输 出:
无
**全局变量:
无
**调用模块:
无
********************************************************************************************************/
voidOSStartHighRdy(void)
{
_OSStartHighRdy();
}
/*以下为一些钩子函数,全部为空函数。
具体说明请看相关资料*/
#ifOS_CPU_HOOKS_EN
/*
*********************************************************************************************************
*OSINITIALIZATIONHOOK
*(BEGINNING)
*
*Description:
ThisfunctioniscalledbyOSInit()atthebeginningofOSInit().
*
*Arguments:
none
*
*Note(s):
1)Interruptsshouldbedisabledduringthiscall.
*********************************************************************************************************
*/
#ifOS_VERSION>203
voidOSInitHookBegin(void)
{
}
#endif
/*
*********************************************************************************************************
*OSINITIALIZATIONHOOK
*(END)
*
*Description:
ThisfunctioniscalledbyOSInit()attheendofOSInit().
*
*Arguments:
none
*
*Note(s):
1)Interruptsshouldbedisabledduringthiscall.
*********************************************************************************************************
*/
#ifOS_VERSION>203
voidOSInitHookEnd(void)
{
}
#endif
/*
*********************************************************************************************************
*TASKCREATIONHOOK
*
*Description:
Thisfunctioniscalledwhenataskiscreated.
*
*Arguments:
ptcbisapointertothetaskcontrolblockofthetaskbeingcreated.
*
*Note(s):
1)Interruptsaredisabledduringthiscall.
******************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 移植