본문 바로가기

분류 전체보기842

float to hex, hex to float 변환 사이트 https://gregstoll.com/~gregstoll/floattohex/ Floating Point to Hex Converter gregstoll.com Floating Point to Hex Converter 엔디안 변환도 가능하다. float value 가 2면 부호비트 0, 지수부 bias(127)+1=128, 가수부는 전부 0해서 0x40000000 이고 리틀엔디안으로 표시하면 0x00000040 으로 표시를 해야 맞는데 2023. 1. 14.
TMS320F28388D ] 터미널 모니터와 메모리 덤프 터미널 모니터란 시스템의 상황을 모니터하고 터미널에 명령어를 쳐서 여러가지 일을 수행하게끔 하기 위해 윈도우의 명령프롬프트 처럼 MCU에 Command Line Interface를 구현 것을 말한다. 내가 직접 구현한건 아니고 유튜버 baram 님의 영상을 보고 공부하려고 아래 출처 stm32 코드를 가져와 이식했다. 출처 : https://github.com/chcbaram/stm32f411 GitHub - chcbaram/stm32f411 Contribute to chcbaram/stm32f411 development by creating an account on GitHub. github.com C28x 코어는 데이터 타입이 STM32와 달라서 주의할 부분이 있다. char 가 2 byte, int.. 2023. 1. 10.
Windows Forms 시작하기 - 컨트롤의 주요 속성 도구상자 - 모든 Windows Forms - Button 생성 Iconfinder 사이트에서 이미지를 찾고 버튼 우클릭 - 속성을 누른뒤 해당 이미지를 추가한다. More sizes 를 누르면 더 다양한 px 이미지를 다운받을 수 있다. Image Image 밑의 ImageAlign을 눌러 버튼에서 이미지를 위치시킬 곳을 선택할 수 있다. Text Text 를 입력하고 TextAlign 도 선택한다. Font Font 를 굵게 설정하였다. Cursor Form 의 기본 커서는 Arrow 인데 버튼의 커서는 hand로 설정해준다. 버튼에 커서를 올렸을 때만 hand 모양으로 바뀌는 것을 볼 수 있다. Visible False 로 설정하면 사용자가 해당 버튼을 볼 수 없다. Enable False 로 설정.. 2023. 1. 7.
Windows forms 시작하기 - form 속성 새 프로젝트 만들기 - Windows Forms 앱(.NET Framework) 선택 .NET Framework 버전을 선택하고 프로젝트를 생성한다. 보기 - 도구상자 .cs 파일 오른쪽 클릭 - 속성 위의 화면에서 Form 또는 컨트롤을 더블클릭하면 아래와 같이 코딩을 할 수 있는 화면이 나오는데 여기서 또 다시 우클릭 - 디자이너 보기를 선택하면 전의 화면으로 돌아갈 수 있다. 프로젝트의 구조는 아래와 같다. .Designer.cs 파일은 Form에 컨트롤을 추가하거나 수정하면 코드가 자동생성되는 파일이고 그 밑의 .resx 파일은 문자열, 이미지, 개체 데이터가 포함된 리소스 파일이다. 속성 뷰에서는 비슷한 카테고리끼리 그룹핑된 항목별 나열 방식으로 볼 수 도 있고, 알파벳 순으로 볼 수도 있다. .. 2023. 1. 7.
unsigned int 형 tick 변수가 오버플로우 나는 날 unsigned type 4byte 자료형의 범위는 0 ~4,294,967,295 tick 변수가 s 를 표현하는 경우 대략 49,710일(136년)이 경과하면 오버플로우가 나고, tick 변수가 ms 를 표현하는 경우 대략 49.7일이 경과하면 오버플로우가 난다. 2023. 1. 7.
윈도우 소켓 ] 소켓 프로그래밍 용어 및 함수 정리 출처 : 윤성우의 열혈 TCP/IP 소켓 프로그래밍 소켓 생성시 필요한 매개변수 첫번째, 두번째 인자로 전달된 정보를 통해 소켓의 프로토콜이 사실상 결정되기 때문에 세번째 인자로 0을 전달해도 된다. 프로토콜 체계 소켓의 타입 1. SOCK_STREAM 중간에 데이터가 소멸되지 않고 목적지로 전송된다. 전송 순서대로 데이터가 수신된다. 전송되는 데이터의 경계가 존재하지 않는다 여러번의 write 함수호출을 통해 전송된 데이터를 한번의 read 함수 호출을 통해 전부 수신할 수 있고, 반대로 한번의 write 함수호출을 통해 전송된 데이터를 여러번의 read 함수 호출을 통해 수신할 수 있다. write/read 함수 호출 횟수가 큰 의미를 갖지 못한다. 수신된 데이터는 소켓에 존재하는 버퍼에 저장되고, .. 2023. 1. 1.
윈도우 소켓 ] TCP 에코 서버, 클라이언트 및 동작원리 TCP 서버의 함수 호출 순서 TCP 서버에서 listen 함수호출을 통해 연결요청 대기상태에 들어가면 클라이언트가 connect() 함수호출을 통해서 연결요청을 할 수 있다. int listen(SOCKET s, int backlog); s : 연결요청 대기상태에 두고자 하는 소켓 전달. 이 함수 인자로 전달된 소켓이 서버 소켓(리스닝 소켓)이 된다. backlog : 연결요청 대기 큐의 크기정보 전달, ex. 5가 전달되면 클라이언트의 연결요청을 5개까지 대기시킬 수 있다. 적절한 값은 실험적 결과에 의존해 결정하면 되고 일반적으로 웹서버와 같이 잦은 연결요청을 받는 서버의 경우 15 이상을 전달한다. listen 함수 호출이후 클라이언트의 연결요청이 들어왔다면, 들어온 순서대로 연결요청을 수락하고 .. 2023. 1. 1.
TMS320F28388D ] 링버퍼 사용 SCI 에코백 이전글 : 2022.12.30 - [DSP, MCU/TMS320F2838x (C28x)] - 링 버퍼 Circular Buffer 링 버퍼 Circular Buffer 링 버퍼를 구현하기위해선 큐를 먼저 알아야 한다. 큐는 FIFO(First In First Out) 구조로 먼저들어온 데이터가 먼저 나가는 구조이다. 이와 비교되는 자료구조는 LIFO(Last In First Out) 구조인 스택이 있다 eteo.tistory.com 먼저 링버퍼를 사용하지 않는 코드는 다음과 같다. main loop에서 Blocking 방식으로 에코백하는 버전 #include "driverlib.h" #include "device.h" void main(void) { uint16_t receivedChar; Device_.. 2022. 12. 30.
링 버퍼 Circular Buffer 링 버퍼를 구현하기위해선 큐를 먼저 알아야 한다. 큐는 FIFO(First In First Out) 구조로 먼저들어온 데이터가 먼저 나가는 구조이다. 이와 비교되는 자료구조는 LIFO(Last In First Out) 구조인 스택이 있다. 스택은 나중에 들어온 데이터가 먼저 나오는 구조로 함수 호출을 생각하면 된다. 함수가 호출되면 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 스택에 넣어지고 함수에서 리턴 시 스택에서 반환 주소값을 POP하여 해당 함수가 호출되기 이전 상태로 되돌아 갈 수 있다. 다시 돌아와서 링버퍼란 고정 크기의 큐를 마치 처음과 끝이 연결된 것처럼 사용하는 구조를 말한다. 그리고 버퍼에 쓰고 읽을 위치를 알기 위한 head 와 tail 포인.. 2022. 12. 30.
TMS320F28388D ] CM에서 USB MSC 사용 개인 기록용 정리글 CPU1 설정 // Set up the auxiliary PLL so a 60 MHz output clock is provided to the USB module. // This fixed frequency is required for all USB operations. SysCtl_setAuxClock(SYSCTL_AUXPLL_OSCSRC_XTAL | SYSCTL_AUXPLL_IMULT(48) | SYSCTL_REFDIV(2U) | SYSCTL_ODIV(5U) | SYSCTL_AUXPLL_DIV_2 | SYSCTL_AUXPLL_ENABLE | SYSCTL_DCC_BASE_0); // Allocate Shared Peripheral USB to the CM Side. SysCtl_al.. 2022. 12. 28.
TMS320F28388D ] CPU2에서 SD카드 사용 + 속도 테스트 개인 기록용 정리글 CPU1 설정 // 핀먹스 세팅 // GPIO103 -> SDCardCS Pinmux GPIO_setPinConfig(GPIO_103_GPIO103); // SPIC -> mySPI0 Pinmux GPIO_setPinConfig(GPIO_100_SPIC_SIMO); GPIO_setPinConfig(GPIO_101_SPIC_SOMI); GPIO_setPinConfig(GPIO_102_SPIC_CLK); // 칩셀렉트핀 init //SDCardCS initialization GPIO_setDirectionMode(SDCardCS, GPIO_DIR_MODE_OUT); GPIO_setPadConfig(SDCardCS, GPIO_PIN_TYPE_STD); // CS핀 마스터코어 CPU2로 설정.. 2022. 12. 28.
윈도우 소켓 ] UDP 서버, 클라이언트 📝 UDP 소켓과 TCP 소켓의 차이점 TCP 소켓 (연결지향형 SOCK_STREAM) 중간에 데이터가 소멸되지 않는다. 전송 순서대로 데이터가 수신된다. 데이터의 경계가 존재하지 않는다. 소켓 대 소켓의 연결은 반드시 1 대1의 구조이다. UDP 소켓 (비 연결지향형 SOCK_DGRAM) Flow Control 이 없다. 그러므로 SEQ, ACK 같은 메시지 전달을 하지 않는다. 연결의 설정과 해제의 과정이 존재하지 않는다. 데이터 분실 및 파손의 위험이 존재한다. 데이터 전송이 빠름 한번에 전송할 수 있는 데이터의 크기가 제한된다. 서버소켓과 클라이언트의 소켓 구분이 없이 하나의 소켓으로 둘 이상의 노드와 데이터 송수신이 가능하다. UDP 송수신 함수 #include int sendto(SOCKET .. 2022. 12. 27.
STM32 ] 인터럽트 처리 과정 인터럽트 처리과정 프로세스 수행 도중 인터럽트가 발생하면 하던일을 멈추고 인터럽트 벡터 테이블에 저장된 ISR을 호출하게 된다. ISR에서 수행되는 내용은 다음과 같다 . 1. 더 이상 인터럽트가 걸리지 않도록 인터럽트를 disable해둔다. 2. 현재의 레지스터 상태를 모두 stack 메모리에 저장해둔다. 3. 인터럽트를 처리한다. 4. stack 메모리에 저장해두었던 레지스터 값을 복구한다. 5. 다시 인터럽트가 걸릴 수 있도록 Interrupt Source 를 클리어한다. 다시 원래의 프로세스로 복귀한다. startup_stm32f429zitx.s 파일에 정의된 인터럽트 벡터 테이블. 인터럽트에 걸리면 벡터 테이블에 할당된 주소로 뛰게 되는데 Code generation 을 통해 stm32f4xx_.. 2022. 12. 22.
STM32 ] 무료 다이어그램 툴 draw.io 로 SW 설계해보기 UML 다이어그램의 종류 동작 다이어그램 구조 다이어그램 인터랙션 다이어그램 유스케이스 클래스 다이어그램 시퀀스 다이어그램 액티비티 다이어그램 객체 다이어그램 커뮤니케이션 다이어그램 상태 다이어그램 컴포넌트 다이어그램 인터랙션 오버뷰션 다이어그램 배치 다이어그램 타이밍 다이어그램 패키지 다이어그램 컴포넌트구조 다이어그램 참고 : STM32Fx Cortex ARM 프로그래밍 그중에서도 다음은 Activity 다이어그램의 심볼이다. 일반적으로 우리가 알고 있는 플로우차트와 유사하다. 예시. 버튼을 2초 이상 누른 상태로 손을 떼지 않으면 LED가 500ms 간격으로 토글되고 손울 떼는 순간 IDLE로 돌아간다. while (1) { LEDBTN(); /* USER CODE END WHILE */ /* USE.. 2022. 12. 22.
CAN 통신 ] PCAN 사용하기 PCAN-USB 를 사용하면 PC에서 USB를 통해 CAN 네트워크에 연결할 수 있다. 홈페이지 : https://www.peak-system.com/   드라이버 다운로드       PCAN-View 다운로드    매뉴얼    결선 2, 7, 3, 6번 핀만 연결해주면 된다.3은필수이고, 6은 optional ground 이다.   종단저항 관련    최대 버스 길이     PCAN-View 설정 먼저 Bit rate를 맞춘다.    수신 녹화 버튼을 눌러 Trace 를 시작할 수 있다.      Trace 탭에서 실시간 수신되는 메시지를 확인할 수 있다.       송신 메시지모양 아이콘을 누르거나 또는 Transmit 메뉴의 New Message를 선택해 전송이 가능하다. Cycle Time 을 설.. 2022. 12. 22.
윈도우 소켓 ] Winsock 라이브러리 링크하기 Winsock이란? Windows Sockets API(WSA)로 인터넷 네트워크 및 소켓과 관련된 함수들을 제공해준다. Winsock은 버전1과 버전2가 있으며 Winsock1에 여러 기능이 좀 더 추가된 것이 Winsock2이다. 윈도우에서 소켓 프로그래밍을 하기 위해선 헤더를 포함하고 라이브러리를 링크시켜야한다. 라이브러리를 링크하는 3가지 방법이 있다. 셋 중 하나를 택하면 된다. 1. 프로젝트 우클릭 - 속성 - 링커 - 입력 - 추가종속성에 ws2_32.lib 를 추가한다. 2. 소스코드 위에 다음과 같은 전처리기 지시문을 작성한다. #pragma comment(lib,"ws2_32") 3. 링크할 라이브러리의 경로를 찾아가 직접 ws2_32.lib 파일을 프로젝트에 추가한다. (프로젝트 우클.. 2022. 12. 16.
stderr 과 stdout 의 차이. 표준입출력의 버퍼 표준입력(STDIN): 표준 입력 장치의 ID 는 숫자로는 0 이며 일반적으로는 키보드가 된다. 표준출력(STDOUT): 출력을 위한 스트림으로 표준 출력 장치의 ID 는 1이며 일반적으로는 현재 쉘을 실행한 콘솔(console)이나 터미널(terminal)이 된다. 표준에러(STDERR): 에러를 위한 스트림으로 표준 에러 장치의 ID 는 2이며 일반적으로는 표준 출력과 동일하다. strerr(표준에러) 와 stdout(표준출력)은 둘 다 콘솔 화면에 출력한다는 점에서 동일하지만 둘의 차이점의 버퍼링 방식이다. strerr 는 Null buffering 방식으로 버퍼링 없이 바로 출력이 되지만 stdout 은 line buffering 방식으로 개행문자가 들어와야 출력이 되는 것이다. #include .. 2022. 12. 14.
정수 리터럴 뒤에 접미사 UL을 붙이는 이유 변수는 선언할 때 자료형의 크기를 정할 수 있지만 리터럴(상수)는 그러지 못하기 때문에 접미사(suffix)를 활용해 크기를 명시적으로 표시한다. 접미사를 붙이지 않은 경우 정수 상수의 타입은 int 이기 때문에 강제로 unsigned long int 로 만들어 주기위해 뒤에 UL을 붙이는 것이다. unsigned type으로 바꾸는 것은 연산 도중 혹시나 overflow가 일어나서 의도하지 않은 결과가 나오는 것을 막기 위함이다. 정수 리터럴 접미사 자료형 생략시 int L long U unsigned int UL unsigned long LL long long ULL unsigned long long 10진수 뿐만 아니라 16진수에도 접미사를 붙일 수 있다. 실수 리터럴 접미사 자료형 생략시 doub.. 2022. 12. 14.
Visual Studio ] 하나의 솔루션에 여러 프로젝트 만들기 솔루션 우클릭 - 추가 - 새 프로젝트 로 여러 프로젝트 생성 솔루션 우클릭 - 속성 현재 선택 영역에 체크를 해주면 현재 선택된 프로젝트를 빌드할 수 있다. 2022. 12. 14.
Visual Studio ] 빌드 도구(플랫폼 도구 집합 = 'v143')를 찾을 수 없습니다. 해결법 Visual Studio 2022에서 작성한 프로젝트를 Visual Studio 2019로 가져오면 이런 오류를 볼 수 있다. 프로젝트 우클릭 - 구성 속성 - 일반 - 플랫폼 도구 집합에서 설치된 버전으로 선택 2022. 12. 14.
Visual Studio ] inet_addr 에러 발생 시 1. 프로젝트 우클릭 - 속성 - C/C++ - 일반 - SDL검사 "아니오" 2. 프로젝트 우클릭 - 속성 - C/C++ - 전처리기 "_WINSOCK_DEPRECATED_NO_WARNINGS;" 추가 (뒤에 세미콜론이 붙는다.) 3. #include 하고 inet_pton(AF_INET, IP, buf) 을 대신 사용 2022. 12. 14.
Visual Studio ] 디버깅 시에 argument 넘기도록 설정하기 프로젝트 우클릭 - 구성 속성 - 디버깅 2022. 12. 14.
Visual Studio ] 프로그램 배포시 dll 이 없어 실행할 수 없는 문제 해결하기 (vcruntime140.dll, msvcr120d.dll) Visual Studio 에서 작성한 프로그램을 다른 PC에서 실행하려고 할 때 .dll 이 없어 실행할 수 없다는 에러가 발생한다. 이유 : Visual Studio 프로젝트의 기본 설정값이 "동적 라이브러리" 링크로 설정되어 있기때문에, 실행파일(.exe)에 해당하는 dll 라이브러리가 포함 안되어 있어고 라이브러리(.dll) 파일도 없어서 참조하지 못하는 에러이다. Visual Stdio 에서 콘솔 프로그램을 만들때 "정적 라이브러리" 방식으로 컴파일하면 프로그램 용량이 늘어날 수 있지만 dll 오류를 방지할 수 있다. 방법1 프로젝트 우클릭 - 속성 - 구성 속성 - C/C++ - 코드생성 런타임 라이브러리 항목을 debug, release 모드에 맞게 다음과 같이 변경한다. - Debug : 다.. 2022. 12. 14.
C/C++ ] tick / 시간 측정하기 C 인 경우 time.h 를 포함하고 C++인 경우 ctime을 포함한다. #include #include 시간 측정은 두 헤더에 모두 포함된 clock()함수를 사용하면 된다. clock_t clock(void); 반환형은 clock_t 타입인데 따라가보면 그냥 long 타입이다. typedef long clock_t; 그리고 반환하는 내용으로 프로그램 실행 시작부터 경과된 시간을 ms 단위의 정수형으로 반환한다. 사용방법 #include #include int main() { long startTime = (long)clock(); while (1) { long currentTime = (long)clock(); if (currentTime - startTime >= 1000UL) { printf(".. 2022. 12. 14.
용량이 큰 USB를 FAT 또는 FAT32 로 포맷하는 방법 Windows + R, cmd 실행 1. diskpart 2. list disk 3. sel disk * USB를 뽑았다 다시 꼽거나 용량을 보고 선택한다. 4. clean 5. FAT으로 포맷하려는 경우 : create partition primary size=4095 FAT32로 포맷하려는 경우 : create partition primary size=32767 6. //list part sel part 1 (필요시 convert MBR) 7. active 8. format fs=fat quick format fs=fat32 quick 9. assign 끝 2022. 12. 13.
정규표현식 Character What does it do? Example Matches ^ Matches beginning of line ^abc abc, abcdef.., abc123 $ Matches end of line abc$ my:abc, 123abc, theabc . Match any character a.c abc, asg, a2c | OR operator abc|xyz abc or xyz (...) Capture anything matched (a)b(c) Captures 'a' and 'c' (?:...) Non-capturing group (a)b(?:c) Captures 'a' but only groups 'c' [...] Matches anything contained in brackets [.. 2022. 12. 11.
티스토리 ] 코드블럭 라인 번호 매기기 꾸미기 - 스킨편집 - html 편집 - HTML 탭 사이에 아래 코드 카피 CCS 탭으로 이동 맨 마지막 줄에 아래 코드 카피 /* 하이라이트 라인넘버 */ .hljs-ln-numbers { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; text-align: center; color: #B5B5B5; border-right: 1px solid #B5B5B5; vertical-align: top; width: 20px; padding-left: 0px; } .hljs-ln td.hljs-l.. 2022. 12. 11.
TMS320F28388D ] DMA 예제 gsram에서 DMA를 사용해 데이터를 이동시키는 예제    //// Included Files//#include "driverlib.h"#include "device.h"#include "board.h"//// DMA data sections// 이전글에 썼지만 DMA에 접근 가능한 메모리 영역이 정해져 있고 그 중 하나가 RAMGS이다.// 따라서 source 와 destination으로 사용할 버퍼를 RAMGS 영역에 배치하는 전처리 지시 코드가 필요하다.#pragma DATA_SECTION(sData, "ramgs0"); // map the TX data to memory#pragma DATA_SECTION(rData, "ramgs1"); // map the RX data to memory//.. 2022. 12. 11.
TMS320F28388D ] DMA 파악하기 DMA CPU의 관여 없이 하드웨어적으로 메모리간 또는 메모리와 페리페럴간 데이터를 이동시킬 수 있는 컨트롤러이다. DMA의 특징 DMA 모듈이 데이터 이동을 시작하기 위해서는 페리퍼럴 또는 소프트웨어 트리거가 필요하다. 6개의 독립적인 DMA 채널이 있고, 각각의 채널은 PIE interrupt를 가지고 CPU에게 데이터 전송 시작시점 또는 완료시점을 알릴 수 있다. DMA 채널1은 다른 채널보다 우선순위를 가질 수 있게 설정할 수 있다. DMA Block Diagram DMA 가 접근가능한 페리페럴과 메모리 영역에 대해 나와있다. 특히 메모리쪽을 보면 RAMGS는 접근가능하지만 RAMM 이나 RAMLS는 접근을 못한다. DMA를 사용하기 위해 필요한 설정 1. 데이터를 옮길 주소에 대한 설정 : SR.. 2022. 12. 11.
C ] 가변인자 매크로를 활용한 디버그 로그 남기기, Predefined macros 함수의 가변인자 함수가 있듯이 매크로에도 가변인자 매크로가 있다. #define printlog(fmt, ...) printf(fmt, __VA_ARGS__) printlog(fmt, ...) 의 "..."이 "__VA_ARGS__"로 확장된다. 그리고 아래에서 __VA_ARGS__ 앞에 붙은 ##은 인수가 전혀없는 경우에 오류를 내지 않기 위해 gcc에서 도입한 표기법이다. 앞에 ##을 붙이지 않으면 인수가 전혀 없는 경우에 printf("",) 이런식으로 컴마가 붙은채로 확장되어 오류를 낼 것이다. 이런 가변인자 매크로는 디버그용 로그를 남길 때 유용하게 사용된다. C언어에 미리 정의된 매크로들을 사용하여 오류가난 파일명, 라인넘버, 함수명을 알 수 있다. #include #include #defin.. 2022. 12. 11.