快捷搜索:  

如何调用中断函数,中断过程与调用一般函数过程有何区别?

广告

无语了,因为加了调试代码导致调试失败,搞了两天stm32的svc中断处理,因为flash的容量限制,所以没使用RTOS,直接hal库写的,然后需要使用svc来进行函数绑定,结果折腾了两天。找到问题之后其实就很清晰了,svc处理需要吧栈信息取出来,当作参数传递给下一级处理函数,下级函数调用用汇编写的,stm的参数是使用寄存器来传递的。

1、实现中断功能需要在main中调用中断函数吗

Warning15向我们表明了linker发现了一个函数,这个函数不仅在maincode里被调用了,而且在ISR(或者被ISR调用的函数中)被调用了。或者是被同时被多个ISR同时调用了。这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函数已经在执行时它可能被另一个ISR所调用。这样就会导致结果是可变的而且很可能会导致一些参数的错误。

如果函数是由中断所调用的,则此函数的内存就会被使用。这会引起其它函数的内存错误。举例来说,对于你的第一个警告,WRITE_GMVLX1_REG是会被多个root所调用。其被定义在D_GMVLX1.C或者D_GMVLX1.A51中。他不仅会被ISR(或者被ISR调用的函数)而且也会被MAIN.C中的VSYNC_INTERRUPT函数所调用。

2、可以在子函数中调用中断函数吗?

可以利用软中断函数,软中断函数可以由硬件中断启动像你文中提到的方式,如果中断函数设置标志,而主程序没有来得及处理,可能会造成有数据丢失未处理标志被覆盖的情况。在多任务系统中,所谓消息驱动,就包括硬件中断将待处理的消息放入消息队列,然后等待主程序取队列中的消息逐一处理的。应该是可以的吧,将单片机A的timer0和timer1都初始化好,方波发生器用timer0,初始化时处于关闭状态;

串口用中断模式,在中断处理中,判断如果收到的字符为a,则开启timer0。关键是看单片机B检测高电平你是用什么方法处理了,比如将送出的方波信号接外部中断INT0,反向后接INT1,外部中断沿触发。在B中INT1的中服用来开启定时器,INT0的中服用来关闭定时器并检查是否在a~b之间,如果是开始闪烁LED的处理,如果不是清零定时器等待下一个高电平。

您可能还会对下面的文章感兴趣: