当前位置:首页 > 单片机 > 单片机
[导读]在我的一个中断处理例程中有一下一段: 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

在我的一个中断处理例程中有一下一段:

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);


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

  引言   汽车的普及为人们的生活带来了方便,同时也给人们提出了一大难题——汽车防盗。本设计是为了解决以往汽车防盗产品的缺点和不足而开发的集成传感、报警和远程图

关键字: 数据采集 操作系统 s3c2410 汽车防盗系统

  引言   巡航控制系统(CCS)是20世纪60年代发展起来的,又称为恒速行驶系统。巡航控制系统工作时,ECU根据各种传感器输送来的信号判断汽车的运行状况,通过执行元件自动调节节气门的

关键字: ARM 三星 Linux ecu s3c2410 电子控制系统

  在过去一百年里(l906-2005),全球地表平均温度升高了0.74摄氏度,未来20年,每十年全球温度将会升高0.2摄氏度。气候变暖已成为不容忽视的、直接影响全球生产和生活问题。  

关键字: can总线 s3c2410

  在此设计的基于 GPRS 的远程安防监控系统,是采用的是摄像机传送视频信号经压缩编码后,通过内部总线传送到内置的 Web 服务器。用户在监控端可以直接通过浏览器观看 Web服务器上的摄像机视

关键字: GPRS s3c2410 安防监控

网上介绍LINUX下的一般驱动程序开发示例浩如烟海,或是因为简单,关于DMA驱动的介绍却寥寥无几;近期zhaoyang因工作需要,花了几日时间开发了某设备在S3C2410处理器Linux下DMA通信的驱动程序,有感于刚接...

关键字: Linux s3c2410 dma驱动

1引言目前 , 在嵌入式系统里基于ARM核的嵌入式处理器已经成为市场主流。随着ARM技术的广泛应用 , 建立面向ARM构架的嵌入式操作系统也就成为当前研究的热点。S3C2410是SAMSUNG公司基于ARM920T处理器...

关键字: s3c2410 移植 标准linux

一、S3C2410支持4种供电模式(1)NORMAL MODE耗电最大、可以通过关闭具体控制器的时钟来节电(2)SLOW MODE在此模式下可以没有内部PLL,耗电情况依赖于外部时钟的频率(3)IDLE MODEFCLK...

关键字: s3c2410 电源管理

snailszzy的s3c2410_gpio_setpin()与s3c2410_gpio_cfgpin()函数定义s3c2410_gpio_setpin()在gpio.c中作用:设置相应GPIO口的值,如pin=S3C2...

关键字: s3c2410 函数定义

通过数据手册的INTERRUPT SOURCES即可看出所有中断源,其中Descriptions列有讲述,带多个中断源的用括弧表述出来了。以下中断源寄存器通过各自MAST连接到INTPND(只能一个位置一)SRCPND(...

关键字: s3c2410 中断源数量

反反复复弄了一个多星期,参考了不少资料,终于让UCOS在自己的板子上跑起来了。期间遇到了不少问题,还好坚持下来,挺 了过去.....复习一下,记录下来,以当后用: 1.在ADS中建产工程,进入工程界面后,先建立两个组,一...

关键字: s3c2410 ucos 移植
关闭
关闭