嵌入式关键知识点

中断服务程序ISR特点:1.不能有返回值,必须用void  2.不能传递参数,必须用void  3.多用来处理短而高效的任务  4.ISR内部不可调用不可重入函数。

正确ISR例子:

void timer0_int(void) interrupt 1 using 1

 unsigned char temp1 ;  
 unsigned char temp2 ;  

}

错误ISR例子:

_interrupt double compute_area (double radius)
{
 double area = PI * radius * radius; //浮点运算耗时间
 printf(” Area = %f”, area); //调用了不可重入函数
 return area; //有返回值
}

不可重入函数:该函数不可以在还没有返回时再次被调用,也可以理解为不可以被中断的函数,从而不能运行在多任务的环境下,可能会造成死锁。如常见的printf,malloc,free等函数,因为这些函数通常引用了全局变量。printf(stdout全局变量)、malloc(全局内存分配表)、free(全局内存分配表)。

编写可重入函数方法:在函数体内不访问全局变量,不使用静态局部变量,只使用局部变量,若必须访问全局变量,使用互斥信号量保护全局变量

死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程

产生死锁的四个必要条件:1.互斥条件  2.不可抢占条件  3.占有且申请条件  4.循环等待条件

保护多线程共享全局变量:1.关中断  2.给互斥量(原子锁)上锁

发布了11 篇原创文章 · 获赞 13 · 访问量 1665

猜你喜欢

转载自blog.csdn.net/Psyduck_ing/article/details/79406591