2011-11-29 47 views
10

Hiện tại tôi đang phát triển mô đun hạt nhân GPIO cho Linux 2.6.32.2 thân thiện (mini2440). Tôi đến từ nền điện tử và mới cho Linux.Tác vụ định kỳ trong mô-đun hạt nhân Linux

Mô-đun hạt nhân được tải khi khởi động và tệp thiết bị có liên quan nằm ở /devgpiofreq.

Ở lần đầu tiên ghi vào tệp thiết bị, pin GPIO bật liên tục ở 50kHz. Ở lần thứ hai viết nó dừng toggling. Vào lần thứ ba, nó bắt đầu một lần nữa, và như vậy.

Tôi đã viết mô-đun hạt nhân riêng biệt để tạo freq. nhưng CPU bị đóng băng sau khi ghi tập tin thiết bị ở lần đầu tiên. Dấu nhắc thiết bị đầu cuối được hiển thị nhưng tôi không thể chạy bất kỳ lệnh nào sau đó.

Đây là mã-đoạn:

//calling function which generates continuous freq at gpio 

static int send_freq(void *arg) 
{ 
    set_current_state(TASK_INTERRUPTIBLE); 
    for(;;) 
    { 
     gpio_set_value(192,1); 
     udelay(10); 
     gpio_set_value(192,0); 
     udelay(10); 
    } 
    return 0; 
} 

Dưới đây là thiết bị ghi mã, mà bắt đầu hoặc dừng lại ở bất kỳ dữ liệu ghi vào tập tin thiết bị.

if(toggle==0) 
{ 
     printk("Starting Freq.\n"); 
     task=kthread_run(&send_freq,(void *)freq,"START"); 
     toggle=1; 
} 
else 
{ 
     printk("Operation Terminated.\n"); 
     i = kthread_stop(task); 
     toggle=0; 
} 
+2

* Tại sao * bạn có muốn nhiệm vụ của mình chạy hoàn toàn * bên trong hạt nhân * không? Sự khôn ngoan chung là có quy trình trợ giúp cấp người dùng .... –

+0

vì tôi muốn tối đa 100kHz. tôi đã thử một kịch bản shell cho phép tôi chuyển đổi tần số khoảng 750 Hz. và cũng là một chương trình c mang lại cho tôi tối đa 900 Hz. cả hai thực hiện thao tác ghi '1' và '0' trên tệp thiết bị "/ sys/class/gpio/gpio192/value". –

+0

Tôi không nghĩ rằng bạn sẽ có thể đạt được một tần số cao như vậy mà không cần tốn nhiều tài nguyên. – shodanex

Trả lời

9

Bạn đang làm một vòng lặp vô hạn trong một sợi hạt nhân, không có chỗ cho bất cứ điều gì khác xảy ra, ngoại trừ IRQ và đề hạt nhân có thể khác.

hoặc

  • chương trình gì bạn có thể làm là một bộ đếm thời gian trên phần cứng của bạn và làm toggling pin của bạn trong một ngắt

  • thay udelay với usleep_range

tôi khuyên bạn nên làm điều dần dần, và bắt đầu trong dải kHz với usleep_range, và cuối cùng chuyển sang bộ đếm thời gian cust om + ISR

trong cả hai trường hợp, bạn có thể sẽ có rất nhiều jitter, và làm như vậy gpio toggling có thể là một ý tưởng tốt trên một DSP hoặc PIC, nhưng là một sự lãng phí tài nguyên trên ARM + Linux, trừ khi bạn là phần cứng hỗ trợ pwm có khả năng gpio engine.

+0

Bạn cũng có thể cần biên dịch lại hạt nhân với giá trị 'CONFIG_HZ' cao hơn đáng kể để tăng tốc độ ngắt hẹn giờ. – caf

Các vấn đề liên quan