본문 바로가기

Embedded/Kernel Porting

[Kernel Porting] FND에 소수점 표현하기

작업 환경

-메인 OS : Windows 8.1K(Intel Core i5-4590)

-작업 OS : Ubuntu 14.04.5 LTS 64bit(VirtualBox)

-장 비 명 : Hybus-Smart4412


fnd1.c

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <string.h>


#define fnd "/dev/fnd"

unsigned char fnd_data[4];

void PrintFnd(char c,int i);

int main(){

char data[6];


int num, i, flag=1;

int fnd_d;

// 1 2 3     4     5   6       7       8 9     0     .

// 0xF9, 0xA4, 0xB0, 0x99, ~0x6D, ~0x7D, ~0x07, ~0x7F, 0x10, 0xC0, 0x80


fnd_d=open(fnd, O_RDWR); // 해당 드라이버열기

fnd_data[0]=0xFF;

fnd_data[1]=0xFF;

fnd_data[2]=0xFF;

fnd_data[3]=0xFF;

write(fnd_d, fnd_data ,sizeof(fnd_data));

printf("Input=>");

scanf("%s",  data);


for(i=0;i<5;i++){


if(data[i]=='\0')

break;

if(data[i]=='.'){

fnd_data[i-1]&= ~0x80;

flag=0;

}else if(flag)

PrintFnd(data[i], i);

else

PrintFnd(data[i], i-1);


}

write(fnd_d, fnd_data ,sizeof(fnd_data));

sleep(2);

close(fnd_d);

return 0;

}


void PrintFnd(char c, int i){

if(c=='0')

fnd_data[i]=0xC0;

if(c=='1')

fnd_data[i]=0xF9;

if(c=='2')

fnd_data[i]=0xA4;

if(c=='3')

fnd_data[i]=0xB0;

if(c=='4')

fnd_data[i]=0x99;

if(c=='5')

fnd_data[i]=~0x6D;

if(c=='6')

fnd_data[i]=~0x7D;

if(c=='7')

fnd_data[i]=~0x07;

if(c=='8')

fnd_data[i]=~0x7F;

if(c=='9')

fnd_data[i]=0x10;

}


1. 초기설정

sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib gcc-4.4-multilib lib32z1


2. 컴파일

/opt/gnueabi/opt/ext-toolchain/bin/arm-linux-gnueabihf-gcc fnd1.c -o fnd1


3. Test

- 윈도우(메인 OS)로 실행파일 복사

- Tera Term에서 포트 설정 후  설정 -> 시리얼 포트 -> 속도를 115200으로 설정

- Hybus-Smart4412 장비 부팅

- 메뉴 -> 전송 -> ZMODEM -> 보내기 에서 실행파일 선택

- chmod 777 [실행파일명]  (실행파일 권한 설정)

- ./[실행파일명]  (실행 후 테스트)

(★중요 : 만약 소스파일을 수정 했다면 Tera Term 에서 먼저 rm [실행파일명] 을 한 뒤 다시 ZMODEM -> 보내기 에서 실행파일 선택 후 chmod 777 [실행파일명] 와 ./[실행파일명] 다시 실행)