首页 > 用户投稿

单片机编程入门基础知识 中断函数注意点?

中断函数注意点?

1.中断处理函数的返回值和形式参数

中断处理函数不能有返回值和形式参数,因为中断处理函数是由硬件(或触发器)调用的,没有程序向其传递参数,也没有程序接收其返回值,其参数通过全局变量传递。

但是,请注意,如果要检测的其他函数的全局变量值在中断服务函数中发生更改,则volatile关键字将用于定义全局变量。因为主程序可能会将变量读入寄存器,然后每次只使用寄存器中的变量副本。如果此时不使用volatile关键字,则在中断服务函数中修改变量的操作将被短路。

2.浮点运算是在中断处理函数中执行的

单片机编程入门基础知识 中断函数注意点?

由于浮点运算通常是由特殊的硬件执行的,因此硬件设备会涉及类似全局变量的内容(如硬件端口或存储在硬件设备中的数据)。如果浮点运算过程中断,其他函数也可能使用浮点运算,这将破坏设备中当前的硬件数据。可以理解,浮点运算通常是不可重入的,因此浮点运算不能用于中断服务函数。

在满足精度要求的前提下,浮点运算可以多次扩展为整数运算。

3.在中断处理函数中使用printf函数

这个原理类似于在上面的中断服务函数中使用浮点数,因为printf函数使用硬件资源,并且这些资源应该是互斥的(在多线程和多处理中),这使得printf函数不可重入且不能被重入用于中断。

此外,malloc和free等函数使用全局内存分配表,因此它们也是不可重入的,不能在中断中使用。

请注意,许多标准库函数是不可重入的,在中断服务函数中应谨慎使用。

中断服务功能应简短有效。

为什么主函数和中断函数不能调用同一函数?

这涉及picc编译时临时变量的空间分配算法。

一般来说,为了便于处理,中断中使用的临时变量的空间分配独立于其他地方使用的临时变量。这可以通过查看已编译程序集列表中的中断处理程序集代码看到。如果中断函数与其他函数同时调用函数,则会发生错误,除非函数不需要在内部分配临时变量。我认为对于大多数应用程序,我们可以使用其他方法来解决同时调用函数的问题,这最多会浪费一点代码空间。

单片机,外部中断程序,为什么不用写在主程序中?为什么中断函数不在主函数也可以运行?

以51单片机为例说明亚帆的观点:

中断是指中断正在进行的任务以执行更紧急的任务。显然,至少需要两套程序,一套主程序和一套中断程序。

写在主程序中只能一步一步地执行,不能达到高优先级的目的。所以这是行不通的。

0x0000地址是硬件重置后执行程序的条目。0x0003是外部中断项,以此类推。

复位后,将从0x0000自动执行,当外部中断到来时,将从0x0003自动执行。当函数写入中断0时,该函数将根据中断号自动放置在相应的条目上。中断编号0是将此函数放入0x0003(实际上是一条跳转指令)。

如果主程序中未打开中断和启用中断,则0x0003是正常的程序存储空间。

详见下图:

如图所示,中断仅表示两组程序(蓝色和红色)。

单片机编程入门基础知识什么是中断服务函数中断函数如何调用

原文标题:单片机编程入门基础知识 中断函数注意点?,如若转载,请注明出处:https://www.saibowen.com/tougao/21725.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「赛伯温」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。