2015-09-23 2 views
1

Можно ли установить периферийное устройство аппаратного таймера на Raspberry Pi и получить прерывание в определенное время (во время работы под Linux)? Есть ли библиотека/пример?Таймер прерывания на Raspberry Pi под Linux

Я знаю, что вы можете get an irq when a pin changes через wiringPi (при работе с правами администратора), поэтому, если есть свободное периферийное устройство таймера, это кажется возможным.

this post на форумах Pi означает, что существует бесплатный регистр STC, а this one дает некоторую информацию, но помечен тегом «BareMetal», который, как я полагаю, означает, что Linux не задействован?

Справочная информация. Я знаю, что это не то, что у Linux хорошо, но я заинтересован в добавлении возможности аппаратного таймера в интерпретатор JS Espruino. Он первоначально предназначен для микроконтроллеров и содержит некоторый код, который, как ожидается, будет запущен через таймер IRQ (например, для программного обеспечения PWM, импульсов с синхронизацией и других бит и бит) - эта часть будет бесполезной при запуске в потоке.

ответ

1

Если я понял ваш вопрос, вы можете косвенно получить доступ к таймеру через alarm() и signal().

Вот очень простая программа Hello World для малины Pi, используя проводку Pi, которая переключает штырь 40 и контакт 38. Pin 40 переключается в основной контур и штырь 38 из сигнала прерывания тревоги.

Compile с: Gcc -Wall -o Helloworld helloworld.c -lwiringPi

Ctrl + C, чтобы бросить курить.

Я надеюсь, что это помогает,

JSU

helloworld.c

#include <wiringPi.h> 
#include <stdlib.h> 

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

void alarmWakeup(int sig_num); 


int main(int argc, char *argv[]) 
{ 
    unsigned int j; 

    wiringPiSetupPhys();//use the physical pin numbers on the P1 connector 


    pinMode(40, OUTPUT); 
    pinMode(38, OUTPUT); 

    signal(SIGALRM, alarmWakeup); 
    ualarm(5000, 5000); 


    while(1) 
    { 
     digitalWrite(40, HIGH); //pin 40 high 
     for(j=0; j<1000000; j++);//do something 
     digitalWrite(40, LOW); //pin 40 low 
     for(j=0; j<1000000; j++);//do something 
    } 

    return 0; 

}//int main(int argc, char *argv[]) 


void alarmWakeup(int sig_num) 
{ 
    unsigned int i; 

    if(sig_num == SIGALRM) 
    { 
     digitalWrite(38, HIGH); //pin 38 high 
     for(i=0; i<65535; i++); //do something 
     digitalWrite(38, LOW); //pin 38 low 
    } 

} 
+0

Спасибо - это выглядит здорово. Вы хоть представляете, насколько точны они на чем-то вроде Pi? –

+1

Измеренный по масштабу (LeCroy Wave Ace 234) период выводов 38 составляет ровно 5 мс. Частота измеряется как 201,5 Гц с помощью частотного счетчика (HP 5381A). Поскольку время ualarm() выводится из основного тактового сигнала процессора, вы ожидаете, что оно будет достаточно точным. – JSU

+0

Отлично - спасибо, что проверили, что это огромная помощь! –