ARM移植.docx

上传人:b****1 文档编号:13484102 上传时间:2023-06-14 格式:DOCX 页数:21 大小:19.05KB
下载 相关 举报
ARM移植.docx_第1页
第1页 / 共21页
ARM移植.docx_第2页
第2页 / 共21页
ARM移植.docx_第3页
第3页 / 共21页
ARM移植.docx_第4页
第4页 / 共21页
ARM移植.docx_第5页
第5页 / 共21页
ARM移植.docx_第6页
第6页 / 共21页
ARM移植.docx_第7页
第7页 / 共21页
ARM移植.docx_第8页
第8页 / 共21页
ARM移植.docx_第9页
第9页 / 共21页
ARM移植.docx_第10页
第10页 / 共21页
ARM移植.docx_第11页
第11页 / 共21页
ARM移植.docx_第12页
第12页 / 共21页
ARM移植.docx_第13页
第13页 / 共21页
ARM移植.docx_第14页
第14页 / 共21页
ARM移植.docx_第15页
第15页 / 共21页
ARM移植.docx_第16页
第16页 / 共21页
ARM移植.docx_第17页
第17页 / 共21页
ARM移植.docx_第18页
第18页 / 共21页
ARM移植.docx_第19页
第19页 / 共21页
ARM移植.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

ARM移植.docx

《ARM移植.docx》由会员分享,可在线阅读,更多相关《ARM移植.docx(21页珍藏版)》请在冰点文库上搜索。

ARM移植.docx

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模板 > 商务科技

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2