【15】从0到1教你写uC/OS-III————>临界段

本文深入解析了临界段的概念,探讨了其在多任务环境下的重要性,以及如何通过关中断和锁调度器来保护临界段。文章还提供了具体的实现方式和例程,包括使用CPSID/CPSIE指令在ARM架构上的应用。

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

  1. 简述:
    1. 临界段也叫临界域,是一段不可分割的代码;
    2. 如何临界段可以被中断,那么就需要关中断以保护临界段;
    3. 如果临界段可能被任务级代码打断,那么需要锁调度器保护临界段;
  2. 什么时候用临界段?
    1. 你认为这段代码不希望被中断的时候;
    2. 临界段的本质就是开(进入临界段)、关(退出临界段)系统中断;
  3. 实现方式
    1. 简单直接:CPSID / CPSIE (在临界段嵌套中就会出现问题)
    2. 程序状态字保存在寄存器中
      1. cpu_sr1 = CPU_SR_Save();//关中断
      2. CPU_SR_Restore(cpu_sr1);//开中断
  4. 例程:
    /*
    ************************************************************************************************************************
    *                                              临界段处理
    ************************************************************************************************************************
    */  
    #define  OS_CRITICAL_ENTER()                    CPU_CRITICAL_ENTER()    //开启临界段
    
    #define  OS_CRITICAL_ENTER_CPU_CRITICAL_EXIT()  
    
    #define  OS_CRITICAL_EXIT()                     CPU_CRITICAL_EXIT()     //退出临界段
    
    #define  OS_CRITICAL_EXIT_NO_SCHED()            CPU_CRITICAL_EXIT()
    
    
    /*
    *********************************************************************************************************
    *                                          临界段配置
    *********************************************************************************************************
    */                                                            
    #define  CPU_CFG_CRITICAL_METHOD    CPU_CRITICAL_METHOD_STATUS_LOCAL
    
    typedef  CPU_INT32U                 CPU_SR;                    
    
                                                                    
    #if     (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
    /* 定义一个局部变量,用于保存CPU中断状态 */
    #define  CPU_SR_ALLOC()             CPU_SR  cpu_sr = (CPU_SR)0
    #else
    #define  CPU_SR_ALLOC()
    #endif
    
    
    /* Save    CPU 状态 & 失能中断 */
    #define  CPU_INT_DIS()         do { cpu_sr = CPU_SR_Save(); } while (0)
    /* Restore CPU 状态  */
    #define  CPU_INT_EN()          do { CPU_SR_Restore(cpu_sr); } while (0)
    
    /* 失能中断 */
    #define  CPU_CRITICAL_ENTER()  do { CPU_INT_DIS(); } while (0)
    /* 重新使能中断 */
    #define  CPU_CRITICAL_EXIT()   do { CPU_INT_EN();  } while (0)   
    
    ;************************************************************************************************************************
    ;                                             临界段 关闭 打开中断 
    ;************************************************************************************************************************			
    CPU_SR_SAVE
    		MRS		R0,	PRIMASK
    		CPSID	I
    		BX		LR
    CPU_SR_Restore
    		MRS		PRIMA
    
    /*
    *********************************************************************************************************
    *                                          临界段配置
    *********************************************************************************************************
    */  
    #define  CPU_CRITICAL_METHOD_NONE                  0u  
    #define  CPU_CRITICAL_METHOD_INT_DIS_EN            1u   /* DIS/EN       中断*/
    #define  CPU_CRITICAL_METHOD_STATUS_STK            2u   /* Push/Pop     中断状态到任务堆栈 */
    #define  CPU_CRITICAL_METHOD_STATUS_LOCAL          3u   /* Save/Restore 中断状态到局部变量*/

     

  5. 总结:无
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值