FreeRtos进行任务调度,能让复杂的代码变得简洁
例如上面代码,两个任务单独运行的时候都很简单,但是单需要结合在一起共同执行的时候,代码会如下图一样复杂
而如果使用FreeRtos进行解耦的话,就可以将上面复杂代码变为两个同时进行的任务:
利用cubemax学习freertos不用配置freertos环境因为cubemax提供了专门的地方:
在cubemax中,不仅移植了cubemax还移植了cmsis os,提供了各种同样接口,更加便于我们学校FreeRtos,并且如果学会了cmsis os就能无缝衔接其他rtos系统,例如RTX\Zephyr\国产的RT-Thread等等,日后见到os开头的函数都是CMSIS OS提供的

接下来进行文件的创建:
当进行代码生成时会出现下面警告:
这是因为FreeRtos会以Systick中断作为时钟基准,因此会将Systick的中断优先级设置锝比较低,甚至有时候会关闭中断,这可能会导致HAL库的定时器发生错乱,但是本次我们是初识所以写暂时不理会
解决方法也很简单:
接下来就可以愉快的生成代码了,我们将代码在Clion打开后需要切一下预设

打开main.c代码,我们发现main函数中多了几个函数相比于之前的代码,并且他们都是OS开头
oskernelInitialize():系统内核初始化
defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);其中的osThreadNew就是为我们创建一个新的FreeRtos任务,我们主要学的就是这个
osKernelStart();启动系统内核
打开osThreadNew函数中的第一个参数StartDefaultTask,我们的任务代码就是需要写在这个函数中写在这个无限循环中相当于while
接下来我们试一下在任务函数里实现小灯电平反转功能(需要注意的是此时的延时函数要用os提供的延时函数了):
仔细看上图中的StartDefaultTask函数的参数为void *argument,让我们回到defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);点击进入os ThreadNew,我们可以看到os ThreadNew函数的第二个参数也是argument,其实这个第二个参数就是用来让我们给任务函数传递数据用的,不过我们此次不需要给任务函数传递数据,实际上大部分时候都不需要。osThreadNew的第三个参数&defaultTask_attributes是关于任务函数的一些设置

接下来我们不妨将小灯闪烁的代码下载到单片机看看效果,下载前还需要配置调试器,我用的是stlink步骤如下
还要配置OpenOCD,下面这个图片的OPENOCD是一开始就需要配置的:
下面图片是配置当前项目的OPENOCD需要配置的:
如果调试器不是JLink/STM32f1系列需要自己修改一下:
调试器:
芯片:
最后点击绿色三角形即可下载程序
715

被折叠的 条评论
为什么被折叠?



