搜索
bottom↓
回复: 3

stm32中断优先级管理 与 ucosII 的实时性!

[复制链接]

出0入8汤圆

发表于 2013-8-22 23:57:21 | 显示全部楼层 |阅读模式

不同的中断管理方式,OS的实时性就不一样!

/*
----------------------------------禁止全局中断--------------------------------------
PRIMASK         这是个只有单一比特的寄存器。在它被置1后,就关掉所有可屏蔽的异常,只剩下NMI和硬fault可以响应。
                它的缺省值是0,表示没有关中断。
*/

__asm INT32U OS_CPU_SR_Save(void)
{
      PRESERVE8
      MRS     R0, PRIMASK                      //读取PRIMASK到R0,R0为返回值
    CPSID   I                                    //PRIMASK=1,关中断(NMI和硬件FAULT可以响应)
      BX      LR                         
}

上面是一种很常见的OS管理中断方式, 很明显,运行后,STM32所有外设的收到的信息都不能及时处理!

/*
BASEPRI         这个寄存器最多有9位(由表达优先级的位数决定,stm32f103中,高4位有效)。它定义了被屏蔽优先级的阈值。
                当它被设成某个值后,所有优先级号大于等于此值的中断都被关(优先级号越大,优先级越低)。
                但若被设成0,则不关闭任何中断,0也是缺省值。
*/

呵呵,既然即 BASEPRI  有那么好,我们来用它来做OS的中断管理看看会与 PRIMASK  有什么不同!

stm32中断有抢占式优先级 和 子优先级,其中又引出优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);

太他妈麻烦了, 我们来简化它,只要抢占式优先级, 不要子优先级, 这样我们就只有 抢占式优先级0~15级中断优先级了(子优先级都为0):
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);     //只要这条语句就搞定了

OS的 systick中断及pendsv中断把它们设定在最低级优先级:
#define configKERNEL_INTERRUPT_PRIORITY_PENDSV          (15)    //0~15
#define configKERNEL_INTERRUPT_PRIORITY_SYSTICK         (14)    //0~15

#define portNVIC_PENDSV_PRI                ( ( ( INT32U ) configKERNEL_INTERRUPT_PRIORITY_PENDSV ) << 20 )
#define portNVIC_SYSTICK_PRI                ( ( ( INT32U ) configKERNEL_INTERRUPT_PRIORITY_SYSTICK ) << 28 )


电脑屏幕太小,另起一行!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入8汤圆

 楼主| 发表于 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

出0入0汤圆

发表于 2013-8-23 08:14:32 | 显示全部楼层
顶一个,后期要做UCOS可以看下

出0入0汤圆

发表于 2013-8-23 12:33:35 | 显示全部楼层
楼主好样的,期待你的下一专题。

1. FreeRTOS就是这么干的。
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         191  /* equivalent to 0xb0, or priority 11. */
__asm unsigned long ulPortSetInterruptMask( void )
{
        PRESERVE8

        mrs r0, basepri
        mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
        msr basepri, r1
        bx r14
}

__asm void vPortClearInterruptMask( unsigned long ulNewMask )
{
        PRESERVE8

        msr basepri, r0
        bx r14
}

2. RTX针对M3/M4系列不关中断,可以认为是“零延迟”。
   The RTX Kernel library for Cortex™-M3/M4 does not disable interrupts. Interrupt lockout for Cortex™-M0/M1 is <20 cycles.

3. embOS有一个他们自己的中断管理机制,快中断和慢中断,快中断的意思就是中断里面不调用OS的API,慢中断就是里面可以调用大部分API。

个人观点:觉得UCOS这几年在更新速度和配套的基础程序方面没落了,不过这个丝毫不掩盖他们出的那本牛叉的《嵌入式实时操作系统uCOS-II》,
               太多的人是通过这么书入门的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 16:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表