在我的一个中止处理例程中有一下一段:
save_flags(flags);
cli();
set_gpio_mode_user(k->gpio_port, GPIO_MODE_IN);
up = read_gpio_bit(k->gpio_port);
set_external_irq(k->irq_no, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);
restore_flags(flags);
我有若干问题问各位大虾:
1.关于save_flags和restore_flags的源代码的阅览,能够知道他们的效果是保存和复原现场。可是详细在什么时分应该保存,什么时分复原现场。
2.关于cli(),他是作为关中止而起效果的,可是在后边为什么会没有sti()进行开中止。
3.在这里,set_external_irq(tmp->buttons_int_irq, EXT_BOTH_EDGES, GPIO_PULLUP_DIS);莫非能够起到开中止的效果,由于前面有cli的操作。
说说我的观点:
运用save_flags()等的原因是:假如在这个函数之前现已制止了中止,那么就会呈现必定的风险,由于在今后调用开中止的时分,它会无条件地激活中止,所以需求一种机制把中止康复到曾经的状况而不是简略地制止或激活.
后边之所以没有sti()是由于后边调用了restore_flags(),就康复到了曾经的状况了!
S3C2410中的cpsr的低八位能够完成中止的敞开和封闭的效果.
原先一次save_flags()实际上是保存了本来的CPSR的数值
然后cli关中止
最终的restore_flags()便是开中止,由于咱们保存了原先的flags.
类UNIX体系一向选用cli和sti函数来禁用和启用中止。而在现代的Linux体系中却不鼓舞直接运用它们。
假如有必要禁用中止,那么最好运用下列调用:
unsigned long flags;
save_flags(flags);
cli();
/*下面的代码在中止被禁用的情况下运转*/
restore_flags(flags);
其间save_flags是一个宏,用于保存标志的参数flags被直接传入,不带&操作符。
别的中止处理的次序一般是:
1. 保存现场
2. 关中止
3. 履行中止处理Makefile文件:
4. 开中止并康复现场
最近在写linux驱动.遇到这么一个问题:
: 有这么一个函数 __raw_readl. 我查了他的原型是:
: #define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int
: __force *)(a))
: 而__chk_io_ptr(x)的原型是
: #ifdef __CHECKER__
: extern void __chk_io_ptr(void __iomem *);
: #else
: # define __chk_io_ptr(x) (void)0
: #endif
: __raw_readl(23)打开今后便是((void)0,*(volatile unsigned int _force *)(23)).
: 请问上面的打开式式什么意思???我所不理解的是(xx, xxxxxx)这样的语法是什么意思?
只要后边这个表达式是有用表达式
上面同等,*(volatile unsigned int _force *)(23);