2013-06-03 2 views
3

Добрый день. Моя цель - написать простую программу c, которая запускается на моем beagleboard-xm и открыть светодиод на gpio pin каждые 100 мс. Я хочу использовать прерывание таймера для достижения этого. Я пытаюсь с этим руководствомТаймер С программирование на beagleboard-xm с armstrong

http://www.kunen.org/uC/beagle/omap_dmtimer.html

, но я что-то пропустил. Нужно ли мне манипулировать ядром? Я установил родной компилятор GCC на BeagleBoard-хт и кросс-компилятор с кодом Sourcery на окнах 7 и я могу строить простые программы для манипулирования светодиодов, но и компилятор не распознает заголовки, используемые в учебнике:

#include <linux/module.h>  
#include <linux/kernel.h>  
#include <linux/init.h>   
#include <linux/clk.h>  
#include <linux/irq.h> 
#include <linux/interrupt.h> 
#include <asm/io.h>   
#include <mach/dmtimer.h> 
#include <linux/types.h> 

Любое предложение будет высоко оценено. Заранее спасибо Здесь я выкладываю код, который я использовал для GPIO манипулировать

#include <stdio.h> 
#include<signal.h> 
#include<unistd.h> 

void sig_handler(int signo) { 
    if (signo == SIGINT) { 
     FILE *fp; 
     if ((fp = fopen("/sys/class/gpio/gpio157/direction", "w")) == NULL) { 
      exit(1); 
     } else { 
      fprintf(fp, "low"); 
      fclose(fp); 
     } 

     fp = fopen("/sys/class/gpio/unexport", "w"); 
     fprintf(fp, "157"); 
     fclose(fp); 
     printf("Closing and cleaning \n"); 
    } 

} 

void main() { 
    FILE *fp; 

    printf("\n*************************************\n" 
      "* Welcome to PIN Blink program  *\n" 
      "* ....blinking pin 22 on port GPIO *\n" 
      "* ....rate of 1 Hz............  *\n" 
      "**************************************\n"); 

    if (signal(SIGINT, sig_handler) == SIG_ERR) 
     printf("\ncan't catch SIGINT\n"); 

    fp = fopen("/sys/class/gpio/export", "w"); 
    fprintf(fp, "157"); 
    fclose(fp); 

    printf("...export file accessed, new pin now accessible\n"); 

    while (1) { 
     if ((fp = fopen("/sys/class/gpio/gpio157/direction", "w")) == NULL) { 
      printf("Error \n"); 
      exit(1); 
     } 
     fprintf(fp, "high"); 
     fclose(fp); 
     sleep(1); 

     if ((fp = fopen("/sys/class/gpio/gpio157/direction", "w")) == NULL) { 
      printf("Error \n"); 
      exit(1); 
     } 
     fprintf(fp, "low"); 
     fclose(fp); 
     sleep(1); 
    } 

} 
+0

Установите файлы заголовков ядра, и если это не исправить вашу проблему, установите исходный код ядра. – JimR

+0

В вашем коде вы снова и снова открываете и закрываете файл «/ sys/class/gpio/gpio157/direction». Было бы гораздо быстрее просто открыть этот файл за пределами while() и закрыть его после while(). Затем внутри вы можете просто написать ему каждую секунду. Но даже так .. ознакомьтесь с моим комментарием к моему ответу ниже для ссылки setitimer/getitimer. Вы должны использовать это вместо sleep() –

ответ

1

Если вы хотите, чтобы иметь возможность манипулировать контакты GPIO из пользовательского пространства, то вам придется построить драйвер ядра/модуль сделайте это для вас. А затем вы можете отправлять сообщения через ioctl, proc или другие API-интерфейсы ядра в ваш драйвер для управления контактами GPIO.

Учебник выглядит как пример драйвера ядра. Вы не можете создавать обычную программу для пользователя с этими заголовками. Вам нужно либо просто построить пример «тестового драйвера», либо сделать то, что я сказал выше.

Существует множество ресурсов онлайн о драйверах ядра. Вот вам, с чего вы должны начать.

Linux Device Drivers, Third Edition

+0

Я добавил программу, которую я использовал для манипулирования выводами GPIO из пользовательского пространства. Как вы можете видеть, я использую сон, но я не знаю, как запросить таймер и написать процедуру прерывания. Спасибо –

+0

Использование сна - не очень хорошая идея. Существуют таймерные API, которые позволяют использовать таймеры в Linux. Как setitimer/getitimer. См. Http://man7.org/linux/man-pages/man2/setitimer.2.html. –