ISR之不能作什么

为了本身学习之用,转来一遍文章函数

https://blog.csdn.net/zhangchiytu/article/details/45131915性能

中断是嵌入式系统中重要的组成部分,这致使了不少编译开发商提供一种扩展—让标准C支持中断。具表明事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码。学习


__interrupt double compute_area (double radius) 
{
    double area = PI * radius * radius;
    printf("\nArea = %f", area);
    return area;
}
 操作系统

这个函数有太多的错误了,以致让人不知从何提及了:
1)ISR 不能返回一个值。若是你不懂这个,那么你不会被雇用的。
2) ISR 不能传递参数。若是你没有看到这一点,你被雇用的机会等同第一项。
3) 在许多的处理器/编译器中,浮点通常都是不可重入的。有些处理器/编译器须要让额处的寄存器入栈,有些处理器/编译器就是不容许在ISR中作浮点运算。此外,ISR应该是短而有效率的,在ISR中作浮点运算是不明智的。
4) 与第三点一脉相承,printf()常常有重入和性能上的问题。若是你丢掉了第三和第四点,我不会太为难你的。不用说,若是你能获得后两点,那么你的被雇用前景愈来愈光明了。.net


中断是嵌入式系统中重要组成部分,不少编译器开发商都让标准c支持中断,并引入关键字_interrupt.可是:
一、ISR不能有返回值;
二、ISR不能传递参数;
三、ISR应该是短而高效的,在ISR中作浮点运算是不明智的;
四、ISR中不该该有重入和性能上的问题,所以不该该使用pintf()函数。对象

1.ISR 不能有返回值。为何?
2.ISR 不能传递参数。为何? blog

裸奔的系统:硬件中断响应程序的运行插入时机是随机的,程序中不存在这样的调用语句:“value=interrupter( )”, 因此,即便有返回值也不知返回给谁。  同理,若是中断函数有形参,但因没有调用者,也就没有实参对形参赋值。因此,不可能有参数传递。开发

裸奔系统中,中断程序由硬件触发执行。这意味着中断函数没有具体的调用者,因此,中断函数没法将值返回给任何对象编译器


    
  非裸奔系统:操做系统须要进行各类调度安排,因此接管了中断的入、出口;另外,还增长了许多软件中断。这些中断函数的运行插入时机已经再也不是随机了。一个中断申请发生后,其运行时机取决于操做系统的肯定安排和调用。也就是说,有了调用者,因此能够有返回值和参数传递。编译

相关文章
相关标签/搜索