中断函数注意点?
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
免责声明:此资讯系转载自合作媒体或互联网其它网站,「赛伯温」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。