2017-02-14 17 views
2

특정 위치에 브레이크 포인트를 설정하고 레지스터 중 하나의 값을 기반으로 트리거 조건을 설정하려고합니다. R1 (Cortex-R 제품군 CPU).Trace32에서 브레이크 포인트 조건에 레지스터 사용

trace32에서 수행 할 수있는 방법이 있습니까? 조건 구문은 무엇입니까?

+0

죄송 합니다만, "트리거 조건"이 의미하는 바를 명확히 해주십시오. "이 중단 점은 R1 == 특정 값 인 경우에만 실행을 중단해야합니까?"라는 의미입니다. 그럴 경우, 내가 할 수있는 유일한 방법은 연습 스크립트를 실행하는 중단 점을 설정하는 것이며 연습 스크립트는 트리거 조건을 검사하여 프로세서에서 실행을 다시 시작할 수 있습니다 (" go "명령) 또는 스크립트 실행을 중지하고 제어를 사용자에게 해제 할 수 있습니다. 이는 코드 실행 시간에 일정한 영향을 미칩니다. – juansolsona

+0

조건이있는 일반 프로그램 중단 점을 의미합니다. 정적 또는 최적화되지 않은 스택 변수가 포함 된 조건에서는 간단합니다. 조건의 레지스터가 다른 이유가 무엇인지 분명하지 않습니다. 아마도 레지스터를 참조하는 데 올바른 구문이 누락 된 것일 수 있습니다. T32는 그들을 조작하기 위해 'register.xxx'를 사용합니다. 'watch'창에 넣을 수있는 레지스터를 가진 어떤 구조도 보지 못했습니다. –

답변

3

또한 중단 점 조건에서 레지스터 값을 확인할 수도 있습니다.

그러나 조건부 중단 점은 항상 칩의 런타임 동작에 방해가된다는 점에 유의하십시오. 즉, 타겟 CPU가 중단 점 위치에서 항상 멈추고 디버거가 조건을 평가 한 다음 조건이 충족되지 않으면 CPU를 다시 시작합니다. ("조건부 중단 점"은 "데이터 중단 점"(특정 위치에 기록 된 특정 값)과 동일하지 않습니다. 데이터 중단 점은 많은 칩 (Cortex-R과 같은)에서 방해가되지 않습니다.

기본 트릭은 PRACTICE 함수 Register()를 사용하여 코어 레지스터에 액세스하는 것입니다.

  • Break.Set <prog.addr|symbol> /Program /CONDition Register(<reg.>)==<reg.value>
  • Break.Set <prog.addr|symbol> /Program /VarCONDition \Register(<reg.>)==<value>
  • :

    특정 프로그램 위치에 중지와 코어 레지스터는 특정 값이 포함 된 경우, 중지있어, 다음 명령 중 하나를 사용하려면 프로그램 중단 점을 설정하려면

예 :

  • ,943,210
  • Break.Set P:0x1000 /Program /VarCONDition \Register(R0)==0x42

두 명령의 차이? 첫 번째는 TRACE32 표현식을 사용합니다. 여기서 기호는 링커가 기호를 보는 것처럼 주소를 나타냅니다. 두 번째는 HLL 표현식을 사용하는데, 여기서 기호는 C/C++ 언어와 같은 변수를 나타냅니다. (HLL 표현식 == C 스타일 표현식)

보통 HAL 표현식에 조건을 쓰는 것이 (특히 변수를 처리 할 때) 쉬우 며, PRACTICE 함수를 사용하는 것이 일반적으로 TRACE32 표현식에서 더 쉽습니다.

또한 Break.Set 대화 상자에서 조건을 설정할 수 있습니다. "고급"버튼을 클릭 한 다음 "CONDition"필드에서 조건을 클릭하십시오. "CONDition"필드의 오른쪽에있는 HLL 체크 박스는 HLL 표현식을 사용하는지 여부를 정의합니다.