在Linux/Unix中使用错误保留符需注意的事项(2006-02-17)

来源:互联网 发布:山本宽 anime知乎 编辑:程序博客网 时间:2024/05/16 14:48

 

         在 linux/unix中写程序常常使用errno.h库中的各种错误保留符号以表示程序是否出现问题

   但是,习惯上,经常取负号, 这一点要小心.  如下代码是linux的mmc驱动的代码片段,目的是为mmc

   设备请求DMA通道.

       int  omap_request_dma(dma_device_t device, const char *device_id,  dma_callback_t callback, void  data, dma_regs_t ** dma_regs)
{
 omap_dma_t *dma = NULL;
 dma_regs_t *regs;
 int i, err, status;

 *dma_regs = NULL;

 err = 0;
 spin_lock(&dma_list_lock);
 for (i = 0; i < MAX_OMAP_DMA_CHANNELS; i++) {
  if (dma_chan[i].in_use) {
   if ((dma_chan[i].device == device) && (device != eDMANotSync)) {
    err = -EBUSY;  //出现问题, 表示设备忙, 这时候 err = -16
    break;
   }
  } else if (!dma) { //正常情况下,为dma分配一个数组单元,dma_chan[]中的每个元素代表了一个DMA通道
   dma = &dma_chan[i];
  }
 }
 if (!err) // 不要认为, !err当 err = -16的时候可运行(注意cpu对负数的表示方式),实际上应该是当err              0的 时候运行, 也就是当是成功获得一个dma通道时候,才运行这个if语句!
  if (dma)
   dma->device = device;
  else
   err = -ENOSR;
 }
 spin_unlock(&dma_list_lock);
 if (err)
  return err;
 i = dma - dma_chan;
 regs = &dma_base[i];

 err = request_irq(dma->irq, dma_irq_handler, SA_SHIRQ, device_id, regs);

 if (err) { //分析了request_irq()的实现代码的时候, 出现问题的时候返回的err为-12或-22,而这里的if语句就是用来处理问题的代码,而判断标准为err,就是为负的时候if()为真!

  printk(KERN_ERR
         "%s: unable to request IRQ %d for DMA channel/n",
         device_id, dma->irq);
  return err;

 DPRINTK("requested dma device %x/n", device);
 return 0;
}

  

 

 

   

 

 

 

            

原创粉丝点击