1. USART1_IRQHandler() 가 발생되면 데이터를 버퍼(큐) 에 저장하고, 0x0D / 0x0A 가 나오게 되면
수신된 데이터를 분석하고, FLASH 에 저장하게 됩니다. 이때, FLASH ERASE 를 하게 되는데요.
FLASH ERASE 를 하는 중에 TIM2_IRQHandler 혹은 USART1_IRQHandler() 가 발생할 경우가 생기게 되는데.
FLASH ERASE 가 시간이 걸려서 그런지 위 두 인터럽트가 발생하지 않습니다.
TIM2_IRQHandler 가 발생하게 되면 LED 를 깜박거리게 해 놓았는데, FLASH ERASE 하는 중에는 잠시 멈추는 현상이 되네요.
그리고, FLASH ERASE 를 하는 중에 USART1_IRQHandler() 가 발생하여 받은 데이터를 또 다시 처리를 해야 하는데.
FLASH ERASE 를 하는 중에는 데이터가 수신이 되지 않습니다.
2. Virtual COM Port 를 이용해서 디버그 메시지를 출력하도록 구현
: USB_LP_CAN1_RX0_IRQHandler() : USB_Istr() 와 같이 구현하고, 출력 데이터는 버퍼(큐) 에 저장하고,
ST 에서 제공하는 EP1_IN_Callback() 과 SOF_Callback() 으로 데이터 유실 없이 출력하도록 구현하였습니다.
: 그런데, 위 1번과 마찬가지로 USART 에서 수신된 데이터를 Virtual COM Port 로 출력을 하는 중에
데이터가 수신되었음에도 불구하고 USART1_IRQHandler() 가 발생을 하지 않습니다.
위와 같은 상황을 해결하려면 RTOS 를 넣어야 할까요? 아니면 잘 모르지만 Mode Privilege 를 이용해야 할까요?
이 상황을 간단히 재현하기 위해서 아래와 같은 테스트를 해 보았습니다.
1. main() 함수에서 특정한 문자가 들어올 경우 while(1){} 를 하도록 하면, TIM2_IRQHandler 가 발생을 하더군요.
2. USART1_IRQHandler() 가 발생할 경우 while(1){} 를 하도록 하면, CPU 가 멈추는 현상이 발생하여
TIM2_IRQHandler 가 발생을 하지 않습니다.
제가 간단히 테스트를 한 것이 Mode Privilege 랑 연관성이 있을까요?
답변 부탁드립니다.
플래그를 활성하 하시면 그나마 풀리지 않을까 생각 듭니다
그리고 cpu가 다운 먹는다기보단 중간에 연산과정에서 무한 루프를 돌고 있을수 있습니다.
인터럽트 처리중 또 인터럽트가 들어와 연산 과정중 꼬이는 현상이 발생하더라구요;;;
그래서 연산을 마무리 짓고 빠져 나와야 하는데 수치가 중간에 바뀐다던가 해서 연산식을 못 빠져 나가는
현상이 생기더라구요;;
통신을 모두 받고 나서 cr, lf 가 수신 되었을시 플래그 변수 를 하나 넣어서 참으로 바뀌게 한뒤
while에서 조건 문을 넣어놓고 플래그가 참일경우 연산하게 구현을 해야 할듯 합니다.
그렇게 되면 중간에 통신 받는중에 또 받 더라도 최종적인 데이터만 처리하게 되겠죠;;;
횡설수설 한것 같은데 ㅠㅠ ;; 인터럽트 ㅠㅠㅠ 무조건 쓴다고 좋을줄 알았는데 저도 이래저래 막히는게 생기네요 ㅠㅠ
도움이 되셨는지 모르겠네요 ㅠㅠ