반응형

C언어에서 Const 로 선언 하는 부분에 있어서는 특별하다.

어떤 특정 변수를 바뀌지 않는 "상수"로 선언하는 부분에 있어 보통 사용한다.

보통은 해당 코드에 대한 "안전성"을 위해 선언한다.  자세한 내용은 아래를 참고한다.

https://ansan-survivor.tistory.com/901

 

[C언어] C언어에서 Const 선언이 갖는 의미. (안전성 있는 상수 선언)

const 선언이 갖는 의미, 안정성. const 선언은 추가적인 기능을 제공하기 위한것이 아니라, 코드의 안정성을 높이기 위한 것이다. 따라서 이러한 const의 선언을 소홀히 하기 쉬운데,

ansan-survivor.tistory.com

 

Const를 통한 포인터 변수 선언은, 해당 포인터변수가 가리키는 대상이 변하지 못하게 함을 의미한다.
아래와 같이 const int* ptr = &num 일 경우, 이제 ptr 포인터변수는 num의 주소값을 가리키는데, 이는 const 선언을 했기 때문에 항상 고정되며, ptr이 가리키는 방향에 대한 수정은 불가능 하다. (ptr -> num)

 

<const int * ptr 형태>

그러나! 그렇다고 num의 값을 못바꾸는 것은 아니다. ptr 변수가 const 이기 때문에, 가리키는 방향을 바꿀 수 없을 뿐 가리키는 대상인 num은 const가 아니기 때문에 변경이 가능하다.

#include <stdio.h>

int main()
{
    int num = 10;

    // ptr이 가리키는 대상은 항상 num으로 고정. 변경 불가
    const int* ptr = &num;

    // ptr이 가리키는 대상은 변경이 불가하다.
    // num은 가리킴을 받는 대상이고 const 선언이 아니므로 변경 가능
    // *ptr = 20; - 불가
    num = 30;

    return 0;
}

 

<int * const ptr 형태>

이번엔 const가 뒤에 변수명 앞에 선언되었다. 

ptr에 있는 주소값이 상수가 되어 변경이 불가능하다. 즉 ptr에는 &num1 주소값 외 아무것도 변경할 수 없다.

그러나 num1 내에 있는 값을 변경하는 것은 허용된다. (*ptr = 40 으로 값 변경 가능)

int main()
{
	int num1 = 20;
	int num2 = 30;

	//ptr이 가리키는 대상은 num1 으로 고정하겠다고 선언.
	int * const ptr = &num1;

	//ptr = &num2;	컴파일 에러! 왜? ptr은 num1만을 가리키는 포인터로 고정했으므로.
	*ptr = 40;	//ptr이 num1을 가리키고있고, 주소에 접근해서 변경은 할 수 있다.

	return 0;
}

 

<const int * const ptr 형태>

이는 매우 강력한 형태로,

ptr은 영원히 num을 가리키고 있고, num의 값을 아무도 변경할 수 없고 참조만 가능하다...

 

int main()
{
	int num = 1;
	
	// 두 const선언을 동시에 하는 방법.
	const int * const ptr = &num;
	// 즉, ptr은 영원히 num을 가리키고 있고, num의 값을 아무도 변경할 수 없고 참조만 가능하다...

}

 

 

 

 

 

반응형
반응형

OrCAD Capture 로 회로도면을 설계하다보면 한 도면 내 모든 회로정보를 다 넣을 수는 없을 것이다.

아래와 같이 Main 도면 내에 블록계층을 만들고 해당 블록에 접속할 수 있도록 만들면 편리하다.

 

OrCAD Capture에는 hierarchical Block 설계를 지원한다.

그러기 위해서는 먼저 도면의 Tree 구조를 만들어야 한다.

 

다른 회로도의 계층구조블록(hierarchical Block)을 만드려면 다른 Schematic Page가 필요하다.

 

 

< 계층 블록을 사용하기 위한 Schematic Tree 구조 만들기>

1. 최상위 트리인 xxx.dsn 파일 마우스우클릭 - New Schematic

 

2. 새로운 schematic에서 새로운 page 만들기

    아래와 같이 main 회로도도와 다른 Schematic 트리에 만들어야 모듈로 사용할 수 있다.

 

3. 모듈 회로도 만들기

새로운 Schematic 아래 있는 페이지 회로도 열기
왼쪽에 3개 포트로 모듈로 들어오는 포트 만들기, 우측에는 나가는 포트 만들기

 

4. 회로도에 IN/OUT 포트 만들기

    4-1. IN 포트 만들기 (모듈 회로도로 들어오는 포트)

place - Hierarchical Port
심볼을 선택한다. In방향 , out방향 잘 구분하기
단축키 R을 눌러 회전을 시켜서 들어오는 방향 (IN_PORT)를 배치

    4-2. OUT 포트 만들기 (모듈 회로도에서 나가는 포트)

place - Hierarchical Port
회전하고 이름 변경
IN/OUT 포트 완성

5. 포트에 Properties 지정하기 (동일한 Net가 아닌 이상 포트 이름이 각각 달라야 한다 )

Pivot으로 보기 편하게 변경하고, Type을 본다. Default로 Output으로 되어있는데, Input으로 사용할 항목은 다 변경시킨다.

Input Port 3개는 전부 타입 변경
포트 이름이 겹치면 안되므로 포트 이름을 각각 다르게 변경

 

6. 적당히 Rename으로 이름을 변경해준다. (모듈에서 불러오기 편하도록)

반응형

< Main 회로도에서 계층 블록(Hierarchical Block) 회로도 불러오기>

메인 회로도의 저 위치에 하위계층 블록을 만들어 본다.

 

1. place - Hierarchical Block

2. Reference를 작성 - Schematic View 변경 - 하위 목록으로 아까 만든 MODULE 회로도를 선택

(모듈이므로 여러개를 복사해서 만들 수 있다. 각 모듈마다 Reference 번호가 매겨진다. 뒤에 숫자 1을 넣으면 복사할 때마다 증분된다.)

 

3. OK를 누르면 마우스가 '십자기' 형태로 변한다. 이때 회로도에 드레그만 해주면 생성된다.

(결과)

    회전하고(단축키 R) 반전하고(단축키 V 또는 H) 등등 다 먹힌다. 이제 메인의 회로도에 하위 계층 블록으로 배치가 된 것이다. 

  해당 모듈을 복사 붙여 넣기 하면 똑같은 회로도가 여러개 생성되는 것이다. 또한 그 모듈에 대한 Reference 가 증가함을 볼 수 있다.

ctrl + C, ctrl + v 먹힘

해당 모듈 블록을 더블클릭하면 하위 계층 도면으로 이동할 수 있다.

 

 

 

(계층구조 Hierarchical block을 라이브러리 화 시키기 .OLB 파일로 변경)

https://ansan-survivor.tistory.com/586

 

[CAPTURE] OrCAD Capture 계층블록(Hierarchical Block)을 라이브러리 파일(.OLB 파일)로 변경시켜 설계 재활용

* 계층구조(Hierarchical Block)에 대해서 모른다면 아래를 참고한다. https://ansan-survivor.tistory.com/1259 [CAPTURE] OrCAD Capture 계층 구조 도면 만들기 ( 계층 블록 하위 도면 hierarchical Block) OrCA..

ansan-survivor.tistory.com

 

(계층 구조가 아닌, 다른 페이지에 Net를 연결하는 방법, off-page)

https://ansan-survivor.tistory.com/1261

 

[CAPTURE] OrCAD Capture 다른 페이지 Net 연결하기 (Off-page 연결)

OrCAD Capture에서 회로도의 화면이 부족할 경우, 다른페이지로 Net를 연결할 수 있다. 이때 Off-page 포트 기능을 사용한다. Page1에 있는 LED1,2,3 네트를 Page2의 네트에 연결하고 싶을 때 사용. 1. 메인 페

ansan-survivor.tistory.com

 

반응형
반응형

예전 유닉스부터 사용되왔던 NFS 라는 기술이 있다.

이는 네트워크를 이용해서 여러 서버간의 마운트를 통해 마치 하나의 파일 스토리지 처럼 사용하는 기술이다.

 

이는 마치 내 PC에서 다른 로컬드라이브에 접근하는 것 처럼, 컴퓨터 네트워크를 통해 마운트된 다른 서버의 드라이브 파일에 액세스할 수 있도록 한다.

출처: https://networkencyclopedia.com/network-file-system-nfs/

특징.

 - NFS로 공유한 파일은 일반적인 소유권과 접근 권한이 그대로 적용

 - 원격으로 접속한 유저가 파일 소유 권한이 있다면, UID를 이용해 조작 가능.

 - 루트의 권한을 갖는 사용자가 해당 공유 디렉터리에서 모두 조작 가능.

 

장점.

 - NFS는 파일을 쉽게 공유가능

 

단점.

 - 보안에 취약

 

 

 

반응형
반응형

일반적으로 DC모터를 제어할 때 자주 사용되는 방식이 PWM제어이다.

디지털 Pulse 파형을 일으켜 주기의 Duty Cycle으로 모터의 속도와 방향을 제어할 수 있다.

 

Atmega128 의 Datasheet에서 PWM으로 사용되는 핀은 아래와 같다.

PWM은 타이머 인터럽트를 사용하는데, Atmega128에서는 총 4개의 Timer Interrupt 가 존재한다.

 - Timer 0  (OC0) : PB4

 - Timer 1  (OC1A~C) : PB5 ~ PB7

 - Timer 2  (OC2) : PB7

 - Timer 3  (OC3A~C) : PE3 ~ PE5

반응형

 

 

 

반응형
반응형

 

Atemga128에 LCD를 연결해 구동시키기 위한 참고 회로이다.

LCD는 핀이 보통 14개로 구성되어있고, 배경의 LED화면 밝기(백라이트)를 조종하는 LED+와 LED-가 있는 16개의 핀이 있는 것도 있다.

16개 핀 LCD (출처: https://www.electronicwings.com/avr-atmega/interfacing-lcd-16x2-in-4-bit-mode-with-atmega-16-32-)

위의 LCD의 일반적인 연결 방법. (자세한 연결 방법은 각 제조사의 Datasheet를 참고해야 한다)

반응형

이를 Atemga128의 LCD에 연결한 회로도를 만들어보면 아래와 같다고 할 수 있다. (단 LED기능이 없는 14핀)

핀을 연결하는 방법도 D0 ~ D7 을 모두 병렬로 연결하는 방법이 있고, 4개만 병렬로 연결해서 직렬처럼 기능을 사용하는 방법이 있다.

 

 

반응형
반응형

C언어의 함수에 값을 전달하는 방법은 아래와 같다.

https://ansan-survivor.tistory.com/1224

 

[C언어] C언어 함수 만들기, 함수 구조, 함수 템플릿, 함수 작동 순서

C언어 함수의 구조는 [return 타입] 함수명( [input타입 변수명] ) ex)  int  main(  int a  ) 함수명은 말 그대로 함수 이름 지정. input 은 이 함수가 실행되기 위한 입력 값을 지정하는것. return 타입은..

ansan-survivor.tistory.com

 

그리고 함수에 전달하는 매개변수는 원래 값을 "복사"해서 전달한다.

따라서 원래 값은 바뀌지 않고, 전달된 매개변수가 input 인자에 전달되는 것이다.

위처럼 값 1개는 간단하게 복사하여 전달할 수 있다.

하지만 동시에 여러개 매개변수를 전달하고 싶은 경우 배열을 사용해야 하는데,

C언어의 함수에서 input인자로 배열전체를 복사에서 전달하는 것을 허용하지 않는다.

 

결론부터 말하자면, 배열의 주소값을 전달해서 포인터로 접근해야 한다.

왜냐하면 배열은 결국 포인터 형태이므로 (상수형 포인터)

https://ansan-survivor.tistory.com/1249

(상수형 포인터가 무슨말인지 모르면 아래 참고)

 

[C언어] C언어 배열과 포인터의 관계 (변수형 포인터, 상수형 포인터), 포인터로 배열 변경하기

포인터에 대한 간단한 설명은 아래 참고. https://ansan-survivor.tistory.com/1237 [C언어] 포인터란? 포인터에 대해 쉽게 이해하기. (포인터 변수 사용하기, 포인터로 값 변경하기, (알아두기) 컴퓨터는 32비

ansan-survivor.tistory.com

반응형

아래 코드는 배열의 주소값인 arr을 함수에 전달해서 함수에서 배열을 수정하는 코드이다.

#include <stdio.h>

// 배열을 전달을 받는 함수
// 받는 인자는 int형 포인터
void func(int * param)
{
    param[0] = 10;
    param[1] = 20;
    param[2] = 30;
}

int main()
{
    int arr[3] = { 1,2,3 };

    printf("맨처음 배열 값 {%d,%d,%d}\n", arr[0], arr[1], arr[2]);
    
    // 받는 input인자로 배열을 받아서 내부 값을 변경
    // 배열의 이름 arr은 'int형 상수형포인터' 이므로 전달 가능
    func(arr);
    
    printf("배열 내부값 변경 후 {%d,%d,%d}\n", arr[0], arr[1], arr[2]);

    return 0;
}

* 알아두기

배열을 받는 인자로 int * param 대신 int param[] 으로도 전달 가능하다.

어차피 둘다 동일한 의미이며, param 이라는 주소값을 참조한다.
만약 실제로 배열을 전달한다면, 후자의 방식으로 작성해서 코드의 가독성을 향상시킨다.

하지만 이러한 전달은 오직 배열만 가능하다!

// 배열을 받는 인자로 int * param 대신 int param[] 으로도 전달 가능하다.
// 만약 실제로 배열을 전달한다면, 후자의 방식으로 작성해서 코드의 가독성을 향상시킨다.
void func(int param[])
{
    param[0] = 10;
    param[1] = 20;
    param[2] = 30;
}

 

 

 

 

반응형
반응형

대부분 C언어를 배울때 맞닥드리는 예제로 변수의 값을 Swap하는 예제가 있다.

 

예를 들면 a, b 값이 있는데 a = 1 , b = 3 이 들어있다면 간단하게 이 두개의 값을 거로 바꾸는 예제이다.

해결방법은 아래와 같이 간단하다.

temp라는 임시변수에 잠시 값을 복사해두었다가 사용한다.

#include <stdio.h>

int main()
{
    int a = 1;
    int b = 3;

    // 두 값을 swap(바꾸기)
    printf("맨처음 값 a=%d, b=%d\n", a,b);
    
    // 값 변경을 위한 임시변수 선언
    int temp;
    temp = a;
    a = b;
    b = temp;
    
    printf("변경 후 값 a=%d, b=%d\n", a, b);

    return 0;
}

 

반응형

<포인터를 배운 후,  swap 함수 만들기>

함수와 포인터를 배운다면 이제 swap기능을 하는 함수를 만들라는 과제를 받는다.

함수 input 인자는 값을 복사하므로, swap기능을 사용하기 위해서는 주소값에 접근할 수 있는 포인터가 필요하다.

#include <stdio.h>


// 서로의 값을 바꿔주는 swap 함수
void swap(int* x, int* y)
{
    // 임시로 값을 저장할 변수 선언
    int temp;

    // temp에 x값을 저장해두기
    temp = *x;
    // x값을 y의 값으로 변경
    *x = *y;
    // x값을 저장하고 있는 temp의 값을 y에게 전달
    *y = temp;
}

int main()
{
    int a = 1;
    int b = 3;

    // 두 값을 swap(바꾸기)
    printf("맨처음 값 a=%d, b=%d\n", a,b);
    
    // 받는 input인자가 int형 포인터이므로, 주소값을 전달
    swap(&a, &b);
    
    printf("변경 후 값 a=%d, b=%d\n", a, b);

    return 0;
}

(결과) 이제 이 swap 함수를 지나면 2개의 값이 바뀌게 된다.

 

 

 

 

 

 

반응형
반응형

아래와 같이 윈도우위에 리눅스를 설치하려고 할때 (Windows Subsystem Linux) 이러한 에러를 직면할 수 있다.

이는 설정이 제대로 안되있어서 그렇다.

 

(설치 방법은 아래 참고)

https://ansan-survivor.tistory.com/1001

 

[Windows / Ubuntu] 윈도우에서 리눅스 우분투 명령어 실행 시키기

1. 윈도우에서 리눅스를 사용할 수 있도록 설정하기 1-1. 제어판 - 프로그램 (언어 한글 버전) 2. 마이크로소프트 앱 스토어에서 우분투 LTS 다운로드 하기 설치가 다되면 실행한다. (결과) 간단한

ansan-survivor.tistory.com

 

위 설치 방법중 아래 항목이 안되있을 때 발생하는 에러이다.
아래와 같이 해결한다.

 

1.  윈도우에서 리눅스를 사용할 수 있도록 설정하기

    1-1. 제어판 - 프로그램

 

2. Windows 기능 켜기/끄기

반응형

3. Linux용 Windows 하위 시스템 체크박스 활성화

언어 영문 버전

(언어 한글 버전)

 

4. 재부팅한다. (컴퓨터를 반드시 재부팅해야 적용된다. 아니면 안된다)

 

반응형
1···30313233343536···181

+ Recent posts