c语言实现subs指令,周立功LPC系统移植学习之c启动代码修改一

一.系统移植用c启动代码

;/****************************************Copyright (c)**************************************************

;**                               Guangzou ZLG-MCU Development Co.,LTD.

;**                                      graduate school

;**                                 http://www.zlgmcu.com

;**

;**--------------File Info-------------------------------------------------------------------------------

;** File name:     Startup.s

;** Last modified Date: 2004-09-17

;** Last Version:    1.0

;** Descriptions:    The start up codes for LPC2200, including the initializing codes for the entry point of exceptions and the stacks of user tasks.

;**     Every project should have a independent copy of this file for related modifications

;**------------------------------------------------------------------------------------------------------

;** Created by:     Chenmingji

;** Created date:      2004-02-02

;** Version:    1.0

;** Descriptions:    The original version

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:    Chenmingji

;** Modified date:   2004-09-17

;** Version:    1.01

;** Descriptions:    Modified the bus setting to adapt for many common situations

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:    Chenmingji

;** Modified date:   2004-09-17

;** Version:    1.02

;** Descriptions:    Added codes to support the enciphering of the chip

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:    Chenmingji

;** Modified date:   2004-09-17

;** Version:    1.04

;** Descriptions:    Renewed the template, added codes to support more compilers

;**

;**------------------------------------------------------------------------------------------------------

;** Modified by:

;** Modified date:

;** Version:

;** Descriptions:

;**

;********************************************************************************************************/

;define the stack size

;定义堆栈的大小

FIQ_STACK_LEGTH         EQU         0

IRQ_STACK_LEGTH         EQU         9*8             ;every layer need 9 bytes stack , permit 8 layer .每层嵌套需要9个字堆栈,允许8层嵌套

ABT_STACK_LEGTH         EQU         0

UND_STACK_LEGTH         EQU         0

NoInt       EQU 0x80

USR32Mode   EQU 0x10

SVC32Mode   EQU 0x13

SYS32Mode   EQU 0x1f

IRQ32Mode   EQU 0x12

FIQ32Mode   EQU 0x11

PINSEL2     EQU 0xE002C014

BCFG0       EQU 0xFFE00000

BCFG1       EQU 0xFFE00004

BCFG2       EQU 0xFFE00008

BCFG3       EQU 0xFFE0000C

IMPORT __use_no_semihosting_swi

IMPORT __use_two_region_memory

;The imported labels

;引入的外部标号在这声明

IMPORT FIQ_Exception                   ;Fast interrupt exceptions handler 快速中断异常处理程序

IMPORT __main                          ;The entry point to the main function C语言主程序入口

IMPORT TargetResetInit                 ;initialize the target board 目标板基本初始化

IMPORT SoftwareInterrupt

;The emported labels

;给外部使用的标号在这声明

EXPORT bottom_of_heap

EXPORT bottom_of_Stacks

EXPORT top_of_heap

EXPORT StackUsr

EXPORT Reset

EXPORT __user_initial_stackheap

CODE32

AREA    vectors,CODE,READONLY

ENTRY

;interrupt vectors

;中断向量表

Reset

LDR     PC, ResetAddr

LDR     PC, UndefinedAddr

LDR     PC, SWI_Addr

LDR     PC, PrefetchAddr

LDR     PC, DataAbortAddr

DCD     0xb9205f80

LDR     PC, [PC, #-0xff0]

LDR     PC, FIQ_Addr

ResetAddr           DCD     ResetInit

UndefinedAddr       DCD     Undefined

SWI_Addr            DCD     SoftwareInterrupt

PrefetchAddr        DCD     PrefetchAbort

DataAbortAddr       DCD     DataAbort

Nouse               DCD     0

IRQ_Addr            DCD     0

FIQ_Addr            DCD     FIQ_Handler

;未定义指令

Undefined

B       Undefined

;取指令中止

PrefetchAbort

B       PrefetchAbort

;取数据中止

DataAbort

B       DataAbort

;快速中断

FIQ_Handler

STMFD   SP!, {R0-R3, LR}

BL      FIQ_Exception

LDMFD   SP!, {R0-R3, LR}

SUBS    PC, LR, #4

;/*********************************************************************************************************

;** unction name 函数名称: InitStack

;** Descriptions 功能描述: Initialize the stacks 初始化堆栈

;** input parameters 输 入:   None 无

;** Returned value   输 出 : None 无

;** Used global variables 全局变量: None 无

;** Calling modules 调用模块: None 无

;**

;** Created by    作 者: Chenmingji 陈明计

;** Created Date 日 期: 2004/02/02 2004年2月2日

;**-------------------------------------------------------------------------------------------------------

;** Modified by 修 改:

;** Modified date 日 期:

;**-------------------------------------------------------------------------------------------------------

;********************************************************************************************************/

InitStack

MOV     R0, LR

;Build the SVC stack

;设置中断模式堆栈

MSR     CPSR_c, #0xd2

LDR     SP, StackIrq

;Build the FIQ stack

;设置快速中断模式堆栈

MSR     CPSR_c, #0xd1

LDR     SP, StackFiq

;Build the DATAABORT stack

;设置中止模式堆栈

MSR     CPSR_c, #0xd7

LDR     SP, StackAbt

;Build the UDF stack

;设置未定义模式堆栈

MSR     CPSR_c, #0xdb

LDR     SP, StackUnd

;Build the SYS stack

;设置系统模式堆栈

MSR     CPSR_c, #0xdf

LDR     SP, =StackUsr

MOV     PC, R0

;/*********************************************************************************************************

;** unction name 函数名称: ResetInit

;** Descriptions 功能描述: RESET 复位入口

;** input parameters 输 入:   None 无

;** Returned value   输 出 : None 无

;** Used global variables 全局变量: None 无

;** Calling modules 调用模块: None 无

;**

;** Created by    作 者: Chenmingji 陈明计

;** Created Date 日 期: 2004/02/02 2004年2月2日

;**-------------------------------------------------------------------------------------------------------

;** Modified by 修 改: Chenmingji 陈明计

;** Modified date 日 期: 2004/02/02 2004年3月3日

;**-------------------------------------------------------------------------------------------------------

;********************************************************************************************************/

ResetInit

;Initial the extenal bus controller

;初始化外部总线控制器,根据目标板决定配置

LDR     R0, =PINSEL2

IF :DEF: EN_CRP

LDR     R1, =0x0f814910

ELSE

LDR     R1, =0x0f814914

ENDIF

STR     R1, [R0]

LDR     R0, =BCFG0

LDR     R1, =0x1000ffef

STR     R1, [R0]

LDR     R0, =BCFG1

LDR     R1, =0x1000ffef

STR     R1, [R0]

;        LDR     R0, =BCFG2

;        LDR     R1, =0x2000ffef

;        STR     R1, [R0]

;        LDR     R0, =BCFG3

;        LDR     R1, =0x2000ffef

;        STR     R1, [R0]

BL      InitStack               ; Initialize the stack 初始化堆栈

BL      TargetResetInit         ; Initialize the target board 目标板基本初始化

; Jump to the entry point of C program 跳转到c语言入口

B       __main

;/*********************************************************************************************************

;** unction name 函数名称: __user_initial_stackheap

;** Descriptions 功能描述: Initial the function library stacks and heaps, can not deleted!   库函数初始化堆和栈,不能删除

;** input parameters 输 入:   reference by function library 参考库函数手册

;** Returned value   输 出 : reference by function library 参考库函数手册

;** Used global variables 全局变量: None 无

;** Calling modules 调用模块: None 无

;**

;** Created by    作 者: Chenmingji 陈明计

;** Created Date 日 期: 2004/02/02 2004年2月2日

;**-------------------------------------------------------------------------------------------------------

;** Modified by

;** Modified date

;**-------------------------------------------------------------------------------------------------------

;********************************************************************************************************/

__user_initial_stackheap

LDR   r0,=bottom_of_heap

;    LDR   r1,=StackUsr

LDR   r2,=top_of_heap

LDR   r3,=bottom_of_Stacks

MOV   pc,lr

StackIrq           DCD     IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4

StackFiq           DCD     FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4

StackAbt           DCD     AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4

StackUnd           DCD     UndtStackSpace + (UND_STACK_LEGTH - 1)* 4

;/*********************************************************************************************************

;** unction name 函数名称: CrpData

;** Descriptions 功能描述: encrypt the chip

;** input parameters 输 入:   None 无

;** Returned value   输 出 : None 无

;** Used global variables 全局变量: None 无

;** Calling modules 调用模块: None 无

;**

;** Created by    作 者: Chenmingji 陈明计

;** Created Date 日 期: 2004/03/27 2004年3月27日

;**-------------------------------------------------------------------------------------------------------

;** Modified by 修 改:

;** Modified date 日 期:

;**-------------------------------------------------------------------------------------------------------

;********************************************************************************************************/

IF :DEF: EN_CRP

IF . >= 0x1fc

INFO    1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."

ENDIF

CrpData

WHILE . < 0x1fc

NOP

WEND

CrpData1

DCD     0x87654321          ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */

ENDIF

;/* 分配堆栈空间 */

AREA    MyStacks, DATA, NOINIT, ALIGN=2

IrqStackSpace      SPACE   IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode 中断模式堆栈空间

FiqStackSpace      SPACE   FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode 快速中断模式堆栈空间

AbtStackSpace      SPACE   ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode 中止义模式堆栈空间

UndtStackSpace     SPACE   UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 未定义模式堆栈

AREA    Heap, DATA, NOINIT

bottom_of_heap    SPACE   1

AREA    StackBottom, DATA, NOINIT

bottom_of_Stacks    SPACE   1

AREA    HeapTop, DATA, NOINIT

top_of_heap

AREA    Stacks, DATA, NOINIT

StackUsr

END

;/*********************************************************************************************************

;**                            End Of File

;********************************************************************************************************/

二.启动代码修改部分及说明

1.堆栈的变化

1)IRQ_STACK_LEGTH的调整IRQ_STACK_LEGTH         EQU         9*8             ;every layer need 9 bytes stack , permit 8 layer .每层嵌套需要9个字堆栈,允许8层嵌套。

UC/OSII中断管理:中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。嵌套层数设置的越多中断占用的堆栈越大,对RAM需求越大,嵌套层数减少会影响实时性能。

在UC/OSII中,内核为中断嵌套的层数定义了一个全局变量OSIntNesting(区别于目的是实现临界段嵌套的关中断的计数器OsEnterSum) 。系统在进行任务调度时,先要判断OSIntNesting是否为0,如果OSIntNesting不为0,则不进行任务切换。也就是说:在OSIntNesting为1(当前只有一个中断,并且没有嵌套中断)时,如果发生了嵌套的中断(不管嵌套的层数有多深),那么所有嵌套的中断一层一层地都返回,直到OSIntNesting再次为1时止,任务栈是不会切换的,栈指针始终在同一个任务的栈空间中变化。

字长度:每一次中断需入栈的寄存器有R0-R3,R12,LR,SPSR,共7个,再加上c语言的中断处理函数会将一些数据压入堆栈。

2)StackSvc的变化:SVC_STACK_LEGTH     EQU         32在Os_cpu_a.s中定义,方便软件中断SoftwareInterrupt调用,需能入栈17寄存器CPSR,OsEnterSum,R0-R12,LR,SP,所以应该是大于17的字数。2.向量表的变化

1)

SoftwareInterrupt              去除,SWI_Addr    DCD     SoftwareInterrupt将跳转到Os_cpu_a.s中,

B       SoftwareInterrupt

uc/os2假定任务切换是靠中断级代码完成的。uc/os2需要的是一条处理器指令,其行为就像是硬件中断(所以成为软中断)。    SWI(software interrupt)软件中断,由用户定义的中断指令.可以用于用户模式下的程序调用特权操作指令.在实时操作系统中可以通过该机制实现系统调用.一个 SWI 所做的一切就是把模式改变成超级用户并设置 PC 来执行在地址 &08 处的下一个指令!       编程异常通常叫做软中断.软中断是通讯进程之间用来模拟硬中断的一种信号通讯方式。中断源发中断请求或软中断信号后,CPU或接收进程在适当的时机自动进行中断处理或完成软中断信号对应的功能.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值