问:我得到一个错误:“function * appears in multiple call graphs: rooted at *”,这是什么意思?
答:它意味着有一个函数既在中断里调用了又在主函数中调用了,而编译器是不支持重入的。因为函数是不能重入的,所以它基于在两个地方同时调用的可能性而报这个错误。有几种办法可以绕开这个问题:
1. 如果ROM空间允许的话,可以把这个函数复制一份并另取一个不一样的名称。一个给中断调用,另一个给主函数调用。
2. 重写这个函数,让它不带参数并且没有局部变量。如果函数没有参数和局部变量,那么它将可以被中断和主函数同时调用。
3. 如果你能够保证这个函数一定不会同时被调用,那么你可以使用#pragma interrupt_level 伪指令。这个指令在使用说明书里已经详细说明了,这里简单介绍如下:
#pragma interrupt_level 1
void common_func(void)
{
/* local variable definitions */
/* code */
}
#pragma interrupt_level 1
void interrupt isr(void)
{
common_func();
/* more code */
}
void main(void)
{
common_func(); /* 在中断使能之前被调用 */
EI(); /* 使能中断 */
/* more code */
全部0条评论
快来发表一下你的评论吧 !