嵌入式操作系统内核原理和开发(中断)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

    在我个人看来,中断是cpu最重要的特色。从某种意义上来说,没有中断就没有嵌入式操作系统。一旦你明白了中断的真正含义,你对操作系统的了解就算真正入门了。什么是中断呢?我们可以看看单片机下面是怎么做的。

#include <REG51.h>

sbit LED = P1 ^ 6;
unsigned int led_enable = 0;

void Delay(unsigned int a)
{
    unsigned int i;

	while(a)
	{
	    a --;
		for(i = 0; i < 1200; i++);
	}
}

void led_switch(void) interrupt 0 using 1
{
    if(0 == led_enable)
    {
        led_enable = 1;
    }
    else
    {
        led_enable = 0;
    }

    EX0 = 1;
}

void main(void)
{
    EA = 1;
    EX0 = 1;

    while(1){
        if(led_enable)
        {
	        LED = 0;
	        Delay(100);
	        LED = 1;
	        Delay(100);
        }
    }
}

    上面的代码是一段真实的51单片机代码。它完成的功能很简单,就是对led灯进行点亮处理。怎么解释呢?在单片机上电后,我们发现一开始led二极管没有发生闪烁。在我们单击按键之后,led开始出现间隙性闪烁的现象,之后再一次单击按键,又可以发现led的闪烁现象消失了。为什么会出现这种现象?主要是因为我们单击按键的时候,在单片机的引脚处产生了中断。查看到中断的单片机此时就会跳转到中断向量表里面查找中断处理函数。这里的按键中断处理函数就是led_switch。处理完led_switch之后,单片机又会回到原来的main函数继续执行,所以整个中断的过程就像没有发生过一样。因为在led_switch中我们对led_enable进行了处理,所以就出现了我们在前面说过的各种现象。


                                                                   
 
    说到这,也许有的朋友会说,cpu的这种中断属性怎么才能在pc上面仿真出来呢?其实很简单。linux系统本身就有一个优秀的特性,那就是信号。只要我们设定相应的信号和处理函数,那么linux系统就会在系统调度返回之前调用相应的信号函数来处理。整个信号处理的过程和中断是一模一样的。因为在处理中断的时候,我们需要对cpu的现场进行保存和恢复处理,而信号的处理也是一样。在信号处理前,系统肯定是处于内核态,那么linux系统肯定已经为我们做好了现场的保护工作,处理完信号之后,系统本身又会恢复到原来的用户态,继续执行下面的代码。所以linux自身也会默认对原来的场景进行恢复处理,就好象中断返回一样。

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>

static int count = 0;
static struct itimerval oldtv;

void set_timer()
{
	struct itimerval itv;
	itv.it_interval.tv_sec = 1;
	itv.it_interval.tv_usec = 0;
	itv.it_value.tv_sec = 1;
	itv.it_value.tv_usec = 0;
	setitimer(ITIMER_REAL, &itv, &oldtv);
}

void signal_handler(int m)
{
	count ++;
	printf("%d\n", count);
}

int main()
{
	signal(SIGALRM, signal_handler);
	set_timer();
	while(count < 10000);
	exit(0);
	return 1;
}
    大家可以把这样一段代码在Linux编译一下,然后使用gdb调试即可。查看整个signal_handler在被断点断住的时候,本身线程是不是只有一个?函数堆栈是不是在一个线程里面。如果不出意外,整个信号的处理过程应该是这样的,

(gdb) bt
#0 signal_handler(m=14) at code.c: 23
#1 <signal handler caller>
#2 main() at code.c:32
    到了这里,相应大家应该还有一个疑问,既然可以利用linux的signal对cpu的中断进行仿真,那么能不能利用windows的signal对中断进行仿真呢。因为Windows下面的没有SIGALRM这个信号,所以我们可以重新编写一段代码,然后利用visual studio 6.0进行编译,看看对应的情况。

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <tchar.h>
#include <Windows.h>

void SignalHandler(int signal)
{
    printf("Application over..\n");
}

int main()
{
    typedef void (*SignalHandlerPointer)(int);

    SignalHandlerPointer previousHandler;
    previousHandler = signal(SIGINT, SignalHandler);
    while(1)
    {
	Sleep(0);
    }
    
    exit(1);
}

   下面,我们首先编译这一段代码。接着在程序run之后,我们可以在SignalHandler之处设置一个断点。一切就绪完毕,再按下ctrl+c之后,系统就会在SignalHandler之处断住。此时单击【Debug】-> 【Threads】,就可以看到这个情况。


                              

   相信看到这里,大家应该看明白了。其实在Windows下面,信号是专门有一个线程来完成的,和原来的main函数不是同一个线程。既然线程都不是一样的,而中断本身是必须在一个thread中完成的。我们怎么能利用windows来仿真cpu的中断处理流程呢。


  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: 嵌入式Linux操作系统原理与应用(第三版)是一本全面介绍嵌入式Linux操作系统的参考书籍。本书主要包括嵌入式系统概述、Linux内核概述、Linux系统启动、系统调试、应用程序开发等方面的内容。 本书首先介绍了嵌入式系统的概念,包括嵌入式系统的分类、结构和特点。然后就Linux内核进行了全面的讲解,包括内核编译、模块的使用、驱动程序的编写等方面。接着讲解了Linux系统启动的流程,包括BIOS、U-boot、内核启动过程等,深入探讨了系统中各个组成部分的作用和相互之间的关系。 在系统调试方面,书中涵盖了日志系统的使用、内存管理、调试工具的使用等方面的内容,帮助开发者提高代码质量。最后,本书详细介绍了嵌入式Linux应用程序的开发,包括Qt应用程序开发、网络编程、多线程、定时器和中断等方面的内容。 总体来说,《嵌入式Linux操作系统原理与应用(第三版)》是一本非常全面、系统的介绍嵌入式Linux操作系统的参考书籍,对开发者来说有较高的参考价值。 ### 回答2: 嵌入式linux操作系统是一种经过裁剪和优化的操作系统,它具有稳定、可靠、安全、高效、易于移植等特点。嵌入式linux操作系统主要应用于各种嵌入式系统中,例如手机、路由器、工控设备等。该操作系统可以根据不同的应用场景进行定制,满足不同的需求。 嵌入式linux操作系统的核心是内核,它是操作系统中最基本、最核心的部分。内核负责管理系统资源、调配各种任务、驱动硬件设备等。嵌入式linux操作系统还包括启动引导程序、文件系统、各种库和应用程序等。启动引导程序是系统启动的第一步,它负责加载内核和其他文件。文件系统负责管理和组织存储在磁盘或其他存储设备上的文件。库和应用程序是系统提供的各种工具和接口,用于开发和运行应用程序。 嵌入式linux操作系统的应用非常广泛。在工业自动化领域,该操作系统被广泛应用于各种自动化设备中,例如工业机器人、数控机床等。在智能家居领域,嵌入式linux操作系统被应用于智能家居设备中,例如智能门锁、智能灯泡等。在移动互联网领域,嵌入式linux操作系统被应用于各种智能手机、平板电脑等移动设备中。 总之,嵌入式linux操作系统是一种非常重要的操作系统,它具有广泛的应用前景和市场需求。对于开发人员而言,掌握嵌入式linux操作系统的原理和应用技术,将带来更多的机会和挑战。 ### 回答3: 嵌入式linux操作系统原理与应用(第三版)是一本介绍嵌入式linux操作系统的重要理论和实践方法的书籍。嵌入式linux操作系统是运行在各类嵌入式设备(如智能手机、电视机顶盒、路由器等)中的小型化的操作系统,其实现原理和一般的linux操作系统有所不同。 该书第一部分介绍了嵌入式linux操作系统的基础知识,包括嵌入式系统的体系结构、linux命令行的使用、嵌入式开发工具的选取与使用等。第二部分则介绍了嵌入式linux操作系统的内核原理、进程管理、内存管理等方面的内容。其中,最重要的是对内核源代码的进行深入分析,通过讲解内核源代码的各个部分来帮助读者建立更全面的嵌入式linux操作系统的工作机制的认识。 第三部分则介绍了嵌入式linux操作系统在实际应用中的开发过程,包括在嵌入式系统中的裸机开发和在操作系统上进行应用开发等方面的知识。书中提供了大量的示例代码和实验项目,以实际的案例来帮助读者理解嵌入式linux操作系统的实现方法和技术。 总之,嵌入式linux操作系统原理与应用(第三版)是一本结合理论和实践的丰富介绍嵌入式linux操作系统的书籍,不仅适合嵌入式开发工程师和研究人员使用,也适合希望学习嵌入式linux操作系统原理和应用的计算机科学和工程领域的学生和爱好者学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值