저수준 파일 입출력을 사용한 파일에서 정보 읽어오는 함수

인자 설명:

  file_location: 파일위치+파일 이름명

  find_index: 파일에서 찾을 index

 

 

 

 

 

 

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
 
int read_info(char* file_location, char* find_index)
{
    int file_descriptor;
    char* find_location;
    char file_index[1024= {0};
    char file_contents[1024= {0};
    char index[1024= {0};
    int ret, iCnt=0;
    int inCnt=0;
 
#if 0
    printf("[FD] location= %s\n", file_location);
    printf("[FD] index= %s\n", find_index);
#endif
    printf("\n");
 
    if( (file_descriptor = open(file_location,O_RDONLY)) > 0)
    {
        if( read(file_descriptor,file_contents,sizeof(file_contents)) > 0 )
        {
            while(iCnt<strlen(file_contents))
            {
                if*(file_contents+iCnt) != '\n' )
                {
                    printf("[D] file_contents[%d]:%c [0x%02x]\n",iCnt, *(file_contents+iCnt), *(file_contents+iCnt));
 
                }
                iCnt++;
            }
            printf("\n");
            puts(file_contents);
            
            
#if 0
                printf("Input index to find: ");
                fgets(file_index,sizeof(file_index),stdin);
                if*(file_index+0== '\n')
                {
                    printf("Exit Program...\n");
                    break;
                }
#endif
        
            find_location = strstr(file_contents,find_index);
            while*(find_location+inCnt) != '\n' )
            {
                printf("%c",*(find_location+inCnt));
                inCnt++;
            }
 
            printf("\n\n");
    
 
 
 
        } //end of read
            
        else
        {
            printf("read Error!!!\n");
            return -2;
        }
        
        close(file_descriptor);
    }
        
    else
    {
        printf("File open Fail...\n");
        return -3;
    }
    return 0;
}
 
int main(int argc, char* argv[])
{
    char file_index[1024= {0};
    int iCnt;
    if( (argc == 1|| (argc > 3|| (argc == 2) )
    {
        printf("\nArgument Error...\n");
        printf("\nUsing manual: ./(execution_file_name) (file_location) (find_index)\n\n");
        return -1;
    }
 
    read_info(argv[1], argv[2]);
#if 0
    while(1)
    {
        printf("Input index to find: ");
        fgets(file_index,sizeof(file_index),stdin);
        read_info(argv[1], file_index);
        for(iCnt=0; iCnt<sizeof(file_index); iCnt++)
        {
            file_index[iCnt]=0;
        }
    }
#endif
 
    return 0;
}
 

'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

PINA, PORTA, DDRA 설명(LED관련)  (0) 2016.10.31
UART LED가 정상 작동을 안 하는 경우  (0) 2016.10.28
LED on/off  (0) 2016.10.28
printf 함수 리턴  (0) 2016.09.30
하버드 구조 VS 폰 노이만 구조  (0) 2016.09.21
Posted by 知彼知己百戰不殆
,

<PINA, PORTA, DDRA>


Data Direction Register 는 입/출력을 바꿔주는 Register이다. DDR의 각 비트에 해당되는 PIN과 PORT에 영향을 끼친다. 0일 땐 input모드, 1일 땐 output 모드로 사용된다.

PORT는 DDR이 output 모드일 때 사용되는 Register이다. 

PIN은 DDR이 input 모드일 때 사용되는 Register이다.

'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

[CubeBite] File_Read_Info  (0) 2017.02.08
UART LED가 정상 작동을 안 하는 경우  (0) 2016.10.28
LED on/off  (0) 2016.10.28
printf 함수 리턴  (0) 2016.09.30
하버드 구조 VS 폰 노이만 구조  (0) 2016.09.21
Posted by 知彼知己百戰不殆
,

int main(void)

{
    unsigned char uc_Data=0x0A;
    
    USART_Tx(uc_Data);
    
    while(1)
    {
        //if( (UCSR0B & (1<<RXEN0)) != 0 )
        DDRA = 0xAA;
        _delay_ms(8000);
        DDRA = ~DDRA;
    }
    return 0;
}


의도한 결과: 1010 1010(0xAA)과 0101 0101(0x55)이 약간의 시간을 두고 교대로 왔다갔다 하면서 켜지게 하고 싶다.

실제 보드에 올린 결과: 1010 1010(AA) 형태로만 불이 들어왔다. 깜빡임이 없었다.

이유: DDRA = ~DDRA; 에서 반복문이 걸리기 때문에 DDRA = 0xAA; 코드가 다시 실행되고, 즉 0101 0101로 바뀌고 나서 delay가 없으므로 순식간에 다시 1010 1010 코드가 실행돼서 이런 결과가 생겼다.


즉 의도한 결과를 얻기 위한 코드를 다시 작성을 해보면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main(void)
{
    unsigned char uc_Data=0x0A;
    
    USART_Tx(uc_Data);
    
    DDRA = 0xAA;
 
    while(1)
    {
        //if( (UCSR0B & (1<<RXEN0)) != 0 )
        _delay_ms(8000);
        DDRA = ~DDRA;
    }
    return 0;
}


DDRA = 0xAA; 코드를 while문 위로 올렸다. 그랬더니 의도한 결과대로 정상 작동하는 것을 확인할 수 있었다.

'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

[CubeBite] File_Read_Info  (0) 2017.02.08
PINA, PORTA, DDRA 설명(LED관련)  (0) 2016.10.31
LED on/off  (0) 2016.10.28
printf 함수 리턴  (0) 2016.09.30
하버드 구조 VS 폰 노이만 구조  (0) 2016.09.21
Posted by 知彼知己百戰不殆
,

<LED를 켜기 위한 코드>

본 글은 Atmega128L, Osc 12Mhz 보드에서 실험하였다.

 

준비물: 

LED가 연결된 port 확인! (portA, portB, portC....),

각 port에 해당되는 Data Direction Register(DDR) 확인!

 

DDR의 각 비트는 입/출력 방향을 결정하는 비트이며, 각 비트의 입/출력은 해당되는 port의 각 pin의 입/출력을 결정짓는다.

특정 핀에 해당하는 DDR 레지스터 값이 1이면 출력 용도로 사용 할 핀임을 의미하며, 반대로 0이면 입력 용도로 사용 할 핀임을 의미한다.

 

 

Atmega 128L에서 PORTA의 주소는 

 

PORTA에서 $1B($3B)라고 hex값으로 주소가 나와있는데 괄호 밖의 주소는 Atmega103 호환모드로 사용할 때의 주소라서 괄호 안의 주소를 사용하기로 한다. 즉, 0x3B를 사용한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <util/delay.h>
 
#define DDRA    (*((volatile unsigned char*)0x3A))
#define PORTA    (*((volatile unsigned char*)0x3B))
#define PORTA0    0
#define PORTA1    1
#define PORTA2    2
#define PORTA3    3
#define PORTA4    4
#define PORTA5    5
#define PORTA6    6
#define PORTA7    7
 
 
int main(void)
{    
    DDRA = 0xFF;
    PORTA = (PORTA & (1<<PORTA1)) | (PORTA & (1<<PORTA2)) | (PORTA & (1<<PORTA3)) | (PORTA & (1<<PORTA4)) | (PORTA & (1<<PORTA5)) | (PORTA & (1<<PORTA6)) | (PORTA & (1<<PORTA7));
    
    while(1)
    {
        
#if 1
 
        _delay_ms(5000);
        PORTA = ~PORTA;
        
#endif
 
    }
        
    return 0;
}
 

_delay_ms함수를 사용하기 위해 #include <util/delay.h> 헤더파일을 추가했으며, 나머지는 레지스터 주소를 직접 건드리는 방식으로 코드를 사용했다.

 

PORTA에 값을 입력하면 LED가 켜지는 줄 알았지만 PORT0을 1로 설정을 안 했는데도 모든 LED가 다 켜져서 PORT0과 PORT7만 1로 설정을 하고 나머지를 모두 0으로 해보았다. 그런데도 모든 불빛이 다 들어와서 DDR 레지스터의 값을 LED0번과 LED7번만 켜지게 바꿨더니 원하는대로 동작이 되었다. PORTA는 영향을 안 미치는 줄 알았는데 while문에서 PORTA의값을 틸트(~) 시켰는데 LED가 on/off되는 것을 보면 좀 더 공부해봐야 알 것 같다. (LED가 DDR 셋팅으로만 불이 켜지는 이유가 회로도를 몰랐기 때문인데 현재 보드의 LED는 Vcc에

연결돼 있어서 PORTA의 initial value가 0이므로 ground와 비슷한 효과를 내서 LED가 켜지는 것이다. 만약 LED가 ground에 연결돼 있었다면 PORTA에 값을 넣었을 때 데이터시트

처럼 정상 작동하는 것을 확인할 수 있을 것 같다.)

새로 작성한 LED 0번과 LED 7번을 켜는 코드는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <util/delay.h>
 
#define DDRA    (*((volatile unsigned char*)0x3A))
#define PORTA    (*((volatile unsigned char*)0x3B))
#define PORTA0    0
#define PORTA1    1
#define PORTA2    2
#define PORTA3    3
#define PORTA4    4
#define PORTA5    5
#define PORTA6    6
#define PORTA7    7
 
 
int main(void)
{    
    DDRA = 0x81;
    PORTA = 0x00;
    //PORTA = (PORTA & (1<<PORTA0)) | (PORTA & (1<<PORTA7));
    
    while(1)
    {
        
#if 1
 
        _delay_ms(5000);
        PORTA = ~PORTA;
        
#endif
 
    }
        
    return 0;
}
 

 

'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

PINA, PORTA, DDRA 설명(LED관련)  (0) 2016.10.31
UART LED가 정상 작동을 안 하는 경우  (0) 2016.10.28
printf 함수 리턴  (0) 2016.09.30
하버드 구조 VS 폰 노이만 구조  (0) 2016.09.21
MCU, MIPS  (0) 2016.09.04
Posted by 知彼知己百戰不殆
,

~~printf를 리턴하는 test함수 작성

int main(

{

test();

}

에러나 경고 발생 안하면 완성





#include <stdio.h>


int (*test())(const char*, ...)

{

        return printf;

}


int main()

{

        printf("return printf\n");

        test();

}



'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

UART LED가 정상 작동을 안 하는 경우  (0) 2016.10.28
LED on/off  (0) 2016.10.28
하버드 구조 VS 폰 노이만 구조  (0) 2016.09.21
MCU, MIPS  (0) 2016.09.04
Transistor Transistor Logic = TTL  (0) 2016.09.04
Posted by 知彼知己百戰不殆
,

상대적으로 하버드 구조에 비해 가격이 싸다, => 복잡도가 낮다

프로그램과 데이터의 저장 공간이 같아서 동시 접근이 불가능하다. (Code 영역에 접근 중이라면 data영역에 접근 불가)

=일과 기억공간의 동시 접근 불가능, Code 영역에 접근 중이라면 data영역에 접근 불가)


상대적으로 폰 노이만 구조에 비해 가격이 비싸다 => 복잡도가 높다

프로그램과 데이터의 저장 공간이 달라서 동시 접근이 가능하다. => 일처리 효율이 좋아진다

=값의 저장과 일 가져오는 것이 동시에 가능하므로 처리 효율이 좋아진다.


Code영역: 일 시키는 명령들의 공간

CPU: 일처리 하는 놈 Central Processing(일처리) Unit

Data, BSS, Heap, Stack: 기억(저장) 공간


'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

LED on/off  (0) 2016.10.28
printf 함수 리턴  (0) 2016.09.30
MCU, MIPS  (0) 2016.09.04
Transistor Transistor Logic = TTL  (0) 2016.09.04
I/O mapped I/O, memory mapped I/O  (0) 2016.09.04
Posted by 知彼知己百戰不殆
,

MCU = Micro Controller Unit

집적 회로 안에 프로세서와 메모리, 입출력 버스 등의 최소한의 컴퓨팅 요소를 내장한 초소형 컨트롤러. 보통 자동제어에 사용되기 위한 저성능/저전력 연산 장치를 뜻하나, 경우에 따라서는 ARM Cortex-A 시리즈와 같이 스마트폰 등에 사용되는 고성능/저전력 프로세서 제품도 MCU라 표현하기도 한다.

PC에서의 CPU와 비슷하나 이와 다른 가장 큰 특징은 저성능/저전력에 저렴한 가격으로 제작된다는 점, 자동제어에 이용되기 위한 많은 주변장치를 포함하고 있다는 점이다. MCU와 CPU의 구분은 프로세서의 사용 목적에 따라 정해지는 편이다. 고성능의 OS를 설치하여 PC나 서버, 슈퍼컴퓨터 등에 사용하는 경우에는 보통 CPU라 하며, 저성능의 OS를 설치하여 사용하거나 OS 없이 펌웨어만 사용하여 자동제어에 사용되는 경우에는 MCU라 부르는 편이다. 

보통 Embeded System에 적합하게 디자인 된 물건이 많은지라 성능 자체는 뛰어나다고 볼 수 없지만 단순하고 신뢰성있으며 전력 소모가 적으며 저렴하다는 장점이 있으며 현재도 여러 분야에 걸쳐서 널리 쓰이는 장치들이다. 이 분야에서 주로 사용되는 언어는 어셈블리어, C이다.


MIPS = Microprocessor without Interlocked Pipeline Stages) or CPU의 초당 100만 단위의 명령어 처리 능력

밉스 테크놀로지에서 개발한 RISC ISA이다. 

Posted by 知彼知己百戰不殆
,

트랜지스터 트랜지스터 논리

반도체를 이용한 논리 회로의 대표적인 하나. 일반적으로 5V 단일 전원의 모놀리식 집적 회로로 만들어졌다. 간단히 TTL이라고도 한다. DTL의 개량품으로 1970년대에 텍사스 인스트루먼트 사의 표준 논리 IC 종류에 의해 널리 보급됐다.

표준 시리즈부터, 고속용, 저소비 전력용, 고속 및 저소비 전력용같은 변종이 퍼져서 초기 마이크로프로세서의 응용의 확대와 동시에 더욱 보급됐다. 그러나 바이폴러 트랜지스터를 사용했기 때문에 소비전력이 크고, 고집적화 및 고속화되지 않아서 시모스 논리 IC 기술의 발달로 논리 회로의 주력 자리를 시모스에게 양보했다.

'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

하버드 구조 VS 폰 노이만 구조  (0) 2016.09.21
MCU, MIPS  (0) 2016.09.04
I/O mapped I/O, memory mapped I/O  (0) 2016.09.04
Embeded 기초5(수광소자 = 빛센서)  (0) 2016.09.04
실행 파일과 코드 영역  (0) 2016.09.04
Posted by 知彼知己百戰不殆
,

C언어가 CPU를 건드릴 수 없다.

Embeded System에서 채택한 방식(ARM, ATMEGA). CPU안에 I/O가 있는데 메모리에 I/O 주소값을 할당을 해서 C언어로 I/O에 접근할 수 있도록 한 방식. I/O에 주소가 부여돼 있으므로 C언어에서 pointer를 사용하여 메모리 주소를 이용하면 CPU에 접근이 가능하다.


각각의 장단점:

I/O mapped I/O: 메모리를 많이 사용할 수 있다. 그래서 범용일 때는 이걸 쓴다. 하지만 어셈블리를 사용해야 하므로 생산성이 떨어진다.

I/O mapped memory: 레지스터의 특정 부분이 reserved 돼 있으므로 상대적으로 사용할 수 있는 용량이 줄어든다. 

원래 메모리는 CPU에 있으면 안되는 영역인데 I/O mapped memory는 CPU 안 레지스터에 주소를 부여해서 C언어의 포인터에서 사용이 가능하게 만들어놨다. 다만 용량이 줄어들었을 뿐.. Embeded System에서는 메모리의 용량이 매우 작기 때문에 범용 컴퓨터에서 보면 별거 아닐 수도 있어도 Embeded에서는 크게 신경써야 할 부분이다.

'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글

MCU, MIPS  (0) 2016.09.04
Transistor Transistor Logic = TTL  (0) 2016.09.04
Embeded 기초5(수광소자 = 빛센서)  (0) 2016.09.04
실행 파일과 코드 영역  (0) 2016.09.04
Embeded 기초4(GND, oscillator, watchdog, BOD, ISR)  (0) 2016.09.03
Posted by 知彼知己百戰不殆
,

수광소자 = 빛 에너지를 전기 에너지로 변환시켜 주는 것. 즉, 빛을 받으면 전기 흐름이 바뀌는 것


화소(점)란 Red 수광센서(빨간색에만 반응하는 센서), Green 수광센서, Blue 수광센서가 모여서 1개의 화소를 이룬다. 각 색 소자당 256가지(8bit)의 빛 에너지를 검출 할 수 있으므로(왜? 1Byte로 진폭을 쪼개서..) 1화소는 24bit의 값을 가진다. 그리고 각 수광센서 1개당 ADC가 필요하다.


재밌는 이야기로 디지털 공부하기

디지털 카메라는 현실을 어떻게 캡쳐할까?

720p = HD, 1080p = Full HD

1920*1080(1080p, 가로*세로 점 개수) = 2,073,600개의 점

FHD의 사진 한 장이 갖는 용량 = 3*2,073,600 = 약 5.93Mbyte


FHD의 동영상 용량

사진 1장은 약 6메가바이트

6*20(20프레임이라고 가정) = 120Mbyte/sec = 7200Mbyte/min = 43200Mbyte/hour

약42Gb(1시간 동영상 용량) 근데 이건 사운드 용량은 빠진 것..

사운드도 포함한다고 하면 42+0.65Gb = 약42.65Gb

Posted by 知彼知己百戰不殆
,