在arduino上运行FreeRTOS

Arduino运行freertos

注意:不同的mcu对应不同的库


创建和运行



注意:任务函数不能有返回值、任务名自定义、函数参数统一写成无类型指针。

注意:通常要求函数不能结束,某些情况要任务删除。

任务创建参数

1.任务函数指针(自己写的函数)
2.任务名,在调试时候需要,可以为NULL
3.栈空间大小Arduino uno 、nano是1个单位2字节,其他需要根据freertos实现的具体情况来判断【很重要】不恰当的大小容易stackoverfloat
4.传递给任务的参数指针,不用可以为NULL
5.指定优先级,freertos最低优先级是0,最高优先级不会大于系统优先级
6.任务句柄,可以操作任务对象的优先级,可以删除任务对象,可以为NULL。

系统跑起来已经内置。
例子

防止优化的volatile,不好的延时方法如下

多任务模型如下

任务延时函数:让任务处于阻塞态来实现延时而不是空转cpu

Arduino nano库的心跳周期是15ms(portTICK_PERIOD_MS)

如下T为ms

例子

任务优先级



只有一个任务运行(卡点截的图不严谨,应当上动图,手机上没这功能)
优先执行最高的任务,超过一个就轮流执行
任务延时函数可以阻塞高优先级任务,然后将cpu释放给低优先级任务。
所有任务都采用任务延时函数时,如下图,可以使低优先级任务得到cpu

优先级限制


能使用的是0(用户不会使用,系统使用这个),1,2,3优先级
任务删除函数

更多的使用自删除

任务1中创建任务2之后自删除,
任务2中创建任务1之后自删除。
不停的生灭任务
如下任务1:

如下任务2:

给任务传参数


定义要传给任务参数结构体
并生成四组参数

任务函数中接受参数

创建不同入参的实例:实现任务类有一个,不同参数形成多个实例的效果。

信号量:任务间通信之一(传递信号0/1有无)




信号量获取

按指定时间等待或者死等

信号量的使用场景:信号(按钮)输入如下

定义并初始化信号量对象

按键任务
初始化(1.上一次按钮读取状态初始化为高2.设置引脚为输入模式3.等待一点时间让cpu把状态装载进去)
进循环(当确认按下key的时候给一个信号)


led任务初始化状态后死等按键给的的信号。
得到一个信号执行一次任务

注意:给出信号太频繁时,处理信号如果时间比较长,容易丢失信号。
计数信号量:能保存超过1个的信号量,解决信号给出频繁导致丢失的情况。

参数:1.最多能存的信号量2.初始时存放的信号量
唯一需要改的是初始化信号量Binary->Counting 二值信号变成计数信号。

注意:1.计数最大值要能保证安全(不会丢失信号)也不宜过多,内存占用需考虑。2.通常初始值为0,但不排除某些场景初始值不为0的情况。
队列:任务间通信之二(传输数据)

与信号量操作类似区别于发送的是数据


参数:1.最多能存放多少个数据2.每个数据的大小(字节)

参数:1.队列对象2.数据指针3.排队最大时长
队列先进先出原则
返回如下:


参数:1.同2.同3.等队时间

例子

定义按键数据结构体和队列

初始化队列,并生成四个按键任务实例,1个led任务实例

按钮任务

检测到按键确实被按下后发消息
确实:这一次是低电平,上一次(key_temp)是高电平


led任务
可以通过while等


如上,我想到了可以做一个midi键盘/🐶
队列的其他操作

如上:尾插和头插,默认为尾插。可以优先响应重要的消息


完结🎉感谢up
除此之外Freertos还有其他进阶函数可以玩。