• 前言

学软件的重点就是多看资料。我们遇到的问题99.99%网上都有人遇到过,如果你没找到答案,只可能是你搜索方式不对。

我们想解决的问题,或者我们想做的事,90%在网上已经有现成的答案了。

这是多么遗憾的事,我们想尽情发挥我们的创造力来大干一场,然后在一次偶然中发现已经有人实现了,而且成果还吊打我们。

经历多了之后,就要开始明白,站在巨人的肩膀上重要性。

对于这些已经被前人解决的问题,我们就开始放手,收起好奇心,用库去解决它,把我们的精力放在最重要的专业方向上,放在算法上,放在数学上。

正文

实现之前,先准备参考资料:

野火的FreeRtos消息队列实现教程

正点原子的FreeRtos消息队列实现教程

安富莱的FreeRtos消息队列实现教程

硬件平台:GD32F407 ,

软件平台:已经移植好的FreeRtos模板工程。

写代码并没有花费太多的时间,大量的时间花在了代码的设计框架上,终于有了一个好的构思。

先分享一下心路历程。

  1. 一开始,我在驱动和应用如何分层这个问题上花费了大量时间,依然是差临门一脚,只悟得了,

    驱动层只需要关心硬件的初始化以及相关驱动函数,给上层提供api接口就可以了,驱动层不应该包含任何应用代码,给应用层最大的发挥空间。

    应用层则应该使用底层提供的api函数来实现相应功能,在应用层应该不包含任何硬件依赖。

    但是我深陷复用的坑,我不仅考虑当前工程里的驱动如何应用到其他工程中,当前工程的应用又有哪些可以复用为中间库,如何让大部分的代码都可以任意移植,以此来满足我懒惰的心。

    于是,当我把所有的东西都复用起来,

    驱动层有Hal库的我已经无需做库,没有Hal库的,所有的寄存器都要考虑,因为你既然想要做一个Hal库,你当然应该支持硬件的所有配置方式,因此,这驱动层复用完全不现实(我又不是)。

    应用层方面,又想着适应所有的rtos,又想着支持各种不同的硬件,好的拓展性,等等。

    总之,差点给自己想疯了。

  2. 后面由于项目原因,我需要把uart的接收数据通过消息队列传给对应的任务,因此,我做了一个流程图来捋清自己的逻辑,

    在作图的时候,

    一边思考如何把应用和驱动的分层,

    一边思考linux的应用和驱动分层彻底到是两个进程,

    一边思考任务与中断程序之间通过消息队列通信。

于是,在灵感来了,我仿造linux的驱动应用分层,在rtos中把驱动与应用分为两个任务,我又参考消息队列中的任务间通信,

把硬件的中断函数看成是一个任务,然后再把硬件中断获得的数据通过回调函数传给应用层。如此,就完成了所有的步骤,

把数据传回给应用层,

把(收到数据)消息传回给应用层,

驱动与应用层并不会互相打断各自的流程。

最终的流程图结果为(该图就很明显的看出来,任务与中断的相似之处):

 

如此一来,这次彻底做到了驱动与应用的分层,代码实现了,如果这套程序需要换平台,那么只需要freertos接口文件更改,底层驱动更改,应用层无需任何改动。

而这也确实是我想了很久打算做的东西,仔细分析,这套程序其实代码上可以复用的东西确实不多,驱动层没有任何复用的可能性,应用层高度依赖不好拆分,但是千里之行始于足下,来日方长。

总结


这次实现的功能是契合FreeRtos的串口处理程序,举一反三,所有的硬件驱动处理,在所有的rtos上,都是类似的,从现在起,我的应用驱动分层才算是真正的登堂入室,rtos之路才算是正式开始。

撒花,庆祝!!!

posted on 2023-10-25 15:30  __诗酒趁年华  阅读(54)  评论(0编辑  收藏  举报