曲径通幽论坛

标题: uc/os-ii 移植理解笔记一----关于SWI [打印本页]

作者: beyes    时间: 2008-11-16 22:35
标题: uc/os-ii 移植理解笔记一----关于SWI
1、SWI
软件中断作为底层接口,使用不同的功能号区分不同的功能函数。用软中断作为操作系统的底层接口就需要在 C 语言中使用 SWI 指令。也就是说: 引用:
[blockquote]软件的上层应用,有时需要对系统进行一些底层操作,但是上层应用所使用的 C语言又无法进行这样的操作。所以,需要有一个接口,利用这个接口才能碰触到系统的底层,而这个接口就是--SWI 。SWI就像一个中间人,负责上层应用 和 操作系统底层之间传递一些命令与数据。[/blockquote]在 ADS 中,有一个关键字 __swi ,用它声明一个不存在的函数,调用这个函数就在调用这个函数的地方插入一条 SWI 指令,并且可以指定功能号。同时,这个函数也可以有参数和返回值,其传递规则同一般的函数。

比如声明这么一个函数:

__swi(0x02) void OS_ENTER_CRITICAL(void);

OS_ENTER_CRITICAL(void) --->这个函数在 C 中是不存在的。当你在 C 中调用这个函数时,那么就在调用的地方插入 SWI 0x02 这个指令。当编译器识别了这个指令后,并从功能号为 0x02 这里找到入口.

2、SWI 执行的过程是这样的

当执行了上面被 __swi 声明的函数后,开始调用 SWI,引发中断,程序从中断向量表处找到软中断的中断服务程序的入口处(同时也进入到管理模式)。SWI 中断处理程序是:SoftwareInterrupt

程序代码为:

LDR    SP, StackSvc                    ; 重新设置堆栈指针
STMFD  SP!, {R0-R3, R12, LR}


MOV    R1, SP                              ; R1指向参数存储位置
MRS    R3, SPSR
TST    R3, #T_bit                        ; 中断前是否是Thumb状态

LDRNEH  R0, [LR,#-2]            ; 是: 取得Thumb状态SWI号
BICNE  R0, R0, #0xff00
LDREQ  R0, [LR,#-4]                  ; 否: 取得arm状态SWI号
BICEQ  R0, R0, #0xFF000000
                                                  ; r0 = SWI号,R1指向参数存储位置
CMP    R0, #1
LDRLO  PC, =OSIntCtxSw
LDREQ  PC, =__OSStartHighRdy  ; SWI 0x01为第一次任务切换
BL      SWI_Exception
       
LDMFD  SP!, {R0-R3, R12, PC}^
       
StackSvc  DCD    (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4) 
;因为是满递减,所以要-4.比如 SvcStackSpace =0x04, SVC_STACK_LEGTH = 3
;SvcStackSpace + SVC_STACK_LEGTH * 4 等于0x10, 减 4 后为 0x0c,如有数据
;进栈,则数据是写入0x0f,0x0e,0x0d,0x0c 这 4 个字节单元中.




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2