2016-12-12 1 views
1

CrossWorks 대상 라이브러리를 stm32f 컨트롤러와 함께 사용합니다. 내 프로젝트에서 몇 가지 외부 핀 인터럽트를 사용할 수 있습니다. 지금까지 그들은 일하고 있었고, 이전 프로젝트의 구성을 다소 훔쳤으므로 올바른 것이어야한다고 생각합니다. 모두 완벽하게 작동하고CTL_UNSUPPORTED_CALL_FROM_ISR with CrossWorks Library

void __attribute__((interrupt("IRQ"))) EXTI2_TSC_IRQHandler(void) 
{ 
    if ((EXTI_GetITStatus(BUTTON_6_INTERRUPT_LINE) != RESET)) { 
     ctl_enter_isr(); 
     /* Clear the EXTI line 2 pending bit */ 
     EXTI_ClearITPendingBit(BUTTON_6_INTERRUPT_LINE); 
     if(somecondition) 
      globalcounter++; 
     else 
      myLibFunction(); 
     ctl_exit_isr(); 
    } 
} 

, somecondition이 참 오래 : ISR이 핸들러의 모든는 같은 모양. myLibFunction()이 호출되면 ctl_handle_error 함수가 CTL_UNSUPPORTED_CALL_FROM_ISR 인수로 호출되고 펌웨어가 다시 시작됩니다. 지금까지 그렇게 분명합니다.

해당 오류에 대한 문서가 존재하지 않습니다 (또는 너무 멍청해서 찾을 수 없습니다). CrossWorks하여 "차단 기능"간주되는

An interrupt service routine has called a tasking library function 
that could block or is otherwise unsupported when called from inside 
an interrupt service routine. 

이 정보가 올바른지 가정 : 난 그냥 읽는 ctl_handle_error 기능 위의 의견을 가지고? 함수에 루프가 없습니다. 유일한 흐름 제어는 if() 문장입니다. 재귀가 없습니다. while, for 또는 그 밖의 것이 없습니다. 디스 어셈블리의 전체 길이는 모든 경우에 50 개 이하입니다.

ISR에서 허용되는 것으로 간주되는 기능과 일반적인 기능에 대한 설명 (또는 설명서 링크)을 찾고 있습니다. 또는 내 정보가 잘못 되었다면 왜 그 오류가 일반적으로 발생합니까?

UPDATE

내 문제가 해결되었습니다, 그것은 저를 가리키는 폴 덕분에. 그러나 나는 아직 질문을 닫고 싶지 않다. 보너스 포인트를 얻으려면 크로스 웍스가 차단 기능을 감지하는 방법과 차단되는 코드 블록이 실행될 때 런타임시 함수의 실행을 종료하는 방법을 이해하고 싶습니다.

나는 이것이 무거운 편집임을 알고 있지만 지금은 답변이 없으며 문서 및 그 뒤에있는 "방법"에 대한 일반적인 질문에 맞습니다.

+1

myLibFunction을 게시 할 수 있습니까? – LPs

+1

라이브러리는 사용자가 다음과 같은 기능을 호출한다고 생각합니다. I/O는 비동기를 필요로하고 인터럽트 (즉, 차단)를 기다리는 동작입니다. ISR에서 이러한 기능을 호출 할 수 없습니다. –

+0

@Paul Ogilvie, 당신이 자리하고 있습니다. myLibFunction()의 하위 함수에서'debug_print' 호출이있었습니다. 이것이 jtag 인터페이스를 통해 디버그 메시지를 출력하는 CrossWorks lib 기능입니다. 나는 그것을 간과했다. 내 잘못이고 너의 시간 낭비에 사과한다. 그 기능은 "차단"이었습니다. 크로스 웍스가 그러한 코드를 발견했을 때 그 기능을 식별하는 방법, 또는 실행을 종료하는 방법이 실제로 흥미로울 것입니다. 사람들이 더 깊이 들어가도록 격려하기 위해 질문을 업데이트 할 것입니다. – jwsc

답변

1

hw 레지스터를보고 인터럽트 여부를 판단 할 수 있습니다. 예를 들어 STM32위한 CMSIS 사용시

if(__get_IPSR() & IPSR_THREADED_MODE) { 
    /* I am not in interrupt context */ 
} else { 
    /* I am in interrupt context */ 
} 

기능 __get_IPSR() core_cmFunc.h에서 찾을 수있다. 내가 호출하는 함수가 실행중인 컨텍스트를 확인하고 그에 따라 행동 할 것이라고 추측합니다 (즉 종료 또는 기타).

+0

이 "거부 차단 기능"은 함수 자체가 잘못된 컨텍스트를 확인하는 경우에만 작동합니다. 어떤 악의를 기다리고 있지만 문맥에 대한 검사를하지 않는 함수를 작성한다면, 이것은 잡히지 않을 것입니다. – jwsc

+0

맞습니다. 그러나 심각한 문제가 발생할 것입니다. 워치 독은 당신이 그것을 구현한다면 아마 짖을 것입니다. – staringlizard

+0

당신 말이 맞아요. 인터럽트에서 무한 while 루프를 사용해 보았습니다. CrossWorks가 불평하지 않고 작동합니다. 오, 이제 나는 실망했다.) – jwsc