收藏官网首页
查看: 3666|回复: 0

[经验分享] 移植机智云固件到cmsis-rtos-v2并输出简单的调试信息

106

主题

107

帖子

7264

积分

论坛元老

Rank: 8Rank: 8

积分
7264
跳转到指定楼层
楼主
 楼主| 发表于 2023-8-2 18:32:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
校园创客福利
    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字还算多,因此假设业务比较多,内存不是很充足的情况下,可以减少任务分配的堆大小,用于其他任务。



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表