v2版是v1版本的一个升级,在v2,可以使用更多的函数和一些高级的特性。例如信号量,任务挂起恢复等,这些对于我们的项目来说是大有好处的,可以减少一些不必要的代码,例如v1版想要实现任务挂起恢复可能还得借助外部变量。此外v2还提供了一些调试用的api,可以帮助我们查看程序的运行情况。配置过程基本和v1版本的一致。
首先是启用v2版本的cmsis-rtos
接下来更换systick的定时器
取消tim2和usart2使用rtos函数,还原到默认的中断优先级设置
最后,创建两个任务,一个默认的用于 机智云业务运行,一个用于输出调试信息。
要注意:这里的堆栈大小单位是word,对于 STM32位架构,一个字是4字节,因此512x4大概是2k的堆内存。实际因为字节对齐和其他原因可能有偏差,具体分配的内存我们可以在 heap usage查看
可以看出,实际分配会比计算多一点,接下来生成代码,重新配置keil的选项和目录,这里就不展开了。
代码配置过程和v1版本的基本一致可以看我v1版本的文章。主要就是注释机智云的定时器中断回调函数,复制功能代码到main函数的中断回调内,然后把main函数的while1循环内的代码剪切到默认任务的for循环内。
此时我们完成了移植,可以看出v2相比v1,函数和一些定义都有些区别。
接下来我们使用freertos的api来输出堆栈的占用情况,以便我们确定是否分配过多或过少。v1版是没有这个函数的,因此使用v2开发会更便捷。
首先我们要包含task头文件
接下来,我们在另一个任务内以1秒为间隔输出堆栈占用情况
简而言之,uxTaskGetStackHighWaterMark这是,freertos带的函数,需要一个参数,参数是任务的句柄,可以输出此任务到目前为止堆栈剩余的最小值,我们可以用此来确定分配任务的堆栈是否合理。
以机智云业务运行的任务为例。
可以看出,在连接app分配数据点后,剩余的堆栈大幅降低。
剩余142字,分配了512字给整个任务,那么也就是大概占用了1.4k的运存,剩下142字还算多,因此假设业务比较多,内存不是很充足的情况下,可以减少任务分配的堆大小,用于其他任务。
|