中断服务程序--嵌入式系统

中断嵌入

https://blog.csdn.net/yusiguyuan/article/details/23701519

 

http://blog.csdn.net/sdudubing/article/details/6643859

下面的代码使用了__interrupt关键字取定义一个中断服务子程序(ISR),请评论下这段代码的问题。

__interrupt    double compute_area(double radius)

{

    double area = PI * radius * radius;

    printf("Area = %f",area);

    return area;

}

 

 

中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断。许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标识中断服务程序(ISR),类似于_interrupt、#program interrupt等。当一个函数被定义为ISR的时候,编译器会自动为该函数增加中断服务程序所需要的中断现场入栈和出栈代码。

   中断服务程序需要满足如下要求:

  (1)不能返回值;

  (2)不能向ISR传递参数;

  (3)ISR应该尽可能的短小精悍;

  (4)printf(char *lpFormatString,..)函数会带来重入和性能问题,不能在ISR中采用。

    在某项目的开发中,我们设计了一个队列,在中断服务程序中,只是将中断类型添加入该队列中,在主程序的死循环中不断扫描队列是否有中断,有则取出队列中的第一个中断类型,进行相应处理。

 

/* 存放中断的队列 */
typedef struct tagIntQueue
{
 int intType; /* 中断类型 */
 struct tagIntQueue *next;
}IntQueue;
 
IntQueue lpIntQueueHead;
 
__interrupt ISRexample () 
{

 int intType;
 intType = GetSystemType();
 QueueAddTail(lpIntQueueHead, intType);/* 在队列尾加入新的中断 */
}

While(1)
{
 If( !IsIntQueueEmpty() )
 {
  intType = GetFirstInt();
  switch(intType) /* 是不是很象WIN32程序的消息解析函数? */
  {
   /* 对,我们的中断类型解析很类似于消息驱动 */
   case xxx: /* 我们称其为"中断驱动"吧? */
    …
    break;
   case xxx:
    …
    break;
   …
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值