红联Linux门户
Linux帮助

Linux/Unix中使用错误保留符需注意的事项

发布时间:2007-07-05 16:07:48来源:红联作者:Cleanmeter
在 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;
}
文章评论

共有 0 条评论