임베디드/펌웨어 기초 9

스타트업 코드 분석

0.  링크 스트립트프로그램의 메모리 배치를 정의.text, .data, .bss 등의 섹션 위치 및 크기를 지정ROM, RAM 주소 지정벡터 테이블, 스택, 힙의 위치를 지정     스타트업 코드시스템이 부팅될 때 초기화 코드 실행벡터 테이블 설정.data 섹션을 RAM으로 복사.bss 섹션을 0으로 초기화스택과 힙을 설정main() 함수 호출 1. .bss 섹션 > 초기화안한 변수에 0 을넣어줌 >  안해주면 쓰레기값이 들어감    > 초기화안한변수는 .bss 안에 넣어야함 2. Vector Table ~= 함수포인터들의 배열 Reset 부터 Main()으로 가는 과정!/*STM32 Programmaing manual 참고 + startup code, linker script, Debug > .map..

FreeRTOS porting

RTOS 사용 : thread 들이 거의 동시에 동작하면서도(실제로는 CPU가 왔다갔다)    그와중에 진짜 필요한 task는 우선적으로 실행될 수 있도록함 (우선순위) 0. STM32 cubeide > from1.5.0 1. cube32 Folder > Third party > FreeRTOS Folder2. lib 폴더에 복붙3.빌드제외     CMSIS V2      portable Folder > gcc, memmang 이외      GCC Folder      > ARM_CM3        이외     Mammeng        > heap_4              이외                              // 정적으로 스택메모리 사용 (static)4. Include    I..

UART, DMA

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

reset

리셋버튼 Bit 26 PINRSTF:PIN reset flag Set by hardware when a reset from the NRST pin occurs. // NRST 핀으로부터  hw 적으로 리셋플래그It is cleared by writing to the RMVF// RMVF 로부터 writing 되어야 값초기화bit. 0: No reset from NRST pin occurred 1: Reset from NRST pin occurred BKP introductionThe backup registers are forty two 16-bit registers for storing 84 bytes of user application data.They are implemented in the bac..

USB CDC

1. USB 핀셋팅2.middle ware > USB_DEVICE >  CDC > 버퍼사이즈 조정 3. 클럭설정 > 48MHZ 필요, : CPU 클럭 72 로 다시 바꿔줘야함 or 1.5 prescaler  4. inc , app 파일 include 경로설정5. 재복사 > hal_cof, it.c, clock(main.c > systemClock) statup_handler 문제ex) sysTick_Handler 같은건 .word SysTick_Handler                                       >> startup코드에 구현되어있음 6. main 에서 초기화, 헤더파일 가져옴7. 메모리 문제.. 47%나 잡아먹음8. 세팅 > optimize for size     > 20..

stm32 mx >LED

lib 파일내에 cube MX 로 코드 프로젝트 생성 > 참고용으로 사용   > core 파일 >  resource configuration > exclusive from build inc 파일들 다 path 참조 stm32f1xx.h: #define STM32F103xB  STM32F103C8 > STM32F103xB : preprocessor 에 추가 msp, it.c , system 파일들도 복사해주기 ( include 포함) conf.h ( config) : 주변기기들 수정될때마다 따로 복사해주어야함 clock conf, HAL_Init, error_handler 도 복사해주고 > bsp.c void MX_GPIO_Init(void){  /* GPIO Ports Clock Enable */ __H..

초기설정

최소한의 파일main, start_up, .ld ( linkedlist )   ldscript : 메모리 할당startup : main함수 직전까지  /* Highest address of the user mode stack */_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */> 스택은 끝주소부터 점점 작아짐  .section .isr_vector,"a",%progbits .type g_pfnVectors, %object g_pfnVectors: .word _estack  //   >> 스택 ,즉 끝부분 부터 시작 .word Reset_Handler  // 그다음 리셋핸들러 함수로 jump .word NMI_Handler .w..