作者 主題: 在Linux Kernel為 2.4.23-pre2中,產生timer的函式  (閱讀 7188 次)

0 會員 與 1 訪客 正在閱讀本文。

studymate

  • 可愛的小學生
  • *
  • 文章數: 16
    • 檢視個人資料
哈囉,各位大大們:
在Red Hat Linux上,利用mipsel-linux-gcc交叉編譯器(cross-compiler)來編譯自行撰寫的程式,最後將程式移植到Target系統上。Target的系統是Red Hat Linux,而Linux Kernel為2.4.23-pre2版本。
自行撰寫一支程式(不是driver),它需要使用到timers(periodic timer及 one-shot timer)。
一開始考慮使用timer_create, timer_settime, timer_delete來產生timers,於是寫個測試的程式來觀察系統是否支援:

代碼: [選擇]
#include <stdlib.h>
#include <signal.h>
#include <time.h>
 
int main()
{
   struct sigevent sigev;
   timer_t timerid;
   
   if (timer_create(CLOCK_REALTIME, &sigev, &timerid) !=0) {
      perror("timer_create error:");
      exit(1);
   }
   exit(0);
}

編譯的方式:[mipsel-linux-gcc -o timercreate timercreate.c -static librt.a]
librt.a同樣是利用交叉編譯器編譯過librt,利用[mipsel-linux-nm librt.a]來觀察裡面的內容,確定它包含timer_create、timer_delete、timer_settime:

代碼: [選擇]
mq_open.o:
         U __errno_location
         U _gp_disp
00000000 T mq_open

mq_close.o:

mq_unlink.o:
         U __errno_location
         U _gp_disp
00000000 T mq_unlink

mq_getsetattr.o:
         U __errno_location
         U _gp_disp
00000054 T mq_getattr
00000000 T mq_setattr

mq_send.o:

mq_receive.o:

mq_notify.o:
         U __errno_location
         U _gp_disp
00000000 T mq_notify

timer_create.o:
         U __errno_location
         U free
         U _gp_disp
         U malloc
00000000 T timer_create

timer_delete.o:
         U __errno_location
         U free
         U _gp_disp
00000000 T timer_delete

timer_settime.o:
         U __errno_location
         U _gp_disp
00000000 T timer_settime

timer_gettime.o:
         U __errno_location
         U _gp_disp
00000000 T timer_gettime

timer_getoverr.o:

將編譯完成的程式移植到Target的系統,執行之後得到[timer_create error:: Function not implemented]。
後來查了這篇文章http://manpages.courier-mta.org/htmlman2/syscalls.2.html,文中提到timer_create、timer_delete、timer_settime這三個函式在Linux Kernel 2.6版才有支援。

於是就尋找其它的替代函式,找到init_timer(), add_timer(), del_timer(),同樣寫了一支測試的程式:

代碼: [選擇]
#include <stdio.h>
#include <stdlib.h>
#include <linux/timer.h>

void print(unsigned int number)
{
        printf("%d",number);
}

int main(void)
{
        struct timer_list *tl = (struct timer_list*) malloc (sizeof(struct timer_list));

        init_timer(tl);
        tl->expires = 100;
        tl->function = print;

        add_timer(tl);
        return 0;
}

先以Host上Normal GCC來編譯,編譯的方式:[gcc -o timercreate timercreate.c -D__KERNEL__ -DMODULE]
出現
In file included from /usr/include/linux/prefetch.h:13,
                 from /usr/include/linux/list.h:6,
                 from /usr/include/linux/timer.h:17,
                 from timercreate.c:3:
/usr/include/asm/processor.h:73: error: array type has incomplete element type
In file included from timercreate.c:3:
/usr/include/linux/timer.h:42: error: conflicting types for ‘timer_t’
/usr/include/time.h:104: error: previous declaration of ‘timer_t’ was here
/usr/include/linux/timer.h:45: error: expected specifier-qualifier-list before ‘spinlock_t’
timercreate.c: In function ‘main’:
timercreate.c:16: warning: assignment from incompatible pointer type

不曉得大大們有沒有遇過這種經驗,給我一些建議。
謝謝。

chyanlong

  • 可愛的小學生
  • *
  • 文章數: 19
    • 檢視個人資料
隔那麼久了,現在回可能已經沒什麼幫助了;不過請容不才賣弄一下

init_timer()跟add_timer()應該是 linux kernel 的 API 在 user space 應該是無法使用的
就你的須求可以參考下列程式碼

代碼: [選擇]
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>

void alarm_handler(int signo)
{
    printf("Timer hit!\n");
}

int main(int argc, char **argv)
{
    struct itimerval delay;
    int ret;
   
    signal(SIGALRM, alarm_handler);

    delay.it_value.tv_sec = 5;
    delay.it_value.tv_usec = 0;
    delay.it_interval.tv_sec = 1;
    delay.it_interval.tv_usec = 0;

    ret = setitimer(ITIMER_REAL, &delay, NULL);
   
    if (ret)
    {
        perror("setitimer");
        return;
    }

    pause();
}

PS. 以上程式碼抄襲自 linux system programming