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

24 篇文章 1 订阅
2 篇文章 0 订阅

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

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

结果是我too young too naive。。。

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

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

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

继续查看 portENTER_CRITICAL() 的定义

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

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

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

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

继续查看 vPortRaiseBASEPRI() 

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

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

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

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

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

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

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有意思科技

给与不给,我都会更新

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值