|
楼主 |
发表于 2013-8-23 00:23:45
|
显示全部楼层
现在我们可以利用BASEPRI 寄存器的特点来管理OS中断,以提高OS的实时性!
首先,我们可以先设定一个自动屏蔽中断的阀值,只要小于等于OS系统的优先级就可以, 如:11
#ifndef configMAX_SYSCALL_INTERRUPT_PRIORITY
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 11 //0//(11) //must be(0~15) <= configKERNEL_INTERRUPT_PRIORITY_SYSTICK
#endif
那么我们可以用如下方式来管理OS的中断:
-------------------------------屏蔽优先级低于某一个数值的异常--------------------------------------------
__asm OS_CPU_SR OS_CPU_SR_Save(void)
{
PRESERVE8
IF configMAX_SYSCALL_INTERRUPT_PRIORITY > 0
MRS R0, BASEPRI
MOVS R1, #(configMAX_SYSCALL_INTERRUPT_PRIORITY<<4)
MSR BASEPRI, R1
BX LR
ELSE
MRS R0, PRIMASK //读取PRIMASK到R0,R0为返回值
CPSID I
ENDIF
}
__asm void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr)
{
PRESERVE8
IF configMAX_SYSCALL_INTERRUPT_PRIORITY > 0
MSR BASEPRI, R0 //读取R0到BASEPRI中,R0为参数
BX LR //返回
ELSE
MSR PRIMASK, R0 //读取R0到PRIMASK中,R0为参数
BX LR
ENDIF
}
下面可以用一个按键(GPIO)中断(抢占式优先级为2)来演示一下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|