ISR内的UC / OS III信号量有时不起作用

时间:2015-11-08 10:02:49

标签: semaphore interrupt cortex-m3 ucos micrium

我遇到信号量问题,似乎有时候在ISR内部调用的SemPost无效。

我的应用程序基于Micrimum UCOS III,目标平台基于Microsemi Smartfusion2 SoC(Cortex-M3)。 我的应用程序包含两个任务(A和B),但只有一个在问题发生时处于活动状态(另一个在信号量上停留)。

当活动任务(让我们称之为任务A)执行以下操作时会出现问题:

  1. 写入某个寄存器以在触发中断后启动操作
  2. 等待操作完成,在semafore上创建一个OSSemPend(让我们称之为Sem A),设置一个100毫秒的timemout。
  3. 检查OSSemPend呼叫是否正常结束或是否发生超时
  4. 当触发中断时,相关的ISR在Sem A上创建一个SemPost,以便在超时之前解锁信号量。

    当问题发生时,OSSemPend返回OS_ERR_TIMEOUT。我很少能看到这个问题。

    我确信:

    • 开始操作(参见第一点)并开始操作。
    • 触发中断并执行Sem A上的OSSemPost。
    • 在从开始
    • 少于500次usec(即<1msec)之后触发中断

    代码是否写得正确?在ISR中使用信号量有任何限制吗? 有人能帮我吗? 谢谢

    我附上了代码的简化版本

    public class AopWebServiceChecker {
        public void doAround(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("1");
            joinPoint.proceed();
            System.out.println("2");
        }
    }
    

1 个答案:

答案 0 :(得分:0)

  1. 调用OSSemPost()时无需禁用中断。 OSSemPost()被视为对您的应用程序的原子操作。

  2. 对于Cortex-M3核心,ISR应该是这样的,这是Microsemi部分的内容:

    void MyISR (void)
    {
       CPU_SR_ALLOC();
    
       CPU_CRITICAL_ENTER();
       OSIntEnter();
       CPU_CRITICAL_EXIT();
       OSSemPost(...);
       OSIntExit();
    }
    
  3. 这允许您告诉uC / OS-III您正在启动ISR。这是必要的,以允许内核安排已发布的任务,如果它是准备运行的最高优先级。