ucos中的异常处理

本文探讨了UCOS实时操作系统与Linux在任务调度上的区别,重点解析了UCOS中异常处理和中断机制。在UCOS中,高优先级任务会立即执行,不依赖时间片。中断发生时,系统保存现场,从IRQ模式切换到SVC模式,并在OSIntExit中恢复任务上下文。然而,该实现不支持中断嵌套,读者可尝试自行改进。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        之前一直看的都是linux,linux是非实时的操作系统,高优先级的任务不会立刻被调度,在linux中为了满足进程交互性的需求,发明了时间片,给所有任务都分配时间片,(后面再继续分析两种的不同。)

        ucos是一种实时操作系统。 当一个高优先级的任务准备就绪后,它会立刻被调度,并且一直执行直到任务结束,或是任务被其他更高优先级的任务抢占,亦或是任务需要等待信号量而变成休眠状态。在ucos中没有时间片的概念。 当然,与linux类似,ucos也通过时钟的tick来驱动,每次时钟tick时,发生中断,中断函数结束时,就会进行任务切换,因为可能会有高优先级的任务变成了就绪状态,如果有就立刻运行更高优先级的任务。

下面具体分析。

1. 栈的初始化

首先,对于每一种处理模式,都有各自的sp指针(user模式和system模式是共用的)。在板子初始化时,会调用InitStacks

;function initializing stacks
InitStacks
	;Don''t use DRAM,such as stmfd,ldmfd......
	;SVCstack is initialized before
	;Under toolkit ver 2.5, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
	mrs	r0,cpsr
	bic	r0,r0,#MODEMASK
	orr	r1,r0,#UNDEFMODE|NOINT
	msr	cpsr_cxsf,r1		;UndefMode
	ldr	sp,=UndefStack		; UndefStack=0x33FF_5C00

	orr	r1,r0,#ABORTMODE|NOINT
	msr	cpsr_cxsf,r1		;AbortMode
	ldr	sp,=AbortStack		; AbortStack=0x33FF_6000

	orr	r1,r0,#IRQMODE|NOINT
	msr	cpsr_cxsf,r1		;IRQMode
	ldr	sp,=IRQStack		; IRQStack=0x33FF_7000

	orr	r1,r0,#FIQMODE|NOINT
	msr	cpsr_cxsf,r1		;FIQMode
	ldr	sp,=FIQStack		; FIQStack=0x33FF_8000

	bic	r0,r0,#MODEMASK|NOINT
	orr	r1,r0,#SVCMODE
	msr	cpsr_cxsf,r1		;SVCMode
	ldr	sp,=SVCStack		; SVCStack=0x33FF_5800

	;USER mode has not be initialized.

	mov	pc,lr
	;The LR register won''t be valid if the current mode is not SVC mode.
arm刚启动时,默认是svc模式,上面进行的工作就是通过msr 改变cpsr寄存器,从而进入不同的模式&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值