FreeRTOS - STM32 移植 如何不关闭串口中断

在移植FreeRTOS到 STM32F103X的芯片上时,因为需要串口一直收发数据,但Free RTOS的很多API 均会进入临界状态,从而关闭相应中断达到目的。

于是,我有一个大胆的想法,我觉得我有能力修改一波Free RTOS的源码,让他不关闭中断就行了嘛?

结果是我too young too naive。。。

FreeRTOS - STM32 移植 如何不关闭串口中断_第1张图片

直接出了一大堆错误,这里我就不忍心贴出我的错误现场了。

好了,接下来,还是认真看一下背后的逻辑,以解决我的需求。

在task.h中找到了进入临界区的函数,是一个宏定义,看来这还不是它的真面目

FreeRTOS - STM32 移植 如何不关闭串口中断_第2张图片

继续查看 portENTER_CRITICAL() 的定义

FreeRTOS - STM32 移植 如何不关闭串口中断_第3张图片

还是一个宏定义,我们继续查看 vPortEnterCritical() 的内容,这次终于看到了它的真面目

FreeRTOS - STM32 移植 如何不关闭串口中断_第4张图片

函数实现的第一行就 又进入了一个函数,从函数名我们可以看出来,它应该就是关掉中断的最终凶手,我们终于找到它了

接下来看看,他是如何关掉我 可怜的 串口中断的

FreeRTOS - STM32 移植 如何不关闭串口中断_第5张图片

来到这里,它又变成了一个宏定义,我不得不说,它可真是 ”一处用宏一处爽,处处用宏处处爽啊" 

继续查看 vPortRaiseBASEPRI() 

FreeRTOS - STM32 移植 如何不关闭串口中断_第6张图片

这里是几行汇编代码,早就有大佬说过汇编它不是人看的,啊不是,我说它不是一般人看的。

这段汇编的大概意思就是,去操作BASEPRI寄存器以达到关闭中断的目的,BASEPRI就是用来操作中断的一个寄存器。平时在STM32的开发中,也是去操作它来开关中断的。

不过这个函数我们携带任何参数,难道它是吧所有的中断都关闭嘛,那也太不科学了,直接不配做一个操作系统啊。对啊,他肯定不是关掉所有的中断,前面就看它用宏用的很爽,这里也不例外,最后一行 它是通过  configMAX_SYSCALL_INTERRUPT_PRIORITY 这个宏的值决定关闭那些 中断的。这段代码就是,通过这个宏 比这个宏的值大的中断,在调用关闭临界值接口时就会被关闭,比这个值小的则不会,中断照常运行。

所以最后设定好这个宏的值,就能解决我们的需求了。

但是还有一个题外话,如果我想关闭 1 和 6的这两个中断,其他的不想关闭,能实现嘛?

貌似在这里并不可以,如果有人找到了实现的方法,可以 吱一声 告诉我,并向你说一句 “大佬,牛逼 ”。

好了,问题找到解决办法,我要继续写代码了。

FreeRTOS - STM32 移植 如何不关闭串口中断_第7张图片

你可能感兴趣的:(ARM,FreeRTOS,嵌入式开发,stm32,单片机,arm)