isr不能用printf
2011-08-20 15:13
183 查看
ISR:中断服务程序 中断服务程序(Interrupt Service Routines,ISR)
ISR:当前中断服务寄存器(In Service Register)
该寄存器用于存放正在被服务的所有中断级,包括尚未服务完而中途被别的中断打断了的中断级。
ISR:中断服务程序 (interrupt service routine)
所谓中断是指当CPU正在处理某件事情的时候,外部发生的某一事件(如一个电平的变化,一个脉冲沿的发生或定时器计数溢出等)请求CPU迅速去处理,于是CPU暂时中止当前的工作,转去处理所发生的事件。中断服务处理完该事件以后,再回到原来被中止的地方继续原来的工作。
中断是一种硬件机制,用于通知CPU有个异步事件发生了。中断一旦被系统识别,CPU则保存部分(或全部)现场(context),即部分(或全部)寄存器的值,跳转到专门的子程序,称为中断服务程序(ISR)。中断服务程序做事件处理,处理完成后执行任务调度,程序回到就绪态优先级最高的任务开始运行(对于可剥夺型内核)。中断是嵌入式系统中重要的组成部分,这导致了很多编译开发商提供一种扩展—让标准C支持中断。具代表事实是,产生了一个新的关键字 __interrupt。下面的代码就使用了__interrupt关键字去定义了一个中断服务子程序(ISR),请评论一下这段代码的。
__interrupt double compute_area (double radius)
{
double area = PI * radius * radius;
printf("\nArea = %f", area);
return area;
}
1)ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。
2) ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。
3) 在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额处的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。
4) 与第三点一脉相承,printf()经常有重入和性能上的问题。
printf()经常有重入解释
不可重入函数不可以在它还没有返回就再次被调用。例如printf,malloc,free等都是不可重入函数。因为中断可能在任何时候发生,例如在printf执行过程中,因此不能在中断处理函数里调用printf,否则printf将会被重入。
函数不可重入大多数是因为在函数中引用了全局变量。例如,printf会引用全局变量stdout,malloc,free会引用全局的内存分配表。
个人理解:如果中断发生的时候,当运行到printf的时候,假设发生了中断嵌套,而此时stdout资源被占用,所以第二个中断printf等待第一个中断的stdout资源释放,第一个中断等待第二个中断返回,造成了死锁,不知这样理解对不对。
不可重入函数指的是该函数在被调用还没有结束以前,再次被调用可能会产生错误。可重入函数不存在这样的问题。 不可重入函数在实现时候通常使用了全局的资源,在多线程的环境下,如果没有很好的处理数据保护和互斥访问,就会发生错误。 常见的不可重入函数有: printf --------引用全局变量stdout malloc --------全局内存分配表 free --------全局内存分配表 在unix里面通常都有加上_r后缀的同名可重入函数版本。如果实在没有,不妨在可预见的发生错误的地方尝试加上保护锁同步机制等等。 |
相关文章推荐
- 小技巧解决printf不能以二进制方式打印输出的问题
- printf与wprintf不能同时混合使用的原因
- Eclipse对printf()不能输出到控制台的快速解决方法
- STM32 学习过程中 printf 函数 突然不能执行的简单提示问题
- 内核创建的用户进程printf不能输出一问的研究
- 为什么printf不能用%lf输出double型,而用%f?
- [调试][程序打印]当printf不能用时,使用C++的不定参数来搞定OutputDebugString打印
- windows在ISR中不能睡眠的原因
- C/C++【初级】printf不能直接输出string类型
- 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数
- 请把从1到1000的数打印出来,但你不能使用任何的循环语句或是条件语句。更不能写1000个printf
- 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列。
- 内核创建的用户进程printf不能输出一问的研究
- 为什么ISR内部不可以用printf和malloc函数
- Eclipse对printf()不能输出到控制台的解决方法
- error:用printf或者是cout输出指针时,不能输出指针所指的内容!
- 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列。
- ISR之不能做什么
- 今天才发现printf不能直接输出string类型
- ISR之不能做什么