代码之家  ›  专栏  ›  技术社区  ›  Gordon Williams

Linux下Raspberry Pi上的定时器中断

  •  5
  • Gordon Williams  · 技术社区  · 11 年前

    有没有可能在树莓派上设置一个硬件定时器外设,并在某个时间(在Linux下运行时)获得中断?是否有图书馆/示例?

    我知道你可以 get an irq when a pin changes 通过wiringPi(当以管理员权限运行时),所以如果有免费的定时器外设,这似乎是可能的。

    this post 在Pi论坛上,意味着有一个免费的STC注册,以及 this one 提供了一些信息,但被标记为“BareMetal”,我想这意味着Linux没有参与?

    背景:我知道这根本不是Linux擅长的,但是我对在 Espruino JS解释器。它最初用于微控制器,包含一些期望通过定时器IRQ运行的代码(例如,用于软件PWM、定时脉冲和其他位和字节)-如果在线程中运行,这部分代码实际上是无用的。

    1 回复  |  直到 11 年前
        1
  •  7
  •   JSU    9 年前

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

    这是一个非常简单的Raspberry Pi Hello World程序,使用wiringPi,切换引脚40和引脚38。 引脚40在主回路中切换,引脚38从报警中断信号切换。

    编译时使用: gcc-墙-o helloworld helloworld。c-lwiringPi

    控制+c退出。

    我希望这有帮助,

    联合安全部队

    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
        }
    
    }