OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6891|回复: 2

warship例程,ucosii中的OSInterrputSum,好像没用到

[复制链接]

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2012-3-21
在线时间
17 小时
发表于 2013-1-27 16:02:30 | 显示全部楼层 |阅读模式

 查帖子有人发过这样的一段代码:

OS_ENTER_CRITICAL
 
  CPSID   I                       ; Disable all the interrupts
                                                                       
  USH  {R1,R2}     

  LDR  R1, =OSInterrputSum     ; OSInterrputSum++
        LDRB  R2, [R1]
        ADD    R2, R2, #1
        STRB  R2, [R1]
  OP     {R1,R2}
    BX LR

;/***************************************************************************************
;* 函数名称: OS_EXIT_CRITICAL
;*
;* 功能描述: 退出临界区
;*           
;* 参    数: None
;*
;* 返 回 值: None
;*****************************************************************************************/

OS_EXIT_CRITICAL
  USH    {R1, R2}
  LDR     R1, =OSInterrputSum     ; OSInterrputSum--
        LDRB    R2, [R1]
        SUB     R2, R2, #1
        STRB    R2, [R1]
  MOV     R1,  #0      
  CMP     R2,  #0           ; if OSInterrputSum=0,enable
                                        ; interrupts如果OSInterrputSum=0,
  MSREQ  PRIMASK, R1  
     POP    {R1, R2}
  BX LR
以上代码不知是什么版本的。
现在战舰版的例程中只看到 OS_CPU_EXT INT32U OSInterrputSum;的声明,没用应用到。请问原子是这回事吗

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
280
金钱
280
注册时间
2012-3-21
在线时间
17 小时
 楼主| 发表于 2013-1-27 16:16:21 | 显示全部楼层
原贴:
http://www.openedv.com/posts/list/1143.htm

core.c中也有这么一个函数
void  OSIntEnter (void)
{
    if (OSRunning == OS_TRUE) {
        if (OSIntNesting < 255u) {
            OSIntNesting++;                      /* Increment ISR nesting level     记录中断嵌套层数               */
        }
    }
}
如果是这样,觉得没必要再定义OSInterrputSum了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-1-27 18:12:08 | 显示全部楼层
看看这个:
void  OSIntExit (void)
{
#if OS_CRITICAL_METHOD == 3u                               /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr = 0u;
#endif



    if (OSRunning == OS_TRUE) {
        OS_ENTER_CRITICAL();
        if (OSIntNesting > 0u) {                           /* revent OSIntNesting from wrapping       */
            OSIntNesting--;
        }
        if (OSIntNesting == 0u) {                          /* Reschedule only if all ISRs complete ... */
            if (OSLockNesting == 0u) {                     /* ... and not locked.                      */
                OS_SchedNew();
                OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
                if (OSPrioHighRdy != OSPrioCur) {          /* No Ctx Sw if current task is highest rdy */
#if OS_TASK_PROFILE_EN > 0u
                    OSTCBHighRdy->OSTCBCtxSwCtr++;         /* Inc. # of context switches to this task  */
#endif
                    OSCtxSwCtr++;                          /* Keep track of the number of ctx switches */
                    OSIntCtxSw();                          /* erform interrupt level ctx switch       */
                }
            }
        }
        OS_EXIT_CRITICAL();
    }
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-22 02:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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