본문 바로가기

프로그래밍/C

(14)
[C언어]리눅스 공유메모리(shared memory) 사용하기 ~ Linux내에서 공유메모리를 사용하는 코드입니다. 먼저, 공유메모리란 '컴퓨터 환경에서 여러 프로그램이 동시에 접근할 수 있는 메모리'입니다. (출처:위키백과) 즉 여러프로그램에서 동시에 접근할 수 있고, 같은 컴퓨터에서 동작하는 여러 프로그램간 데이터 통신에 사용하는데, 다른 통신이랑 비교하면 통신속도가 '없다'고 말해도 될정도로 빠른 데이터 전송이 가능하죠. 사실 데이터 통신이라기보단 같은 메모리를 사용하는거지만요. 공유메모리에 대한 더 자세한 내용은 구글에 검색해보시고! 저는 리눅스에서 공유메모리를 사용하는 예제를 작성해보겠습니다. ~ ~ Read.C 코드 int h_A; int *b_A; void CloseUI() { if (b_A != NULL) if( -1 == shmdt( b_A )) p..
[C언어]리눅스 모드버스 RTU modbus slave 프로그램 (RS485) ~ 485통신을 하는 마스터기기를 이용하여 데이터를 읽어올 수 있게한 프로그램입니다. 모드버스 RTU 마스터프로그램을 이용하여 Fnc3(read register)를 이용하면 원하는 데이터값을 출력해줍니다. 점점 한국어자료가 없어지더니 이번글은 아에 영어자료만 보고 작성했네요 ~ ~ 코드 modbus_t *ctx; modbus_mapping_t *mb_mapping; int rc; ctx = modbus_new_rtu("/dev/ttyUSB1", 38400, 'N', 8, 1); modbus_set_slave(ctx, 1); modbus_connect(ctx); mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0, MODBUS_MAX_READ_REGISTER..
[C언어]리눅스/윈도우 호환 프로그래밍 기타 팁 ~ 윈도우와 리눅스 호환 프로그래밍을 작성할때 찾았던 자료들을 여러개 올려보겠습니다. 정보 공유라기보다 개인 자료정리의 의미가 더 크니, 자료를 보시고 궁금한게 있음 물어봐주세요! ~ ~ 1.공유 라이브러리 함수 관련 (dllexport, dllimport) 출처 : https://stackoverflow.com/questions/2164827/explicitly-exporting-shared-library-functions-in-linux #if defined(_MSC_VER) // Microsoft #define EXPORT __declspec(dllexport) #define IMPORT __declspec(dllimport) #elif defined(__GNUC__) // GCC #define E..
[C언어]조건부로 linux, Win32 컴파일 - ifdef 이용 ~ 리눅스와 윈도우에서 같이 사용해야할 코드를 전혀 두 코드에서 호환시킬 수 없는경우 이런 경우에는 어쩔 수 없이 2개의 코드를 짜야하는데, 그렇다고 2개의 소스 파일을 만들기에는 파일을 관리하기가 힘들겠죠? 그럴경우 ifdef를 이용해서 현재 운영체제에 따라 원하는 부분만 컴파일하게 하면 됩니다! 이런 조건부 컴파일에 대한 예제는 정말 짧고 간단함으로, 짧게 예시만 보여주고 글 마치겠습니다. ~ #ifdef WIN32 // Windows system specific #include 윈도우코드 #else // Unix based system specific #include 리눅스코드 #endif
[C언어]window mutex, linux mutex 코드 비교 ~ 리눅스와 윈도우에서 호환되는 뮤텍스를 사용하고 싶은경우 윈도우 운영체제에서 리눅스에서 사용되는 pthread.h를 다운받아서 프로그래밍하면 편해요! 하지만 이미 windows.h를 이용해 프로그래밍을 하신 분들을 위해 windows.h -> pthread.h 로 코드를 변경한 예를 보여드릴게요. ~ #include HANDLE hMutex; DWORD wait_result; hMutex = CreateMutex(NULL, FALSE, LOG_MUTEX_NAME); if (hMutex == NULL) { return; } wait_result = WaitForSingleObject(hMutex, 10000); if (wait_result != WAIT_OBJECT_0) { CloseHandle(hMut..
[C언어]리눅스 Modbus통신 RS485 Write register 요즘 자동화 설비를 안쓰고 맨손으로 무언가를 제작하는 회사는 찾기 힘들죠? 이런 자동화 설비들에는 거의 'ModBus통신'으로 통신이 가능하게 설계되어 있습니다. 그럼 이번시간에는, 리눅스 운영체제에서 Modbus로 값을 읽어오는 'Write register'에 대한 코드를 살펴보겠습니다. (Write register와 Write registers는 다른 함수입니다. s조심!!) ~~~ ~ 코드 #include #include #include #include #include #include #include #include #include #include enum {TCP, RTU}; int main(void) { int a, StationID, setdata; uint16_t test, Address; ..
[C언어]리눅스 Modbus통신 RS485 Read input registers 요즘 자동화 설비를 안쓰고 맨손으로 무언가를 제작하는 회사는 찾기 힘들죠? 이런 자동화 설비들에는 거의 'ModBus통신'으로 통신이 가능하게 설계되어 있습니다. 그럼 이번시간에는, 리눅스 운영체제에서 Modbus로 값을 읽어오는 'Read input registers'에 대한 코드를 살펴보겠습니다. 리눅스 운영체제로 Modbus통신하는것이 한글자료가 하~나도 없어서 자료를 찾는것이 어려웠네요 ㅜ 암튼 시작해보죠! ~~~ ~ 코드 #include #include #include #include #include #include #include #include #include #include enum {TCP, RTU}; int main(void) { int a; uint16_t test; modbus_t ..
[C언어] C, C++ 코드실행시간 측정하기 코드에서 함수나 특정 부분의 실행시간이 궁금한경우! 어떻게 실행시간을 측정하실건가요? 혹시 초시계같은걸로 측정하시려는건 아니겠죠? 코드 시간이 몇십초단위로 길다면 그렇게 측정해도 되겠지만, 0.01초가 중요한 시스템이나 코드시간이 1초도 안되는 경우는 초시계로 측정하기는 힘들겠죠? 저는 그런 상황이 발생한다면! 코드에서 실행시간을 측정하는 코드를 추가해서 로그하는 방식으로 실행시간을 측정할겁니다! 그 방법은 바로 'QueryPerformanceFrequency'과 'QueryPerformanceCounter'함수를 이용하는건데요! 백문이 불여일견! 바로 코드로 확인해보시죠 ~~~ ~ 코드 #include #include int main(void) { LARGE_INTEGER PreFreq; LARGE_I..