목록분류 전체보기 (95)
total_activ
삭막한 취준 생활을 한 25년도를 마무리하며 스스로 올 한해를 털어버리기 위해 겨울 캠핑을 갔다.내 취미는 겨울 캠핑과 스노우보드 두가지가 있는데 둘의 공통점은 한해를 마무리하며 새로운 해에 대한 준비를 위해 과거를 털어버리기 위한 행위이다. 사실 스스로가 생각하기에 매번 끊임없이 무언가를 하는 타입인 만큼 번아웃에 대한 두려움도 큰 편이다. 그래서 어느 순간 취미를 만들며 이 번아웃을 해결할 방법을 모색했고 그 결과 가지게 된게 겨울 캠핑이다. 더욱이 25년도는 많이 울었던 만큼 사회의 한 구성원으로, 조직에 소속되는게 어렵다는 것을 몸소 느껴봤기 때문에 캠핑을 꼭 가고 싶었다. 캠핑장 선택 과정!친구랑 단둘이 가지만, 둘다 뚜벅이인 만큼 서울 근교로 캠핑을 갔다.뚜벅이도... 접근 가능한.. 낭만 넘..
사전에 이미 reserved_memory를 /dev/mem에 매핑함. 크기는 4MiB임.One-shot 모드BD를 사용하지 않고 시작주소와 길이만 DMA에게 전달하면, 그만큼만 딱 한 번 전송하고 끝.다음 전송은 소프트웨어가 직접 다시 SA/LENGTH 설정해서 “다음 것도 해줘”라고 또 부탁해야 함.1) I2SCOUNT_REGTRANSFER_CONTROL =1 (RX enable)2) DMADMACR_RESETDMACR_RS = 1DA, LENGTH 제공3) I2S STREAM_CONTROL_REG=1 (RX Run)4) DMA DMACR_IDLE 확인완료된거 확인 시, fwrite(ub, 1,bytes,f); 을 통해 DDR 버퍼로 부터 음성 데이터 읽기 SG 모드 DDR 어딘가에 BD 리스트를 만..
Zybo Z7-10 오디오 실시간 스트리밍 구조 정리Baremetal DMA Demo → PetaLinux 기반 MIC/SPK UDP 스트리밍Zybo 보드에는 오디오 코덱(SSM2603)과 I2S, AXI DMA가 기본으로 들어 있어서, 마이크 입력을 받아 스피커로 재생하는 데모가 Digilent에서 이미 제공된다.이번 글에서는Digilent에서 제공하는 baremetal DMA 오디오 데모를 간단히 정리하고,그 구조를 기반으로 내가 작성한 PetaLinux 기반 실시간 스트리밍(MIC/SPK) 코드가어떤 식으로 확장·변형됐는지 설명한다.1. 전체 시스템 개요구성은 다음과 같이 보드 두 개가 협업하는 구조다.MIC 보드마이크 입력(코덱 ADC) → I2S RX → AXI DMA S2MM → DDR 버퍼일..
최종 통합한 Vivado IP블록들 부터 보여주겠다. 사실 Audio이외에 통합은 된 상태에서 뒤늦게 Audio FPGA가 성공되어 통합을 마지막으로 했다.하지만 가장 큰 난관이었다.제공해야하는 클럭이 달라서 기존의 processing_system7_0/FCLK_CLK0 -> 100Mhz인 것의 충돌이 있다. Vivado 오디오 코덱 + LM75B + CAN + Serial + TCP 통합기록주파수 문제 때문에 삽질한 과정과 최종 해결 방법 정리이번 프로젝트에서는 기존에 잘 동작하던 오디오 코덱 Vivado 프로젝트에 새로운 IP들(LM75B 온도 센서, CAN, RS485Serial, TCP 기능)을 통합하려고 했다.언뜻 보기에는 간단해 보였지만, 의외의 부분에서 발목을 잡았고 그 과정을 기록해두고자..
1. 어떤 I2C를 쓸 건지 다시 구분PS I²C (MIO) → 우리가 하는 과정Zynq PS 내부 하드 I²C 컨트롤러Vivado에서 MIO Configuration → I2C0 (or I2C1) 체크만 하면 끝Device Tree에 자동으로 cdns,i2c 노드가 생기고, 부팅 후 /dev/i2c-0 혹은 /dev/i2c-1로 나타남PS I2C(EMIO)https://totalactiv.tistory.com/151 이 링크에서 EMIO로도 해봄PL AXI IIC (AXI IP)PL에 AXI IIC IP를 넣고 PS와 AXI 버스로 연결Device Tree에 xlnx,axi-iic 노드가 생김/dev/i2c-*로도 올라오지만, 여기서는 Fabric Interrupts 설정 필요 1) Vivado 프로젝..
Digilient사에서 제공하는 예제 데모 파일를 그대로 사용했기 때문에 Vivado 설명은 생략하겠다. https://digilent.com/reference/programmable-logic/zybo-z7/demos/dma-audioDigillent사에 올라온 오디오 코덱 예시 비바도 디자인을 사용해서 페타리눅스에서 오디오코덱 드라이버 사용해보려고 하는데 자꾸 실패 → sound card를 못 읽어온다실패 원인오디오 코덱에 관련된 비바도 ip → xilinx 표준 ip가 아니라 Digilent사에서 만든 커스텀 ipXilinx 메인라인 ASoC 드라이버 대상인 xlnx,i2s-transmitter/receiver(+ audio-formatter) 라인업과는 바인딩/드라이버가 다르다.페타리눅스에서 제공..
LM75B Vivado아래 링크를 참고해주세요. https://totalactiv.tistory.com/151CAN Vivado LM75B와 CAN 통합 과정(1) UIO를 쓰게된 이유IP 블록 자체가 Custom된 외부 자료로 가져온것 이기 때문에 사용자 직접 제어가 필요하다고 생각했음 항목 표준 커널 드라이버 (예: SocketCAN) UIO 드라이버 (우리가 사용한 방식) 편의성매우 높음매우 낮음 (베어메탈 수준)코드 복잡도매우 낮음 (간단한 명령어 또는 소켓 프로그래밍)매우 높음 (레지스터 직접 제어)제어 수준낮음 (드라이버가 정해준 기능만 사용)매우 높음 (하드웨어의 모든 기능 직접 제어)성능좋음 (커널 오버헤드 약간 존재)최고 (커널을 거치지 않아 지연 시간이 거의 없음)주 사용처표준적인..
Vivado1) 전체적인 블록 다이어그램 2) Zybo 설정3) wrapper4) .XDC (pmod로 직접 i2c 핀을 할당함)set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { i2c_scl_io }]; # PMOD JC1set_property -dict { PACKAGE_PIN W15 IOSTANDARD LVCMOS33 } [get_ports { i2c_sda_io }]; # PMOD JC2set_property PULLUP true [get_ports { i2c_scl_io }]set_property PULLUP true [get_ports { i2c_sda_io }]V15 : 핀 1W15 : 핀2주의 할점: wrapp..
Vivado → Vitis → Device Tree등 커널 config → PetaLinux vivado에서 gpio와 spi fpga 인터페이스를 설계하고 ip를 할당해놓은 상태이다. (1) Vitis prj 열기admin$ pwd/xilinx/2022/Vitis/workspaceadmin$ vitis & (2) spidev_lcd_test.c 수정admin$ cat /usr/include/linux/spi/spidev.h |grep SPI_CS_HIGH#define SPI_CS_HIGH 0x04보통 SPI_CS_HIGH는 activ-low이기에 activ-high여야지 작동을 한다.( 즉 디폴트가 low상태임) (3) Build Project(4) elf 파일 이동admin$ cd /xilinx/2..
간단하게 stm32 보드를 활용해서 버튼에 따라 panel UI가 변경되는 미니 플젝을 진행했다. freeRTOS를 기반으로 3개의 task를 활용했다.사용자가 엑셀 버튼을 누르면 속도 게이지가 증가한다.버튼을 아무것도 안누르면 속도 게이지는 천천히 줄어든다.사용자가 브레이크 버튼을 누르면 속도 게이지는 가속도를 가지며 빠르게 줄어든다.신호등은 빨강, 노랑, 초록색을 번가라가면 켜진다.만일 빨강색 신호에 속도 게이지가 10 이상이면 DANGER DRIVING 문구를 띄운다.정상적으로 노랑색과 초록색 신호에 속도 게이지가 10 이상이라면 SFAE DRIVING 문구를 띄운다.최종 시연 영상 & TouchGFX 이미지 & .ioc 구성 Task에서 하는 일 (FREERTOS)task에서는 엑셀 버튼과 브레..
절대 우선순위1. taskENTER_CRITICAL2. 일반 인터럽트 (TICK, IRQ, ISR)3. 높은 우선순위 테스크4. 낮은 우선순위 ISRISR (인터럽트 핸들러함수)는 테스크 보다 먼저 실행된다. 그렇기에 ISR에는 무거운 작업을 진행하면 안된다. (ex. memcpy함수)따라서 IPC(xSemaphoreGive)을 활용해서 테스크에서 일을 수행하도록 구현해야한다. IPC 함수 예시는 아래와 같다.xSemaphoreGiveFromISR ()vTaskNotifyGiveFromISR ()xQueueSendFromISR()xMessageBufferSendFromISR() 실습 배경실제로 heavyCopyLoader함수에서 memset()을 진행하여 오랜 시간 소비되는 함수를 만들었다. Task1과..
vTaskDelay와 HAL_Delay 관계vTaskDelay와 HAL_Delay 함수가 헷갈려서 정리해본다.HAL_Delay함수는 호출한 함수나 태스크가 멈춰버리는 Blocking 상태로 만든다.하지만 vTaskDelay함수는 태스크를 대기시키고 다른 태스크 실행을 가능캐한다.이점에서 vTaskDelay함수는 RTOS에서 사용되는 함수이다. HAL_Delay()RTOS를 사용하지 않거나, 매우 간단한 지연이 필요할 때RTOS 태스크 외부(예: 초기화 코드)에서 잠시 멈춰야 할 때vTaskDelay()FreeRTOS 환경에서 멀티태스킹을 활용해 효율적으로 시간 지연을 구현할 때CPU 자원을 낭비하지 않고 다른 태스크와 병행 작업을 수행해야 할 때 간단하게 다시 설명하자면 vTaskDelay함수는 아래의..
vTaskDelay 함수는 Block상태로 빠지는 대표적인 함수이다.해당 함수는 아래 처럼 사용된다.void Task1( void *pvParameters ){ const char *pcTaskName = "Task1"; pvParameters = pvParameters; // for comipler warning /* Print out the name of this task. */ printf( "%s is running\r\n", pcTaskName ); while(1) { vTaskDelay (pdMS_TO_TICKS (1000)); printf("a"); fflush(stdout); // 문자 'a' 출력 task1timer++; }} 이 함수의 정의로 가보면 아래와 같다.void vTa..
동적 메모리 할당1. 동적 메모리 할당으로 테스크 생성시 TCB 및 스택 메모리 확보 방식FreeRTOS가 런타임에 메모리를 할당해서 테스크를 생성할 수 있도록 허용한 경우만 아래와 같은 과정을 지나간다.#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )xTaskCreate()를 통해 테스크 생성함이후 TCB를 Heap 공간에 만듦해당 할당 메모리는 .bss 섹션에 저장됨1.1 xTaskCreate()이 함수는 configSUPPORT_DYNAMIC_ALLOCATION == 1일 때만 존재한다.즉, FreeRTOS가 런타임에 메모리를 할당해서 테스크를 생성할 수 있도록 허용한 경우만 컴파일됨1.2 pvPortMalloc(). pxNewTCB = (TCB_t *) pvPortM..
태스크 생성 및 운용#define TASK_MAIN_PRIO 20 //숫자가 큰게 우선순위가 높음#define TASK_1_PRIO 10#define TASK_2_PRIO 9#define TASK_3_PRIO 8태스크의 우선순위는 숫자가 클수록 높다. 하지만, Contex-M에서는 우선순위 숫자가 작을 수록 높다. TaskHandle_t xHandleMain, xHandle1, xHandle2; void USER_THREADS( void ) //main 함수에 호출{ /* Create one of the two tasks. */ xTaskCreate( (TaskFunction_t)TaskMain, /* Pointer to the function that implements the task. *..