고급 개발자로 가는 길
반응형

C 5

[C언어] sram open 및 설정

임베디드 시스템에서의 C 언어를 통해 sram 메모리를 읽어와 설정 하는 부분을 진행 해 볼것이다. 우선 OS 는 Custom OS 이다. 완전한 리눅스랑은 상이하다. /dev/mem 에 메모리 장치 파일이 존재한다. 즉, 메모리 장치 파일에 접근하여 파일의 메모리 공간을 가져와야 한다. 메모리 공간을 가져오는 방법으로는 lseek or mmap 등이 존재한다. 이 중 mmap 방법을 활용해 볼 것 이다. void *pMem_sram; unsigned shortusi; unsigned short*usp; intfd_sram; fd_sram = open("/dev/mem", O_RDWR); if( fd_sram < 0 ) { printf("ERROR: Failed to open SRAM\n"); exit(..

C 2021.03.29

[C언어] 비버퍼링 버퍼링 파일 함수 open, fopen 등

비버퍼링 함수인 open과 버퍼링 함수인 fopen 에 대해 설명 해 볼 것이다. 먼저 open 함수는 함수 호출에 의해 커널 내의 시스템 호출이 바로 실행되는 것이다. 비버퍼링 함수는 파일 디스크립터에 의해 작동 된다. 파일 디스크립터란 프로세스가 파일들을 접근할때 커널이 식별하기 위한 값이라고 볼수있다. 즉 파일을 열면 파일 디스크립터를 반환하게 된다. 파일 디스크립터는 음수가 아닌 정수로 반환이 된다. 파일 디스크립터 0 = 표준 입력 standard input, 1 = 표준 출력 standard output, 2 = 표준 오류 standard error 바로 이 파일디스크립터를 사용하여 리눅스에서 리다이렉션 등에 사용한다. 비버퍼링 함수 open(), creat(), read(), write(),..

C 2021.03.29

[C언어] pthread_t 스레드 생성 sched_param 스레드 스케줄링

pthread_t POSIX Thread API 이다 리눅스/유닉스에서 스레드 생성 및 관리 할 수 있다. sched_param 스레드의 스케줄링을 제공한다 구조체의 priority 값으로 우선순의를 정해 스케줄링을 관리한다. 아래는 스레드 생성 및 스케줄링에 관한 소스 이다. #include #define MAX_THREAD_IDX20 #define THREAD_IDX_SOCKET_SERVER0 #defineP_OTH_PRIORITY15 pthread_trt_threadId[MAX_THREAD_IDX]; if ( create_pthread(&rt_threadId[THREAD_IDX_SOCKET_SERVER], 0, 0x8,Thread_Socket_Server, NULL, P_OTH_PRIORITY)) ..

C 2021.03.28

[C언어] POXIS termios RS485 인터페이스 제어

termios POSIX Portable Operating System Interface for UNIX 의 약자 이며, ANSI/ISO 로는 리눅스/유닉스에서 API 제공이 부족하여 API 리눅스/유닉스 에서도 다양한 API 를 제공하기 위해 지원한다. termios 는 POSIX 에서 제공하는 구조체 이다. termios 를 사용함으로서 인터페이스를 설정 및 제어한다. 5가지의 기능인 (입력, 출력, 제어, 로컬, 특수문자) 가 있다. tty 는 사용자와 시스템 간의 통신을 연결해 주는 역할을 한다. #include #define UART1_FILE"/dev/ttyO1" struct termios termios; int fd_uart1_drv1; int rv; fd_uart1_drv1 = open(U..

C 2021.03.27

메모리 직접 접근

C 언어 에서는 포인터를 통해 메모리에 접근을 할 수 있다. 물론 virtual adress 이지만~ 어떻게 포인터로 접근 하느냐 char *p = (char *)0x500000; 이와 같은 방식이다. 어떻게 저런 과정이 되냐하면 *(*)0x5000000; -> 포인터로 가르키게 되는데, 메모리에 접근 할때는 메모리 영역을 설정해줘야 한다. 그러므로 *(char *)0x5000000; -> 이렇게 되며 결국 , *(char *)0x5000000 = 100; 을 해줄 수도 있고... char *p = (char *)0x500000; 이 성립되게 되지. adress 접근에는 무조건 포인터 방식만 있는것은 아니다. #defune PC (*(volatile unsigned char *)0x5000000) 이렇게..

C 2020.03.04
반응형