'develop'에 해당되는 글 84건
- 2012.09.21 debug 매크로
- 2012.09.10 eclipse에 확장자에 맞게 encoding옵션 설정하기
- 2012.03.08 tmake을 사용해서 makefile 만들기
- 2012.02.17 eclipse용 vim 플러그인
- 2012.02.09 eclipse에서 한글 인코딩 사용하기
- 2012.01.26 eclipse 기존 프로젝트 불러오기
- 2011.12.08 ttf(truetype) 폰트로 bdf 폰트 만들기
- 2011.12.07 점 찍기
- 2011.11.16 linux kernel thread
- 2011.11.11 DEBUG macro
#define DEBUG(fmt, arg...) fprintf(stderr, " [%s(), %s:%u] " fmt, __FUNCTION__, __FILE__, __LINE__, ## arg)
'develop' 카테고리의 다른 글
[eclipse] Todo 관리 plugin (0) | 2012.12.27 |
---|---|
[Doxygen] Doxygen에서 한글 표시 하기 (0) | 2012.12.06 |
eclipse에 확장자에 맞게 encoding옵션 설정하기 (0) | 2012.09.10 |
tmake을 사용해서 makefile 만들기 (0) | 2012.03.08 |
eclipse용 vim 플러그인 (0) | 2012.02.17 |
eclipse에 확장자에 맞게 encoding옵션 설정하기
develop 2012. 9. 10. 14:21
현재 리눅스상에서 eclipse을 이용해 euc-kr 기반의 소스파일들을 수정 및 개발하고 있다.
eclipse는 기본적인 encoding 옵션이 UTF-8로 되어 있기 때문에 소스에 쓰인 주석이나 한글문장들이 문제가 되고 있다.
이런 문제를 수정하기 위해서는 설정으로 들어가서
"Content Types" 항목에 들어가서 "Text" 항목에 있는 "C source file" 항목의 "Default encoding" 설정값을 변경한 후에 "Update"
버튼을 눌러주면 된다.(이미지 참조)
'develop' 카테고리의 다른 글
[Doxygen] Doxygen에서 한글 표시 하기 (0) | 2012.12.06 |
---|---|
debug 매크로 (0) | 2012.09.21 |
tmake을 사용해서 makefile 만들기 (0) | 2012.03.08 |
eclipse용 vim 플러그인 (0) | 2012.02.17 |
eclipse에서 한글 인코딩 사용하기 (0) | 2012.02.09 |
tmake을 사용해서 makefile 만들기
develop 2012. 3. 8. 14:42
설치하기
sudo apt-get install tmake
$ progen -o project_name.pro
$ tmake -o Makefile project_name.pro
sudo apt-get install tmake
* tmake로 makefile을 만들기 위해서는 tmake와 progen 유틸이 필요하다. 우분투를 사용할 경우프로젝트 파일 만들기
위에 명령으로 유틸을 설치하면 특별한 설정 없이 바로 사용할 수 있다.
$ progen -o project_name.pro
makefile을 생성하기 전에 .pro파일을 만들어야 한다.makefile 파일 만들기
$ tmake -o Makefile project_name.pro
전에 생성한 .pro파일 이름을 써 주면 된다.makefile이 만들어 졌으면 QT에 종속적인 옵션들은 삭제해 주고 자신의 프로젝트에 맞게 약간의 수정이 필요할 수도 있다.
MOC, UIC, QTDIR 매크로는 필히 삭제해 준다.
'develop' 카테고리의 다른 글
debug 매크로 (0) | 2012.09.21 |
---|---|
eclipse에 확장자에 맞게 encoding옵션 설정하기 (0) | 2012.09.10 |
eclipse용 vim 플러그인 (0) | 2012.02.17 |
eclipse에서 한글 인코딩 사용하기 (0) | 2012.02.09 |
eclipse 기존 프로젝트 불러오기 (0) | 2012.01.26 |
eclipse용 vim 플러그인
develop 2012. 2. 17. 15:52
'develop' 카테고리의 다른 글
eclipse에 확장자에 맞게 encoding옵션 설정하기 (0) | 2012.09.10 |
---|---|
tmake을 사용해서 makefile 만들기 (0) | 2012.03.08 |
eclipse에서 한글 인코딩 사용하기 (0) | 2012.02.09 |
eclipse 기존 프로젝트 불러오기 (0) | 2012.01.26 |
ttf(truetype) 폰트로 bdf 폰트 만들기 (0) | 2011.12.08 |
eclipse에서 한글 인코딩 사용하기
develop 2012. 2. 9. 13:54
window->preferences 에서 filter에 content type을 입력해서 content type 설정으로 들어가자
내용을 보면 각 파일 확장자가 나오는데 거기서 원하는 타입을 선택한 다음에 Default encoding에
KSC5601이나 euc-kr을 써주고 업데이트하면 된다.
내용을 보면 각 파일 확장자가 나오는데 거기서 원하는 타입을 선택한 다음에 Default encoding에
KSC5601이나 euc-kr을 써주고 업데이트하면 된다.
'develop' 카테고리의 다른 글
tmake을 사용해서 makefile 만들기 (0) | 2012.03.08 |
---|---|
eclipse용 vim 플러그인 (0) | 2012.02.17 |
eclipse 기존 프로젝트 불러오기 (0) | 2012.01.26 |
ttf(truetype) 폰트로 bdf 폰트 만들기 (0) | 2011.12.08 |
linux kernel thread (0) | 2011.11.16 |
eclipse 기존 프로젝트 불러오기
develop 2012. 1. 26. 10:24
File -> Import을 클릭해서 새로나온 창에서 Existing Projects into workspace을 선택하고,
해당 프로젝트가 있는 디렉토리를 선택한 후 가져올 프로젝트를 불러온다.
copy projects into workspace을 체크하면 해당 프로젝트를 현재 내가 사용하고 있는 workspace로 복사해 온다.
해당 프로젝트가 있는 디렉토리를 선택한 후 가져올 프로젝트를 불러온다.
copy projects into workspace을 체크하면 해당 프로젝트를 현재 내가 사용하고 있는 workspace로 복사해 온다.
'develop' 카테고리의 다른 글
eclipse용 vim 플러그인 (0) | 2012.02.17 |
---|---|
eclipse에서 한글 인코딩 사용하기 (0) | 2012.02.09 |
ttf(truetype) 폰트로 bdf 폰트 만들기 (0) | 2011.12.08 |
linux kernel thread (0) | 2011.11.16 |
DEBUG macro (0) | 2011.11.11 |
ttf(truetype) 폰트로 bdf 폰트 만들기
develop 2011. 12. 8. 16:41
otf2bdf 라는 유틸이 필요하다.
$ otf2bdf <TTF 파일이름> -o <BDF 파일이름> -p <폰트사이즈>
$ otf2bdf <TTF 파일이름> -o <BDF 파일이름> -p <폰트사이즈>
'develop' 카테고리의 다른 글
eclipse에서 한글 인코딩 사용하기 (0) | 2012.02.09 |
---|---|
eclipse 기존 프로젝트 불러오기 (0) | 2012.01.26 |
linux kernel thread (0) | 2011.11.16 |
DEBUG macro (0) | 2011.11.11 |
[pastebin.com] 간단한 소스코드 공유 사이트 (0) | 2011.10.12 |
점 찍기
develop/SDL 2011. 12. 7. 16:01
void DrawPixel(SDL_Surface *dst, Uint32 x, Uint32 y, Uint8 R, Uint8 G, Uint8 B)
{
Uint32 color = SDL_MapRGB(dst->format, R, G, B);
switch( dst->format->BytesPerPixel )
{
case 1: // Assuming 8-bpp
{
Uint8 *bufp;
bufp = (Uint8 *)dst->pixels + y * dst->pitch + x;
*bufp = color;
}
break;
case 2: // probably 15-bpp or 16-bpp
{
Uint16 *bufp;
bufp = (Uint16 *)dst->pixels + y * dst->pitch/2 + x;
*bufp = color;
}
break;
case 3: // slow 24-bpp mode, usually not used
{
Uint8 *bufp;
bufp = (Uint8 *)dst->pixels + y * dst->pitch + x * 3;
if (SDL_BYTEORDER == SDL_LIL_ENDIAN)
{
bufp[0] = color;
bufp[1] = color >> 8;
bufp[2] = color >> 16;
}
else
{
bufp[2] = color;
bufp[1] = color >> 8;
bufp[0] = color >> 16;
}
}
break;
case 4: // probably 32-bpp
{
Uint32 *bufp;
bufp = (Uint32 *)dst->pixels + y * dst->pitch/4 + x;
*bufp = color;
}
break;
}
}
{
Uint32 color = SDL_MapRGB(dst->format, R, G, B);
switch( dst->format->BytesPerPixel )
{
case 1: // Assuming 8-bpp
{
Uint8 *bufp;
bufp = (Uint8 *)dst->pixels + y * dst->pitch + x;
*bufp = color;
}
break;
case 2: // probably 15-bpp or 16-bpp
{
Uint16 *bufp;
bufp = (Uint16 *)dst->pixels + y * dst->pitch/2 + x;
*bufp = color;
}
break;
case 3: // slow 24-bpp mode, usually not used
{
Uint8 *bufp;
bufp = (Uint8 *)dst->pixels + y * dst->pitch + x * 3;
if (SDL_BYTEORDER == SDL_LIL_ENDIAN)
{
bufp[0] = color;
bufp[1] = color >> 8;
bufp[2] = color >> 16;
}
else
{
bufp[2] = color;
bufp[1] = color >> 8;
bufp[0] = color >> 16;
}
}
break;
case 4: // probably 32-bpp
{
Uint32 *bufp;
bufp = (Uint32 *)dst->pixels + y * dst->pitch/4 + x;
*bufp = color;
}
break;
}
}
'develop > SDL' 카테고리의 다른 글
[sdl] SDL_FillRect (0) | 2011.03.16 |
---|---|
[sdl] SDL_MapRGB (0) | 2011.03.15 |
linux kernel thread
develop 2011. 11. 16. 15:56
Linux Kernel Threads in Device Drivers
Purpose
This examples shows how to create and stop a kernel thread.The driver is implemented as a loadable module. In the init_module() routine five kernel threads are created. This kernel threads sleep one second, wake up, print a message and fall asleep again. On unload of the module (cleanup_module), the kernel threads are killed.
The example has been tested with Linux kernel 2.4.2 on Intel (uni processor only) and Alpha platform (COMPAQ Personal Workstation 500au (uni processor), DS20 and ES40 (SMP).
A version for the 2.2 kernel can be found here. Note: depending on the context of the creator of the threads the new threads may inherit properties from the parent you do not want to have. The new version avoids this by having keventd
create the threads. The 2.2. kernel do not have a keventd
, so this approach is not implementable there.
Functions in example
start_kthread
: creates a new kernel thread. Can be called from any process context but not from interrupt. The functions blocks until the thread started.stop_kthread
: stop the thread. Can be called from any process context but the thread to be terminated. Cannot be called from interrupt context. The function blocks until the thread terminated.init_kthread
: sets the environment of the new threads. Is to be called out of the created thread.exit_kthread
: needs to be called by the thread to be terminated on exit
Creation of new Thread
A new thread is created withkernel_thread()
. The thread inherits properties from its parents. To make sure that we do not get any weired properties, we let keventd
create the new thread.The new thread is created with
start_kthread()
. It uses a semaphore to block until the new thread is running. A down()
blocks the start_kthread()
routine until the corresponding up()
call in init_kthread()
is executed. The new thread must call
init_kthread()
in order to let the creator continue.Stop of new Thread
stop_kthread()
sets a flag that the thread uses to determine whether do die or not and sends a SIGKILL to the thread. This signal causes the thread to be woken up. On wakeup it will check for the flag and then terminate itself by calling exit_kthread
and returning from the thread function. With a semaphore the stop_kthread()
function blocks until the thread terminated.Initialization of new Thread
Within the new created thread,init_kthread()
needs to be called. This function sets a signal mask, initialises a wait queue, the termination flag and sets a new name for the thread. With a up()
call it notifies the creator that the setup is done.Exit of new Thread
When the thread receives the notification to terminate itself, is calls theexit_kthread()
function. It notifies the stop_kthread()
function that it terminated with an up()
call.The new Thread itself
The new thread is implemented in theexample_thread()
function. It runs an endless loop (for(;;)
). In the loop it falls asleep with the interruptible_sleep_on_timeout()
function. It comes out of this function either when the timeout expires or when a signal got caught.The "work" in the thread is to print out a message with printk.
Kernel Versions
The example has been tested on 2.4.2.Example Device Driver Code
The example consists of four files: kthread.h, kthread.c, thread_drv.c and a Makefilekthread.h
#ifndef _KTHREAD_H
#define _KTHREAD_H
#include <linux/config.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/tqueue.h>
#include <linux/wait.h>
#include <asm/unistd.h>
#include <asm/semaphore.h>
/* a structure to store all information we need
for our thread */
typedef struct kthread_struct
{
/* private data */
/* Linux task structure of thread */
struct task_struct *thread;
/* Task queue need to launch thread */
struct tq_struct tq;
/* function to be started as thread */
void (*function) (struct kthread_struct *kthread);
/* semaphore needed on start and creation of thread. */
struct semaphore startstop_sem;
/* public data */
/* queue thread is waiting on. Gets initialized by
init_kthread, can be used by thread itself.
*/
wait_queue_head_t queue;
/* flag to tell thread whether to die or not.
When the thread receives a signal, it must check
the value of terminate and call exit_kthread and terminate
if set.
*/
int terminate;
/* additional data to pass to kernel thread */
void *arg;
} kthread_t;
/* prototypes */
/* start new kthread (called by creator) */
void start_kthread(void (*func)(kthread_t *), kthread_t *kthread);
/* stop a running thread (called by "killer") */
void stop_kthread(kthread_t *kthread);
/* setup thread environment (called by new thread) */
void init_kthread(kthread_t *kthread, char *name);
/* cleanup thread environment (called by thread upon receiving termination signal) */
void exit_kthread(kthread_t *kthread);
#endif
kthread.c
#include <linux/config.h> #include <linux/version.h> #if defined(MODVERSIONS) #include <linux/modversions.h> #endif #include <linux/kernel.h> #include <linux/sched.h> #include <linux/tqueue.h> #include <linux/wait.h> #include <linux/signal.h> #include <asm/semaphore.h> #include <asm/smplock.h> #include "kthread.h" /* private functions */ static void kthread_launcher(void *data) { kthread_t *kthread = data; kernel_thread((int (*)(void *))kthread->function, (void *)kthread, 0); } /* public functions */ /* create a new kernel thread. Called by the creator. */ void start_kthread(void (*func)(kthread_t *), kthread_t *kthread) { /* initialize the semaphore: we start with the semaphore locked. The new kernel thread will setup its stuff and unlock it. This control flow (the one that creates the thread) blocks in the down operation below until the thread has reached the up() operation. */ init_MUTEX_LOCKED(&kthread->startstop_sem); /* store the function to be executed in the data passed to the launcher */ kthread->function=func; /* create the new thread my running a task through keventd */ /* initialize the task queue structure */ kthread->tq.sync = 0; INIT_LIST_HEAD(&kthread->tq.list); kthread->tq.routine = kthread_launcher; kthread->tq.data = kthread; /* and schedule it for execution */ schedule_task(&kthread->tq); /* wait till it has reached the setup_thread routine */ down(&kthread->startstop_sem); } /* stop a kernel thread. Called by the removing instance */ void stop_kthread(kthread_t *kthread) { if (kthread->thread == NULL) { printk("stop_kthread: killing non existing thread!\n"); return; } /* this function needs to be protected with the big kernel lock (lock_kernel()). The lock must be grabbed before changing the terminate flag and released after the down() call. */ lock_kernel(); /* initialize the semaphore. We lock it here, the leave_thread call of the thread to be terminated will unlock it. As soon as we see the semaphore unlocked, we know that the thread has exited. */ init_MUTEX_LOCKED(&kthread->startstop_sem); /* We need to do a memory barrier here to be sure that the flags are visible on all CPUs. */ mb(); /* set flag to request thread termination */ kthread->terminate = 1; /* We need to do a memory barrier here to be sure that the flags are visible on all CPUs. */ mb(); kill_proc(kthread->thread->pid, SIGKILL, 1); /* block till thread terminated */ down(&kthread->startstop_sem); /* release the big kernel lock */ unlock_kernel(); /* now we are sure the thread is in zombie state. We notify keventd to clean the process up. */ kill_proc(2, SIGCHLD, 1); } /* initialize new created thread. Called by the new thread. */ void init_kthread(kthread_t *kthread, char *name) { /* lock the kernel. A new kernel thread starts without the big kernel lock, regardless of the lock state of the creator (the lock level is *not* inheritated) */ lock_kernel(); /* fill in thread structure */ kthread->thread = current; /* set signal mask to what we want to respond */ siginitsetinv(¤t->blocked, sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGTERM)); /* initialise wait queue */ init_waitqueue_head(&kthread->queue); /* initialise termination flag */ kthread->terminate = 0; /* set name of this process (max 15 chars + 0 !) */ sprintf(current->comm, name); /* let others run */ unlock_kernel(); /* tell the creator that we are ready and let him continue */ up(&kthread->startstop_sem); } /* cleanup of thread. Called by the exiting thread. */ void exit_kthread(kthread_t *kthread) { /* we are terminating */ /* lock the kernel, the exit will unlock it */ lock_kernel(); kthread->thread = NULL; mb(); /* notify the stop_kthread() routine that we are terminating. */ up(&kthread->startstop_sem); /* the kernel_thread that called clone() does a do_exit here. */ /* there is no race here between execution of the "killer" and real termination of the thread (race window between up and do_exit), since both the thread and the "killer" function are running with the kernel lock held. The kernel lock will be freed after the thread exited, so the code is really not executed anymore as soon as the unload functions gets the kernel lock back. The init process may not have made the cleanup of the process here, but the cleanup can be done safely with the module unloaded. */ }
thread_drv.c
#include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h>
#if defined(MODVERSIONS)
#include <linux/modversions.h>
#endif
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/errno.h>
#include <linux/sched.h>
#include "kthread.h"
#define NTHREADS 5
/* the variable that contains the thread data */
kthread_t example[NTHREADS];
/* prototype for the example thread */
static void example_thread(kthread_t *kthread);
/* load the module */
int init_module(void)
{
int i;
/* create new kernel threads */
for (i=0; i <NTHREADS; i++)
start_kthread(example_thread, &example[i]);
return(0);
}
/* remove the module */
void cleanup_module(void)
{
int i;
/* terminate the kernel threads */
for (i=0; i<NTHREADS; i++)
stop_kthread(&example[i]);
return;
}
/* this is the thread function that we are executing */
static void example_thread(kthread_t *kthread)
{
/* setup the thread environment */
init_kthread(kthread, "example thread");
printk("hi, here is the kernel thread\n");
/* an endless loop in which we are doing our work */
for(;;)
{
/* fall asleep for one second */
interruptible_sleep_on_timeout(&kthread->queue, HZ);
/* We need to do a memory barrier here to be sure that
the flags are visible on all CPUs.
*/
mb();
/* here we are back from sleep, either due to the timeout
(one second), or because we caught a signal.
*/
if (kthread->terminate)
{
/* we received a request to terminate ourself */
break;
}
/* this is normal work to do */
printk("example thread: thread woke up\n");
}
/* here we go only in case of termination of the thread */
/* cleanup the thread, leave */
exit_kthread(kthread);
/* returning from the thread here calls the exit functions */
}
Makefile
# set to your kernel tree
KERNEL = /usr/src/linux
# get the Linux architecture. Needed to find proper include file for CFLAGS
ARCH=$(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
# set default flags to compile module
CFLAGS = -D__KERNEL__ -DMODULE -I$(KERNEL)/include
CFLAGS+= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -fno-strict-aliasing
all: thread_mod.o
# get configuration of kernel
include $(KERNEL)/.config
# modify CFLAGS with architecture specific flags
include $(KERNEL)/arch/${ARCH}/Makefile
# enable the module versions, if configured in kernel source tree
ifdef CONFIG_MODVERSIONS
CFLAGS+= -DMODVERSIONS -include $(KERNEL)/include/linux/modversions.h
endif
# enable SMP, if configured in kernel source tree
ifdef CONFIG_SMP
CFLAGS+= -D__SMP__
endif
# note: we are compiling the driver object file and then linking
# we link it into the module. With just one object file as in
# this example this is not needed. We can just load the object
# file produced by gcc
# link the thread driver module
thread_mod.o: thread_drv.o kthread.o
ld -r -o thread_mod.o thread_drv.o kthread.o
# compile the kthread object file
kthread.o: kthread.c kthread.h
gcc $(CFLAGS) -c kthread.c
# compile the thread driver
thread_drv.o: thread_drv.c kthread.h
gcc $(CFLAGS) -c thread_drv.c
clean:
rm -f *.o
Bugs
The code assumes thatkeventd
is running with PID 2.Comments, Corrections
Please send comments, corrections etc. to the address below.'develop' 카테고리의 다른 글
eclipse 기존 프로젝트 불러오기 (0) | 2012.01.26 |
---|---|
ttf(truetype) 폰트로 bdf 폰트 만들기 (0) | 2011.12.08 |
DEBUG macro (0) | 2011.11.11 |
[pastebin.com] 간단한 소스코드 공유 사이트 (0) | 2011.10.12 |
bitmap header info (0) | 2011.10.11 |
DEBUG macro
develop 2011. 11. 11. 14:20
#ifdef DEBUG
#define DEBUGF(fmt, args...) printk(fmt, ##args)
#else
#define DEBUG(fmt, args...)
#endif
#define DEBUGF(fmt, args...) printk(fmt, ##args)
#else
#define DEBUG(fmt, args...)
#endif
'develop' 카테고리의 다른 글
ttf(truetype) 폰트로 bdf 폰트 만들기 (0) | 2011.12.08 |
---|---|
linux kernel thread (0) | 2011.11.16 |
[pastebin.com] 간단한 소스코드 공유 사이트 (0) | 2011.10.12 |
bitmap header info (0) | 2011.10.11 |
[ffmpeg] ffmpeg and SDL tutorial site (0) | 2011.07.05 |