전체 글 174

Excetption , JTAG, ICD (완)

Memory Map :: 다른데는 다 FF 인데 > 0xFD 이면 > SDRAM 불량 ICE : In-Circuit Emulator   Host의 Debugger > Taget 의 Regi, memory내용 > 실시간 읽고쓰기 + break point + step : go-break 를 한번에 해줌  > step-by-step 으로 관찰가능 > with Host ) USB , Ethernet , Paralled 로 통신   with Target ) JTAG    > HW pin 직접 control 가능 ARM : JTAG MACRO cell 존재 : bountdary scan 기술적용    > CPU상황 모니터링 JTAG : 프로세서를 들여다 볼수있음 + memory access , CPU 하는일 중간에..

watch dog Reset in ISR

High Reset Vector : 0xFFFF0000  Reset 발생  system mode (USR)R14 값 OR13 : ISR 처리 한 후 > system mode 의 stack 의 시작부분을 가르킴  // push 한 부분을 다 pop 했으므로   > 근데 여기서의 R13은 그렇지 않음 //system Mode 의 stack 시작은 0x00FEEE730 부터! >>>ISR 을 처리하다가 HW reset 즉, Watchdog Time out으로 죽었다는걸 유추가능 자 그다음, USR 의 R14 : 0x47B1 로 가보면.. 000047AC|       bl   0x11280000047B0 |       ldr r0,0x4844 0x47B0 으로 들어오기 위해 47AC 에서 R14에 47B1 을 ..

0x0 go

Reset_Handler 에서 멈춤 !> Reset 걸림 >HW reset 외에 또 reset 이 있나? > 없음>SW 적으로 PC의 0x0 에 우연히 들어가게 되어 발생함>Reset Vector 가 High Vector 가아닌 Low Vector에 걸림 ( PC : 0 ) >>stack 을 깨먹는 드러운 상황이 아니고서는 LR을 뒤져보는것이 매우 효율적  R14 : 0x00EDCF3B    > 최하위 bit 1 :       1 : thumb mode 로 복귀     0;  ARM mode로 복귀// CPSR 이 하위 bit 5 가 thumb/ ARM 현재 상태 나타내는 구별 >> Thumb mode로 돌아오므로     : 0xEDCF3A ( 0xEDCF3B -1 ) 로 돌아올 준비를 함 0xEDCF3..

Abort is ISR - IRQ mode 에서의 Abort

Abort 발생 SPSR : 8000003F :  8000 0000 0000 0000 0000 0000 0011 1111    > 11111 (하위 5bit ) : System mode                                  > ISR을 실행하는 mode    > R14 를 확인해보자 (Abort의 R14는 믿을만함 )                                 // 넘어간 후에발생한 상황이므로 > R14 : 0x476A  clock_tick_isr() 이라는 함수에서 ABORT 발생   > clock tick interrupt 가 발생할때마다 불리는 ISR 이 아닐까?  typedef struct{  boolean (* HWIO_OP)(void);  void (* HW..

Stack corruption

prefetch_handler :: prefetch Abort 가 난상황!     R14 : 0x2   >> ?? 모름>R13 확인 ( SP) 인데 이전 mode 의 R13을 확인해야함    > Abort mode의 stack 을 가르키고있음 (  현재 error는 prefetch Abort인데) 이전 mode의 상태는 SPSR에 저장되어있음   :  40000033 == 0011 0000 0000 0000 0000 0000 0011 0011    > 10011 (하위 0~4bit ) : SVC mode    >  1 (하위 5 bit ) : Thumb 모드  >SVC 의 R13 확인 : 0x0116FD24   FFFFFFFF 만있다.. +SVC R14도 FFFFFFFF....>>>이럴때는  stack ..

UART, DMA

1. DMA 없이 버퍼를 사용하는 경우CPU가 데이터를 한 바이트씩 처리해야 하기 때문에 느려질 수 있습니다.동작 방식:주변 장치(UART, SPI 등)에서 한 바이트 데이터를 수신.CPU가 인터럽트를 받아 데이터 처리.데이터를 버퍼에 저장하거나 출력.이 과정을 데이터의 총 바이트 수만큼 반복.문제점:CPU 부하 증가: 데이터 처리량이 많아질수록 CPU가 모든 바이트를 처리하느라 작업이 지연됩니다.속도 제한: 인터럽트 빈도가 높아지고, 주변 장치와 메모리 간 데이터 이동 시간이 길어질 수 있습니다.실시간성 저하: CPU가 다른 작업을 처리할 시간이 줄어듭니다.2. DMA를 사용한 경우DMA는 CPU의 개입 없이 데이터를 한 번에 블록 단위로 전송하므로 훨씬 효율적입니다.동작 방식:DMA가 특정 메모리 버..

Data Abort

Abort .. 는 원인찾ㄱ기가 쉬운편 system에 Abort   > Abort Vector 에 break 걸어놓고 기다려보기  >   Abort Exception Vector 에 break 걸린상황! R14 (LR) : Abort 난 곳의 +8 지점을 가르킴  Interrupt : Lock   ( I I )CPSR : Abort mode  (abt)  // 전전편에서는 (svc)R14 : 어디에서 왔는지 알려줌 >  -8  // 26-8 = 1EST : 00EDCF1E | 6008               str       r0,[r1]           ;return r1 : 0x FFFFFFFFr0 : 8 >> r0 의 값을 r1 이 가르키는 주소에 넣어주려다가 문제가 생긴걸로 보임> 0xFFFF..

Task Lock > Watch Reset, 메모리덤프 보는법 ( stm32 cubeide)

PC : High Vector 리셋이 나자마자의 상황 : 즉, R14 : 1323 - 1 = 1322    R14의 위치00001322 | BD80            pop {r7,pc}// 스택에서 2개를 빼내어 r7, pc 로 pop 0000131E| FFAFF00F               bl    0x11280 ; Interrupt_Free>R14 : 0x11280  갔다가 돌아올자리  PC의위치    : Interrupt_Free 내부 or R14가 위치하고있는 함수 내부   > SP (R13) 참고   SP (R13) : 0x0116FD3C  0x00000000 을 가르킴 > 근방에서 문제가 발생했을거임 ST : 00001322 | BD80     pop {r7,pc} 을 실행하자마자 라고..

Interrupt Lock > Watch dog Reset

Reset 이 나버렸으면... Context 를 자세히 들여다 보자  CPSR : D3 : 1101 0011 에서 하위 5개 bit ( 4 bit까지 ) : 10011 : Supervisor mode   6 bit : F  : 1   7 bit : I   : 1==  I I   : I 가 1 F F  : F 가 1// I,F 가 활성화 이면 I I , F F// 비활성화 이면 I 옆에 공백, 쓰레기값>>  IRQ, FIQ Lcok Reset Exception > SVC modeSPSR : 0x10 : Reset 하자마자 온거라 신뢰도 X       L14 (R14) 의 위치는? ( 0x0EDCF19 ) R14: 복귀주소를 저장하는 레지스터  > 그때 당시 PC 값을 그대로 간직 한뒤 Reset Excep..

Art of Debugging

ARM : 이상감지 > Exception 처리                           : Recovery (Abort 발생) or Exception 발생하지 못하도록 알려줌 보통 Embedded) : Abory (중단) 발생!recovery 대신 HW적인 reset 함수로 branch  : Target 동작중 reset > Abort Hanler에 Debugger로 break ! ex) HW적으로 High Exception Vector를 사용하는 system      Power on > 0xFFFF0000 영역의 Reset Handler 에 PC가 자리잡음// 0xFFFF0000 : High EVT , bootloader 가 있음 // NOR Flash Bootloader 1. Power on >..