我遇到信号量问题,似乎有时候在ISR内部调用的SemPost无效。
我的应用程序基于Micrimum UCOS III,目标平台基于Microsemi Smartfusion2 SoC(Cortex-M3)。 我的应用程序包含两个任务(A和B),但只有一个在问题发生时处于活动状态(另一个在信号量上停留)。
当活动任务(让我们称之为任务A)执行以下操作时会出现问题:
当触发中断时,相关的ISR在Sem A上创建一个SemPost,以便在超时之前解锁信号量。
当问题发生时,OSSemPend返回OS_ERR_TIMEOUT。我很少能看到这个问题。
我确信:
代码是否写得正确?在ISR中使用信号量有任何限制吗? 有人能帮我吗? 谢谢
我附上了代码的简化版本
public class AopWebServiceChecker {
public void doAround(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("1");
joinPoint.proceed();
System.out.println("2");
}
}
答案 0 :(得分:0)
调用OSSemPost()时无需禁用中断。 OSSemPost()被视为对您的应用程序的原子操作。
对于Cortex-M3核心,ISR应该是这样的,这是Microsemi部分的内容:
void MyISR (void)
{
CPU_SR_ALLOC();
CPU_CRITICAL_ENTER();
OSIntEnter();
CPU_CRITICAL_EXIT();
OSSemPost(...);
OSIntExit();
}
这允许您告诉uC / OS-III您正在启动ISR。这是必要的,以允许内核安排已发布的任务,如果它是准备运行的最高优先级。