ctime으로 시간을 구했는데 정확한 값이 아닌 이유가 뭘까요??
글쓴이: koogoon / 작성시간: 월, 2005/06/13 - 6:00오후
안녕하세요.
자꾸 허접한 질문 올려서 죄송합니다만
(여기 올리는 거 맞나요?)
아래글에서 보다시피
임베디드리눅스 pxa255pro1을 가지고
텍스트lcd디바이스드라이버를 이용한 시계 소스 작성 중
시간 구하는 중인데요
ctime(ltime);
today = localtime(<ime);
year = today->tm_year;
month = today->tm_mon ;
day = today->tm_mday;
hour = today->tm_hour;
min = today->tm_min;
sec = today->tm_sec;
이런식으로 하니깐 정확한 값이 들어가지 않는데요
뭐가 잘못 된건지 잘 모르겠습니다.
조언 부탁드립니다. ^^
Forums:
ctime 은 time_t 형 파라미터에 현재시간을 채워주는 함수가 아닌
ctime 은 time_t 형 파라미터에 현재시간을 채워주는 함수가 아닌걸로 아는데요.
파라미터로 넘겨진 time_t 형 시간에 대한 문자열로 표현되는 시간을 리턴해주는 함수일 뿐입니다.
time_t now;
time(&now)
today = localtime(&now);
이렇게 하고 싶으신것 같은데....
[b]ssehoony[/b]안녕하세요 답변 정말 감사드립니다.
ssehoony
안녕하세요 답변 정말 감사드립니다.
근데 제가 처음에 time을 썻었는데 값이 제대로 안나오더라고요
그래서 ctime을 찾아서 썻었는데 그래도 값이 똑같네요...ㅡㅡ;
혹시 제가 뭘 착각해서 잘못한건지...
임베디드 리눅스 타겟용 소스를 배우고 싶어요
year = today->tm_year; month = toda
year = today->tm_year;
month = today->tm_mon ;
day = today->tm_mday;
hour = today->tm_hour;
min = today->tm_min;
sec = today->tm_sec;
음.. 혹시...
year = today->tm_year + 1900;
month = today->tm_mon + 1;
day = today->tm_mday;
hour = today->tm_hour;
min = today->tm_min;
sec = today->tm_sec;
이렇게 해야 우리가 사용하는 년월일이 나오는걸 모르시는건가? :shock:
시간이 몇시간 틀리다면 타임존문제입니다.
서버에 셋팅된 타임존을 확인해 보세요.
정말 계속해서 답변해주셔서 정말 감사합니다.큰 도움이 되고 있습니다.
정말 계속해서 답변해주셔서 정말 감사합니다.
큰 도움이 되고 있습니다.
ssehoony
year = today->tm_year + 1900;
month = today->tm_mon + 1;
day = today->tm_mday;
hour = today->tm_hour;
min = today->tm_min;
sec = today->tm_sec;
이거 저도 했었는데요...
제가 아는 전부는...
1900하고 1을 더하기 해주는 이유는 자세히 모르지만
대략 1900 같은 경우엔 서기연도 표기를 하기 위해서고
1같은 경우엔 범위가 0~ 11이니깐 하는 걸로 알고 있습니다.
time() 함수 같은경우엔 1970년 1월 1일부터 현재까지의 초시간을 구하는 걸로 알고 있고...localtime()함수는 time()함수에서 받는 값으로 tm구조체생성하는 거...맞나요?
헌데 자꾸 결과가
2005(년도단위) 2(달단위) 0.000000(월단위)
17(시단위) 53(분단위) 40(초단위)
이렇게 나오네요.
어디서 뭘 고쳐야 될까요?
그리고 추가 질문인데 이렇게 받아서 뿌리면 한 번만 값을 받아서 뿌리게 되는데요....그렇다면 무한루프를 돌리는게 나을까요?
(그러면 대략 빠~ 일 것 같은데..)
gettimer / settimer 를 써야 될 듯 싶은데 이 함수들 C언어에서 사용하는 방법하고 똑같을까요? 솔직히 코딩실력이 허접해서 똑같다면 다시 공부해야 되거든요 ^^
임베디드 리눅스 타겟용 소스를 배우고 싶어요
[quote="koogoon"]헌데 자꾸 결과가2005(년도단위)
0.000000(월단위)
요거 어케 해서 찍으신건가요?
왠 소수점?
타이머는 alarm() 을 이용하시면 될꺼에요.
소스를 올려주시면 다 같이 고민해 볼 수 있을 듯 한데요.
[b]ssehoony[/b]모르는게 많아서 부끄럽지만 제가 아는 만큼
ssehoony
모르는게 많아서 부끄럽지만 제가 아는 만큼 솔직하게 주석 달았습니다. ㅠㅠ
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>
#include <sys/time.h> // localtime()
#include <time.h> // tm 구조체
#define IOM_LCD_BASE 0xbc
#define IOM_LCD_COMMAND_SET _IOW(IOM_LCD_BASE,0,32)
#define IOM_LCD_FUNCTION_SET _IOW(IOM_LCD_BASE,1,32)
#define IOM_LCD_DISPLAY_CONTROL _IOW(IOM_LCD_BASE,2,32)
#define IOM_LCD_CURSOR_SHIFT _IOW(IOM_LCD_BASE,3,32)
#define IOM_LCD_ENTRY_MODE_SET _IOW(IOM_LCD_BASE,4,32)
#define IOM_LCD_RETURN_HOME _IOW(IOM_LCD_BASE,5,32)
#define IOM_LCD_CLEAR _IOW(IOM_LCD_BASE,6,32)
#define IOM_LCD_DD_ADDRESS _IOW(IOM_LCD_BASE,7,32)
#define IOM_LCD_WRITE_BYTE _IOW(IOM_LCD_BASE,8,32)
struct strcommand_varible {
char rows;
char nfonts;
char display_enable;
char cursor_enable;
char nblink;
char set_screen;
char set_rightshit;
char increase;
char nshift;
char pos;
char command;
char strlength;
char buf[20];
};
void init_keyboard(void);
void close_keyboard(void);
int kbhit(void);
int readch(void);
static struct termios initial_settings, new_settings;
static int peek_character = -1;
//이 부분 함수들은 대략적으로 키보드 입력 유무를 판단하는 역활을 하는 것으로 추측하고 있습니다.
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
int kbhit()
{
unsigned char ch;
int nread;
if (peek_character != -1) return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1)
{
peek_character = ch;
return 1;
}
return 0;
}
int readch()
{
char ch;
if(peek_character != -1)
{
ch = peek_character;
peek_character = -1;
return ch;
}
read(0,&ch,1);
return ch;
}
int main(int argc, char **argv)
{
int year, month, day, hour, min, sec; // 각각의 값을 받아오기 위한 변수
time_t ltime;
struct tm * today; // time.h에 정의
int i,dev;
char front[20] = "KOO's STOP WATCH";
char row_buffer1[20]; //lcd 1번째 줄 출력을 위한 버퍼배열
char row_buffer2[20]; //lcd 2번째 줄 출력을 위한 버퍼배열
char *row_one = row_buffer1; //포인터로 버퍼배열을 불러오기 위한 변수
char *row_two = row_buffer2;
struct strcommand_varible strcommand;
strcommand.rows = 0;
strcommand.nfonts = 0;
strcommand.display_enable = 1;
strcommand.cursor_enable = 0;
strcommand.nblink = 0;
strcommand.set_screen = 1;
strcommand.set_rightshit= 0;
strcommand.increase = 1;
strcommand.nshift = 0;
strcommand.pos = 10;
strcommand.command = 1;
strcommand.strlength = 16;
memcpy(&strcommand.buf[0],front,20);
dev = open("/dev/TXTLCD", O_WRONLY|O_NDELAY );
if (dev != -1) { // txtlcd 디바이스 드라이버가 설치되었다면 실행
write(dev,&strcommand,32);
sleep(1); // lcd
time(ltime); //
today = localtime(<ime); //현재시간정보를 로딩
year = today->tm_year + 1900; //서기연도 표시
month = today->tm_mon + 1; // 0~11까지 값이므로 +1
day = today->tm_mday;
hour = today->tm_hour;
min = today->tm_min;
sec = today->tm_sec;
/* 이 부분은 버퍼에 년/월....시/초 를 넣어서 출력하는 부분인데 아직 완전히 이해가 안되었습니다.
(예를 들어 int year = 2005; 이고 int month = 8 일 때 char row_buffer1[20]; 에
char row_buffer1[0]에는 2 / char row_buffer1[1]에는 0 / char row_buffer1[2]에는 0 이런식으로 한자리씩 들어가게 해야되는데
이건 쫌 더 생각해볼 문제 같습니다. 몫과 나머지를 이용해서 한자리씩 구하면 될 듯한데 그러면 소스가 지저분해지고 역순으로 입력된다는....)
// display string input routin
memset(row_one,0,20); //버퍼 배열 초기화
memset(row_two,0,20);
printf("Input String [MAX: 16char]");
printf("\n First Line:");
fgets(row_one, 20, stdin); //stdin : 키보드 입력
printf(" Second Line:");
fgets(row_two, 20, stdin);
ioctl(dev,IOM_LCD_CLEAR,&strcommand,32);
sleep(1);
strcommand.pos = 0;
ioctl(dev,IOM_LCD_DD_ADDRESS,&strcommand,32);
for(i = 0;i < 16;i++) { // 0~ 16까지 배열로 돌면서 위에서 16자 입력값을 차례로 출력
if(row_one[i] == '\0') break;
memcpy(&strcommand.buf[0],&row_th[i],1); //버퍼 출력 부분
ioctl(dev,IOM_LCD_WRITE_BYTE,&strcommand,32);
}
sleep(1);
strcommand.pos = 40;
ioctl(dev,IOM_LCD_DD_ADDRESS,&strcommand,32);
for(i = 0;i < 16;i++) {
if(row_two[i] == '\0') break;
memcpy(&strcommand.buf[0],&row_fo[i],1);
ioctl(dev,IOM_LCD_WRITE_BYTE,&strcommand,32);
}
sleep(1);
init_keyboard();
for(;;){
ioctl(dev,IOM_LCD_CURSOR_SHIFT,&strcommand,32); //스크롤되는 부분
usleep(2000); //속도
if(kbhit()) break;
}
close_keyboard();
close(dev);
*/
//일단 타이머가 호스트에서라도 돌아가는지 확인하기 위해 바로 printf문을 썻습니다.
printf("%d %d %d\n", year, month, day);
printf("%d %d %d\n", hour, min, sec);
}
else { //디바이스 드라이버 설치 안되었을 경우
printf( "application : Device Open ERROR!\n");
exit(-1); //종료
}
return(0);
}
기본적인 뼈대는 이렇게 알고 있고요...시간이 정확하게 구현되면 이제
다음 단계인 출력버퍼배열에 집어넣는 걸 연구 할 계획입니다.
전역하고 바로 복학해서 수업을 듣는데 목표가 올A+인지라 코딩에만 시간을
많이 투자할 수 없었습니다. 내일 아침까지 이 문제를 해결해야 되는데
힘 내어야 겠어요 ^^
임베디드 리눅스 타겟용 소스를 배우고 싶어요
[b]ssehoony[/b]모르는게 많아서 부끄럽지만 제가 아는 만큼
ssehoony
모르는게 많아서 부끄럽지만 제가 아는 만큼 솔직하게 주석 달았습니다. ㅠㅠ
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>
#include <sys/time.h> // localtime()
#include <time.h> // tm 구조체
#define IOM_LCD_BASE 0xbc
#define IOM_LCD_COMMAND_SET _IOW(IOM_LCD_BASE,0,32)
#define IOM_LCD_FUNCTION_SET _IOW(IOM_LCD_BASE,1,32)
#define IOM_LCD_DISPLAY_CONTROL _IOW(IOM_LCD_BASE,2,32)
#define IOM_LCD_CURSOR_SHIFT _IOW(IOM_LCD_BASE,3,32)
#define IOM_LCD_ENTRY_MODE_SET _IOW(IOM_LCD_BASE,4,32)
#define IOM_LCD_RETURN_HOME _IOW(IOM_LCD_BASE,5,32)
#define IOM_LCD_CLEAR _IOW(IOM_LCD_BASE,6,32)
#define IOM_LCD_DD_ADDRESS _IOW(IOM_LCD_BASE,7,32)
#define IOM_LCD_WRITE_BYTE _IOW(IOM_LCD_BASE,8,32)
struct strcommand_varible {
char rows;
char nfonts;
char display_enable;
char cursor_enable;
char nblink;
char set_screen;
char set_rightshit;
char increase;
char nshift;
char pos;
char command;
char strlength;
char buf[20];
};
void init_keyboard(void);
void close_keyboard(void);
int kbhit(void);
int readch(void);
static struct termios initial_settings, new_settings;
static int peek_character = -1;
//이 부분 함수들은 대략적으로 키보드 입력 유무를 판단하는 역활을 하는 것으로 추측하고 있습니다.
void init_keyboard()
{
tcgetattr(0,&initial_settings);
new_settings = initial_settings;
new_settings.c_lflag &= ~ICANON;
new_settings.c_lflag &= ~ECHO;
new_settings.c_lflag &= ~ISIG;
new_settings.c_cc[VMIN] = 1;
new_settings.c_cc[VTIME] = 0;
tcsetattr(0, TCSANOW, &new_settings);
}
void close_keyboard()
{
tcsetattr(0, TCSANOW, &initial_settings);
}
int kbhit()
{
unsigned char ch;
int nread;
if (peek_character != -1) return 1;
new_settings.c_cc[VMIN]=0;
tcsetattr(0, TCSANOW, &new_settings);
nread = read(0,&ch,1);
new_settings.c_cc[VMIN]=1;
tcsetattr(0, TCSANOW, &new_settings);
if(nread == 1)
{
peek_character = ch;
return 1;
}
return 0;
}
int readch()
{
char ch;
if(peek_character != -1)
{
ch = peek_character;
peek_character = -1;
return ch;
}
read(0,&ch,1);
return ch;
}
int main(int argc, char **argv)
{
int year, month, day, hour, min, sec; // 각각의 값을 받아오기 위한 변수
time_t ltime;
struct tm * today; // time.h에 정의
int i,dev;
char front[20] = "KOO's STOP WATCH";
char row_buffer1[20]; //lcd 1번째 줄 출력을 위한 버퍼배열
char row_buffer2[20]; //lcd 2번째 줄 출력을 위한 버퍼배열
char *row_one = row_buffer1; //포인터로 버퍼배열을 불러오기 위한 변수
char *row_two = row_buffer2;
struct strcommand_varible strcommand;
strcommand.rows = 0;
strcommand.nfonts = 0;
strcommand.display_enable = 1;
strcommand.cursor_enable = 0;
strcommand.nblink = 0;
strcommand.set_screen = 1;
strcommand.set_rightshit= 0;
strcommand.increase = 1;
strcommand.nshift = 0;
strcommand.pos = 10;
strcommand.command = 1;
strcommand.strlength = 16;
memcpy(&strcommand.buf[0],front,20);
dev = open("/dev/TXTLCD", O_WRONLY|O_NDELAY );
if (dev != -1) { // txtlcd 디바이스 드라이버가 설치되었다면 실행
write(dev,&strcommand,32);
sleep(1); // lcd
time(ltime); //
today = localtime(<ime); //현재시간정보를 로딩
year = today->tm_year + 1900; //서기연도 표시
month = today->tm_mon + 1; // 0~11까지 값이므로 +1
day = today->tm_mday;
hour = today->tm_hour;
min = today->tm_min;
sec = today->tm_sec;
/* 이 부분은 버퍼에 년/월....시/초 를 넣어서 출력하는 부분인데 아직 완전히 이해가 안되었습니다.
(예를 들어 int year = 2005; 이고 int month = 8 일 때 char row_buffer1[20]; 에
char row_buffer1[0]에는 2 / char row_buffer1[1]에는 0 / char row_buffer1[2]에는 0 이런식으로 한자리씩 들어가게 해야되는데
이건 쫌 더 생각해볼 문제 같습니다. 몫과 나머지를 이용해서 한자리씩 구하면 될 듯한데 그러면 소스가 지저분해지고 역순으로 입력된다는....)
// display string input routin
memset(row_one,0,20); //버퍼 배열 초기화
memset(row_two,0,20);
printf("Input String [MAX: 16char]");
printf("\n First Line:");
fgets(row_one, 20, stdin); //stdin : 키보드 입력
printf(" Second Line:");
fgets(row_two, 20, stdin);
ioctl(dev,IOM_LCD_CLEAR,&strcommand,32);
sleep(1);
strcommand.pos = 0;
ioctl(dev,IOM_LCD_DD_ADDRESS,&strcommand,32);
for(i = 0;i < 16;i++) { // 0~ 16까지 배열로 돌면서 위에서 16자 입력값을 차례로 출력
if(row_one[i] == '\0') break;
memcpy(&strcommand.buf[0],&row_th[i],1); //버퍼 출력 부분
ioctl(dev,IOM_LCD_WRITE_BYTE,&strcommand,32);
}
sleep(1);
strcommand.pos = 40;
ioctl(dev,IOM_LCD_DD_ADDRESS,&strcommand,32);
for(i = 0;i < 16;i++) {
if(row_two[i] == '\0') break;
memcpy(&strcommand.buf[0],&row_fo[i],1);
ioctl(dev,IOM_LCD_WRITE_BYTE,&strcommand,32);
}
sleep(1);
init_keyboard();
for(;;){
ioctl(dev,IOM_LCD_CURSOR_SHIFT,&strcommand,32); //스크롤되는 부분
usleep(2000); //속도
if(kbhit()) break;
}
close_keyboard();
close(dev);
*/
//일단 타이머가 호스트에서라도 돌아가는지 확인하기 위해 바로 printf문을 썻습니다.
printf("%d %d %d\n", year, month, day);
printf("%d %d %d\n", hour, min, sec);
}
else { //디바이스 드라이버 설치 안되었을 경우
printf( "application : Device Open ERROR!\n");
exit(-1); //종료
}
return(0);
}
기본적인 뼈대는 이렇게 알고 있고요...시간이 정확하게 구현되면 이제
다음 단계인 출력버퍼배열에 집어넣는 걸 연구 할 계획입니다.
전역하고 바로 복학해서 수업을 듣는데 목표가 올A+인지라 코딩에만 시간을
많이 투자할 수 없었습니다. 내일 아침까지 이 문제를 해결해야 되는데
힘 내어야 겠어요 ^^
임베디드 리눅스 타겟용 소스를 배우고 싶어요
[quote]time(ltime); // [/quote]m
man 페이지를 못보는 상황이라..
time(time_t * ); 아닌가요??
언제나 시작
구글 형님께 물어보니time_t time(time_t *tloc)
구글 형님께 물어보니
time_t time(time_t *tloc) -- returns the time since 00:00:00 GMT, Jan. 1,
1970, measured in seconds
이군요
언제나 시작
[b]alwaysN00b[/b]답변 감사드리고요그럼ti
alwaysN00b
답변 감사드리고요
그럼
time(ltime); //
부분을 time_t time(time_t *tloc) 걸로 고치면 끝인가요?
아...제가 해봤는데요 위 방식은 도무지 이해가 안되네요
그냥 time(<ime)
today = localtime(<ime)으로 하니깐 시간 받아지네요..
이제 lcd 출력 부분만 해결하면 될 듯 싶어요
감사합니당
임베디드 리눅스 타겟용 소스를 배우고 싶어요
댓글 달기