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

[经验分享] 将机智云固件移植到cmsis-rtos-v1

106

主题

107

帖子

7264

积分

论坛元老

Rank: 8Rank: 8

积分
7264
跳转到指定楼层
楼主
 楼主| 发表于 2023-7-29 22:25:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
校园创客福利
   cmsis-rtos是基于freertos内核实现的,主要是支持freertos能在ARM Cortex-M上运行,以及对freertos部分函数进行再次封装。两者都是多任务的实时操作系统,假设有现有的业务需要多任务运行,在这两个系统运行差别其实并不大。 首先,我们打开cubemx,配置systick的时钟源,开启cmsis-rtos会占用默认的systick作为心跳,因此我们要为sys分配一个定时器用于其他外设。gokit套件可以分配未使用的tim4。

接下来,启用freertos 这里选择cmsis v1,要注意的是v1和v2代码并不能完全通用。

然后我们要修改一下中断优先级,机智云生成的代码tim2的中断优先级是0 为了保证freertos正常运行,我们要降低优先级,填写的数值为5以上

接下来生成代码,由于需要包含freertos库,此时一定要对keil的项目结构进行修改,因此我们之前添加的组会丢失,可以参考我之前是一篇文章重新添加组和目录以及勾选microlib

接下来就是修改我们的代码了,freertos使用了HAL_TIM_PeriodElapsedCallback函数作为回调函数,而机智云的gizwits_products同样使用了此回调函数用于机智云自己的业务运行,因此我们要注释一个函数,否则两个函数会重定义。这里我选择注释机智云里的。

注释完成后,我们要把回调函数里的代码复制到main.c的tim回调函数里

编写在user code区间,以便后续重新生成的时候不会被cubemx删除。
我们开启cmsis-rtos的时候,默认已经创建了一个任务,因此我们只需要把机智云while循环的内容搬到任务函数内即可
把wihle(1)内的代码剪切到任务函数内

这里我为任务添加了一个delay 1ms 暂时释放cpu使用权,这样业务正常运行的同时,多任务运行也能有一个比较好的效果。
此外,要特别注意,要为默认创建的任务分配400字节以上的堆栈空间用于正常运行,由于v1版本不支持调用函数查看占用堆栈,因此可以通过观察串口是否正常输出来判断系统是否正常运行,堆栈溢出系统异常后会导致串口无数据输出。数据点比较多的情况下需要分配更多的堆栈空间。

这里我还创建了一个任务打印一条语句显示系统正常运行

可以检测多任务的运行状况,接下来我们通过串口查看系统运行状态

至此,成功移植机智云的代码到cmsis-rtos上。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

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

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