TOPPERS/TTSP를 athrill에서 작동 (TTSP의 대상 종속 코드 구현)
개요
이 기사는 "TOPPERS/TTSP 작동"의 TTSP의 대상 의존부에 대한 해설 기사입니다.
종속 코드는, 이하의 4종류/합계 9개가 있습니다.
구현 개요 및 상세
타이머 의존부
전제 지식으로서 ASP의 시스템 시간은 1ms주기 타이머로 정기 갱신 (signal_time ())됩니다.
TTSP 테스트에서는 시스템 시간 관리용 타이머를 정지/시작/1ms 진행시키는 API를 사용하여 ASP의 시스템 시간이 적절하게 갱신/비갱신되었는지 확인합니다.
(1) 정지: ttsp_target_stop_tick
타이머를 정지시키기 위해, 이하의 조작을 실시.
1. 인터럽트 컨트롤러의 인터럽트를 금지 상태로 설정
2. 타이머 동작을 정지
3. 펜딩 중 인터럽트 요구도 클리어
SIL_PRE_LOC;
SIL_LOC_INT();
x_disable_int(INTNO_TIMER);
SetTimerStopTAA(INTNO_TIMER);
x_clear_int(INTNO_TIMER);
SIL_UNL_INT();
(2) 시작: ttsp_target_start_tick
타이머를 시작하기 위해 다음 작업을 수행합니다.
1. 타이머 동작 시작
2. 인터럽트 컨트롤러의 인터럽트를 허가 상태로 설정
SIL_PRE_LOC;
SIL_LOC_INT();
SetTimerStartTAA(TIMER_DTIM_ID);
x_enable_int(INTNO_TIMER);
SIL_UNL_INT();
(3) 1ms 진행: ttsp_target_gain_tick
시스템 시간을 1ms 진행시키기 위해 타이머 인터럽트가 한 번 발생합니다.
이 기능을 구현하기 위해 다음 대기 처리가 수행됩니다.
이 함수의 호출 조건은 타이머 정지 상태로 설정됩니다.
SIL_PRE_LOC;
SIL_LOC_INT();
x_disable_int(INTNO_TIMER);
SetTimerStopTAA(INTNO_TIMER);
x_clear_int(INTNO_TIMER);
SIL_UNL_INT();
SIL_PRE_LOC;
SIL_LOC_INT();
SetTimerStartTAA(TIMER_DTIM_ID);
x_enable_int(INTNO_TIMER);
SIL_UNL_INT();
SIL_PRE_LOC;
SIL_LOC_INT();
SetTimerStartTAA(TIMER_DTIM_ID);
x_enable_int(INTNO_TIMER);
do_halt();
SIL_UNL_INT();
SIL_LOC_INT();
x_disable_int(INTNO_TIMER);
SetTimerStopTAA(INTNO_TIMER);
SIL_UNL_INT();
이하, 상기 함수 실행 후의 타이머 의존부의 테스트 실행 결과입니다.
[CPU>
system1 : 0
system2 : 10
timer_interrupt : OK
system1 : 10
system2 : 10
ttsp_target_stop_tick() : OK
system1 : 19
system2 : 20
ttsp_target_gain_tick() : OK
system1 : 21
system2 : 31
ttsp_target_start_tick() : OK
Check point 1 passed.
All check points passed.
q
[NEXT> pc=0x8d0a target_config.c 44
[DBG>e
clock = cpu 20426497 intc 1767 real_time 35.077789
인터럽트 의존부
(4) 인터럽트 발생 : ttsp_int_raise
이 함수는 인수 (intno)의 값을 인터럽트 번호로 사용하여 인터럽트를 생성해야합니다. 실기상에서 임의의 인터럽트를 발생시키는 것은 곤란하고, 타이머 인터럽트를 이용하는 것으로 어떻게든 요구 사양을 만족시키는 형태가 된다고 생각됩니다.
반면에 가상 환경에서는이 부분이 잘 작동합니다. 특히 프로그램 실행 중에 인터럽트를 생성 할 수 있도록 athrill은 디버깅 변수 athrill_device_raise_interrupt를 제공합니다. 이하, 실장 상세입니다.
athrill_device_raise_interrupt = intno;
위의 변수 할당 직후 인터럽트가 발생합니다.
(5) 인터럽트 요구 클리어 : ttsp_clear_int_req
이 함수는 인수 (intno)의 값을 인터럽트 번호로 사용하여 인터럽트 요청을 지 웁니다.
이하, 실장 상세입니다.
x_clear_int(intno);
이하, 상기 함수 실행 후의 인터럽트 의존부의 테스트 실행 결과입니다.
[CPU>Check point 1 passed.
Check point 2 passed.
ttsp_int_raise(TTSP_INTNO_A) : OK
Check point 3 passed.
Check point 4 passed.
Check point 5 passed.
ttsp_int_raise(TTSP_INTNO_A) : OK
Check point 6 passed.
Check point 7 passed.
Check point 8 passed.
ttsp_int_raise(TTSP_INTNO_D) : OK
Check point 9 passed.
ttsp_int_raise(TTSP_INTNO_E) : OK
Check point 10 passed.
ttsp_int_raise(TTSP_INTNO_F) : OK
Check point 11 passed.
ttsp_int_raise(TTSP_INTNO_A) : OK
Check point 12 passed.
ttsp_int_raise(TTSP_INTNO_B) : OK
Check point 13 passed.
ttsp_int_raise(TTSP_INTNO_C) : OK
Check point 14 passed.
Check point 15 passed.
Check point 16 passed.
All check points passed.
q
[NEXT> pc=0x92b8 target_config.c 44
[DBG>e
clock = cpu 908748 intc 520 real_time 0.596828
위의 테스트 내용을 분석 한 결과를 시퀀스 다이어그램에 남겨 둡니다.
CPU 예외 의존부
(6) CPU 예외 발생 : ttsp_cpuexc_raise
이 함수는 인수 (excno)의 값을 예외 번호로 CPU 예외를 발생시켜야합니다.
이번에는 TRAP 명령으로 CPU 예외를 발생시키기로 결정했습니다.
이하, 실장 상세입니다.
do_trap(0x01);
(7) CPU 예외 발생시의 후크 함수 : ttsp_cpuexc_hook
athrill 고유의 후크 함수 구현이 불필요하다고 생각되었으므로 일단 구현 대상에서 제거했습니다.
이하, 상기 실장을 실시해, CPU 예외 테스트를 실행한 결과입니다.
Check point 1 passed.
[TSK]ttsp_cpuexc_raise(TTSP_EXCNO_A) : OK
Check point 2 passed.
Check point 3 passed.
Check point 4 passed.
[TEX]ttsp_cpuexc_raise(TTSP_EXCNO_A) : OK
Check point 5 passed.
Check point 6 passed.
Check point 7 passed.
Check point 8 passed.
[ALM]ttsp_cpuexc_raise(TTSP_EXCNO_A) : OK
Check point 9 passed.
Check point 10 passed.
Check point 11 passed.
Check point 12 passed.
[CYC]ttsp_cpuexc_raise(TTSP_EXCNO_A) : OK
Check point 13 passed.
Check point 14 passed.
Check point 15 passed.
All check points passed.
작업 의존부
athrill 고유의 태스크 의존 처리는 불필요했기 때문에, 구현 대상에서 제외했습니다.
관련 기사
Reference
이 문제에 관하여(TOPPERS/TTSP를 athrill에서 작동 (TTSP의 대상 종속 코드 구현)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kanetugu2018/items/43fdcb578f1d9c1dcbcb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)