Прерывание таймера на Raspberry Pi под Linux

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

Я знаю, что вы можете получить прерывание при изменении контакта через wirePi (при запуске с правами администратора), поэтому, если есть свободное периферийное устройство таймера, это кажется возможным.

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

Предыстория: я знаю, что это совсем не то, чем Linux хорош, однако я заинтересован в добавлении возможности аппаратного таймера в Espruino интерпретатор JS. Первоначально он предназначался для микроконтроллеров и содержит некоторый код, который должен запускаться через IRQ таймера (например, для программного ШИМ, синхронизированных импульсов и других битов и бобов) - эта часть его была бы фактически бесполезна при работе в потоке.


person Gordon Williams    schedule 23.09.2015    source источник


Ответы (1)


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

Вот очень простая программа Hello World для Raspberry Pi с использованием wireingPi, которая переключает контакты 40 и 38. Контакт 40 переключается в основном цикле, а контакт 38 — от сигнала прерывания тревоги.

Скомпилируйте с помощью: gcc -Wall -o helloworld helloworld.c -lwiringPi

Control+c для выхода.

Надеюсь, это поможет,

JSU

привет мир.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
    }

}
person JSU    schedule 15.12.2016
comment
Спасибо - это выглядит великолепно. Вы хоть представляете, насколько он точен на чем-то вроде Pi? - person Gordon Williams; 15.12.2016
comment
Измерено на осциллографе (LeCroy Wave Ace 234), период контакта 38 составляет ровно 5 мс. Частота измеряется частотомером (HP 5381A) как 201,5 Гц. Так как синхронизация ualarm() выводится из тактовой частоты основного процессора, вы ожидаете, что она будет достаточно точной. - person JSU; 16.12.2016
comment
Отлично - спасибо, что проверили это - это огромная помощь! - person Gordon Williams; 16.12.2016