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
내 문제가 해결되었습니다, 그것은 저를 가리키는 폴 덕분에. 그러나 나는 아직 질문을 닫고 싶지 않다. 보너스 포인트를 얻으려면 크로스 웍스가 차단 기능을 감지하는 방법과 차단되는 코드 블록이 실행될 때 런타임시 함수의 실행을 종료하는 방법을 이해하고 싶습니다.
나는 이것이 무거운 편집임을 알고 있지만 지금은 답변이 없으며 문서 및 그 뒤에있는 "방법"에 대한 일반적인 질문에 맞습니다.
myLibFunction을 게시 할 수 있습니까? – LPs
라이브러리는 사용자가 다음과 같은 기능을 호출한다고 생각합니다. I/O는 비동기를 필요로하고 인터럽트 (즉, 차단)를 기다리는 동작입니다. ISR에서 이러한 기능을 호출 할 수 없습니다. –
@Paul Ogilvie, 당신이 자리하고 있습니다. myLibFunction()의 하위 함수에서'debug_print' 호출이있었습니다. 이것이 jtag 인터페이스를 통해 디버그 메시지를 출력하는 CrossWorks lib 기능입니다. 나는 그것을 간과했다. 내 잘못이고 너의 시간 낭비에 사과한다. 그 기능은 "차단"이었습니다. 크로스 웍스가 그러한 코드를 발견했을 때 그 기능을 식별하는 방법, 또는 실행을 종료하는 방법이 실제로 흥미로울 것입니다. 사람들이 더 깊이 들어가도록 격려하기 위해 질문을 업데이트 할 것입니다. – jwsc