树莓派Linux下的定时器中断

5
是否可以在树莓派上设置硬件定时器外设,并在特定时间(在Linux下运行时)得到中断?是否有库/示例?
我知道您可以通过wiringPi(在以管理员权限运行时)获取引脚变化时的irq,因此如果有空闲的定时器外设,则似乎是可能的。
树莓派论坛上这篇帖子暗示有一个空闲的STC寄存器,而这篇帖子提供了一些信息,但标记为“BareMetal”,我假设这意味着没有涉及Linux?
背景:我知道这不是Linux擅长的领域,但我有兴趣为Espruino JS解释器添加硬件定时器功能。它最初是为微控制器设计的,并包含一些代码,期望通过计时器IRQ运行(例如软件PWM,定时脉冲和其他零碎的部分)-如果在线程中运行,则该部分将有效地无用。
1个回答

8

如果我理解您的问题,您可以通过alarm()和signal()间接地访问计时器。

以下是一个非常简单的树莓派Hello World程序,使用wiringPi来切换引脚40和引脚38。在主循环中切换引脚40,在闹钟中断信号中切换引脚38。

编译命令: gcc -Wall -o helloworld helloworld.c -lwiringPi

按Control+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
    }

}

谢谢 - 看起来很不错。你有没有想过在树莓派上的准确度会是多少? - Gordon Williams
3
使用示波器(LeCroy Wave Ace 234)测量,引脚38的周期恰好为5毫秒。使用频率计(HP 5381A)测量频率为201.5赫兹。由于ualarm()的定时是从主处理器时钟派生出来的,因此您会预期它非常准确。 - JSU
太好了 - 感谢您的检查 - 这对我帮助很大! - Gordon Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接