본문 바로가기
자동차 임베디드 SW/툴- T32

Aurix 이슈. 디버깅시 STM Stop

by 존버매니아.임베디드 개발자 2022. 9. 22.
반응형

Aurix에는 STM 이라는 타이머가 있는데
RTOS를 만들때 OS의 System Timer로 STM을 많이 사용함.

한편 RTOS에서 일반적으로 주기 Task를 많이 사용하는데, 오토사 OS에는 동일한 Task가 동시에 최대 몇번 Activation이 가능한지 설정할 수 있다.

예를 들어 1ms 주기의 TASK A가 있는데 TASK A의 실행시간이 1ms를 초과한다면, TASK A가 아직 실행중인데 TASK A가 또 한번 Activation 될 것이다. 이런 경우가 Activation이 2번 된 것이다.
만약 해당 Task의 Activation 제한값이 1인 경우,이때 에러로 판단해서 OS hook이 발생한다.

한편, Sw디버깅을 하다보면 break point에 멈춰놓고 쓸 때가 있다.
이때 break point는 cpu를 정지시키는 것이기 때문에 STM Timer는 여전히 돌아가고 있다.
그러므로 break point에 cpu가 멈춰있는 동안에도 STM의 타이머 인터럽트가 Pending이 될 것이고.. break를 푸는 순간 타이머 인터럽트가 실행되면서 Task를 Activate 할 수 있다.
이때 break point 잡아놨을때 task가 이미 실행중인 상황이었다면 이로 인해 Activation number가 2가 될것이고..
만약 이 값을 1로 제한해놨다면 에러 훅이 발생한다.

이런 상황을 방지하려면 break point에 멈출 때 STM Timer도 멈춰놓으면 되는데, aurix는 이런 기능을 제공하고 있다.

OCS 레지스터의 SUS라는 비트필드인데 이 값을 2로 셋팅하면 된다.
그러면 CPU Break 할 때 타이머도 같이 멈춘다.
참고로 OCS 레지스터는 MCU 하나에 1개 존재하는게 아니라 타이머마다 따로 존재한다.

그래서 STM0 OCS , STM1 OCS 등이 있고
STM 말고 GTM같은 다른 타이머도 각자 OCS 레지스터가 있다.
GTM도 멈추고 싶으면 GTM의 ocs SUS비트 필드값 바꾸면 된다.

T32에서 CMM 명령으로 만들어두고 사용하면 편리하다. 아래 내용 참고

※ 위 예시코드에서 F00010E8 은 stm timer 0다
stm x에 적용시 주소값 x x 0x100 하면됨.
ex) stm1에 적용시 0xF00011E8
       stm2에 적용시 0xF00012E8

반응형

'자동차 임베디드 SW > 툴- T32' 카테고리의 다른 글

Flash write,erase시 유의사항!!!  (0) 2023.02.09
t32 dump file로 저장하기  (0) 2023.02.08
T32 System Menu  (0) 2022.09.07
T32 Flash 관련  (0) 2022.08.01
Trace32 cmm 개요 및 유용한 명령어들  (0) 2021.11.12