这覆盆子PI.是一种微型计算机,设计在一块单板上,具有运行操作系统所需的所有基本组件。Raspberry pi板在ARM11处理器上运行,但价格非常便宜。电路板配有RCA连接器,可用于连接电路板直接对着电视屏幕它基于PAL和NTSC标准。该板还具有HDMI接口输出,可用于将该板连接到高清电视。有一个以太网端口,可用于将电路板连接到计算机网络。
Raspberrypi板上提供了Archlinux ARM、OpenELEC、Pidora、Raspbmc、RISC OS和Raspbian等操作系统以及Ubuntu版本。Linux操作系统尤其地Ubuntu对于所有类型的编程和开发是首选。具有在嵌入式系统设备上运行的Ubuntu这样的操作系统的直接优势是多任务处理。Raspberrypi实际上是为帮助远程学校的计算机教育而设计的一个板,但它是程序员特别是初学者探索各种编码技术的一个很好的平台。
在一个多任务系统几个过程一次将运行。操作系统可以通过向其发送信号来控制一个过程。用户有时可以发起信号发送,并且进程也可以彼此发送信号。该项目展示了进程如何接收信号调用SIGALRM,并使用它.
信号是一种软件中断,可以发送到当前在操作系统中执行的过程。大多数情况下操作系统自动向进程发送信号,有时用户可以发起信号发送。过程还可以通过调用一些特定功能来彼此发送信号。发送信号,以便通知过程需要立即关注的东西。使用不同的信号来通知不同的事件,并且信号由它们的信号编号区分。可以使用以下命令获得OS中所有可用信号及其信号编号的列表;
杀死-l.
下表列出了进程在操作系统中可能遇到的最常见信号;
名称 |
数字 |
描述 |
叹息 |
1 |
当Linux与终端断开连接时,它会向进程发送此信号。 |
信号 |
2 |
Linux在用户尝试结束时发送此信号的过程 按CTRL + C。 |
西格尔 |
4. |
Linux在进程试图执行非法指令时发送此信号。 |
SIGABRT |
6. |
当进程调用'abort()'函数时,Linux向进程发送此信号 |
我试 |
8. |
Linux在执行无效浮点数学指令时发送此信号的过程 |
西格基尔 |
9. |
Linux发送此信号的进程立即结束 |
Sigusr1. |
10. |
用户程序可以将这个信号发送给其他进程 |
Sigusr2. |
12. |
用户程序可以将这个信号发送给其他进程 |
SIGSEGV信号 |
11. |
当程序尝试无效的内存访问时,Linux会向进程发送此信号 |
sigpipe. |
13. |
Linux在程序尝试访问已关闭的套接字连接(如已关闭的套接字连接)时发送此信号此信号 |
西格尔姆 |
14. |
一个过程可以在其参数中提到的时间段之后,使用函数警报()从Linux接收此信号。 |
SIGTERM |
15. |
Linux发送一个进程,请求它终止该信号 |
SIGCHLD |
17. |
当子进程退出时,Linux向进程发送此信号 |
SIGXCPU |
24. |
Linux在超过限制时发送此信号的过程 CPU时间可以消耗。 |
SIGVTALRM |
26. |
进程可以在其参数中提到的一段时间后,使用函数setitimer()从Linux接收此信号。 |
图2:操作系统中告警信号处理的常用信号列表
与接收到的信号相对应的处理步骤称为“信号处理”。它与“中断服务”非常相似,就像“中断服务例程”一样,应该有一个名为“信号处理程序”的函数,它可以根据接收到的信号执行必要的操作。可以使用名为'信号 ()”。这个特殊的项目是基于接收和处理14号信号SIGALRM。
在这个项目中,Raspberrypi板加载了Ubuntu,是使用VNC远程访问.树莓董事会也是如此连接到互联网. 有26个连接器可从Raspberrypi板的连接器端口取出。使用13*2针内螺纹接头取出所有接头针脚,并在其导线的另一端连接26针外螺纹接头。Burg stick公接头允许Raspberrypi板上的每个插脚插入到试验板的孔中。要使用C语言访问Raspberrypi板Broadcom控制器输出的管脚,可以使用一个名为“bcm2835”的C库,该库已下载并安装.
进程可以通过调用名为' alarm() '的函数来接收来自OS的SIGALRM信号。在函数调用期间传递给函数的参数中提到的一段时间后,操作系统将把SIGALRM发送给进程。
警报 ()
对alarm()函数的调用将使操作系统在传递给函数的参数中提到的时间段之后向进程发送SIGALRM。该函数的原型定义在头文件
无符号整数报警(无符号整数秒);
唯一的参数是调用此函数后,在接收SIGALRM之前应经过的秒数。如果进程想要取消任何现有报警,可以通过调用秒参数为零的报警来完成。返回值指示在发送前一个报警之前还剩多少秒。如果之前没有报警,则报警返回零。
对报警()的单个调用将仅接收单个SIGALRM信号。要在2秒后接收SIGALRM,可以使用以下语句:;
警报(2);
假设一个函数;说' sig_handler '声明如下;
void sig_handler(int signo);
要使函数' sig_handler '作为SIGALRM的信号处理程序,请使用' Signal() '函数,如下所示;
int main()
{
signal (SIGALRM, sig_handler);
警报(2);
而(1);
}
代码将等待收到信号编号14 SIGALRM,并且一旦收到该信号,信号编号和代码流将被传输到函数“sig_handler()”,函数“sig_handler()”中写入的语句也将被执行。
为这个项目编写的代码只是切换发光二极管使用警报()函数和Sigalrm信号的信号处理程序逐一。
***注意,在这个项目中,最新版本的库“bcm2835”与旧版本的Raspberrypi板一起使用。它是不可能访问的密码13的旧板与最新的库版本,因此密码24是用来眨眼的3RD.引领。电路图也相应地绘制。那些拥有最新版本的董事会的人可以使用PIN 13没有任何问题。
要查找有关RaspBerryPI板的“修订”和其他重要详细信息,请使用以下命令;
猫/proc/cpuinfo
项目源代码
###
#包括 #包括 #包括 #包括 #define pin1 rpi_gpio_p1_11#定义PIN2 RPI_GPIO_P1_12#定义PIN3 RPI\U GPIO\U P1\U 24#定义PIN4 RPI\U GPIO\U P1\U 15#define pin5 rpi_gpio_p1_16#define pin6 rpi_gpio_p1_18#define pin7 rpi_gpio_p1_22#define pin8 rpi_gpio_p1_07void sig_handler(int signo);无效设置\u引脚\u输出(无效);Void set_all_pin_low (Void);int main(){if(!bcm2835_init())返回1;set_pins_output();set_all_pin_low();signal (SIGALRM, sig_handler);警报(2);而(1);bcm2835_close();返回0;}无效设置\u所有\u引脚\u低(无效){BCM2835_GPIO_WRITE(PIN1,低);bcm2835_gpio_写入(引脚2,低电平);BCM2835_GPIO_WRITE(PIN3,低);bcm2835_gpio_写入(引脚4,低电平);BCM2835_GPIO_WRITE(PIN5,低);bcm2835_gpio_写入(引脚6,低电平);BCM2835_GPIO_WRITE(PIN7,低);bcm2835_gpio_写入(引脚8,低电平);}void set_pins_output(void){bcm2835_gpio_fsel(引脚1,bcm2835_gpio_fsel_输出);bcm2835_gpio_fsel(PIN2,bcm2835_gpio_fsel_输出);BCM2835_GPIO_FSEL(PIN3,BCM2835_GPIO_FSEL_OUTP);BCM2835_GPIO_FSEL(PIN4,BCM2835_GPIO_FSEL_OUTP);bcm2835_gpio_fsel(PIN5,bcm2835_gpio_fsel_输出);bcm2835_gpio_fsel (PIN6 BCM2835_GPIO_FSEL_OUTP);BCM2835_GPIO_FSEL(PIN7,BCM2835_GPIO_FSEL_OUTP);bcm2835_gpio_fsel (PIN8 BCM2835_GPIO_FSEL_OUTP);}void sig_handler(int signo){静态int i = 0;set_all_pin_low();bcm2835_延迟(50);我+ +;开关(一){情况1:bcm2835_gpio_写入(引脚1,高电平);打破案例2:bcm2835_gpio_写入(引脚2,高电平);打破案例3:bcm2835_gpio_write (PIN3、高);打破案例4:bcm2835_gpio_write (PIN4、高);打破案例5:BCM2835_GPIO_WRITE(PIN5,高);打破案例6:bcm2835_gpio_write (PIN6、高);打破案例7:BCM2835_GPIO_WRITE(PIN7,高);打破案例8:BCM2835_GPIO_WRITE(PIN8,高);i=0;打破};警报(2);}###