|
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上。
|
|