freertos常用任务函数----freertos初学笔记

vtasksuspend 任务挂起函数,用户可以调用Vyasksuspend()函数将任何状态的任务挂起,被挂起的任务得不到cpu的使用权也不会参加调度,他相对于调度器而言是不可见的,除非解除挂起状态。

vtasksuspendall函数 将所有任务都挂起,也就是挂起任务调度器。

xtaskresumeall恢复所有任务函数,调度器被挂起后可以用此函数恢复,挂起了多少次就要调用多少次xtaskresumeall函数来恢复

vtask resume 任务恢复函数,

Xtaskresumeformisr()用来恢复被挂起的函数,xtaskresumeformisr专门用在中孤单服务中,无论被挂起了多少次,只需要调用一次此函数即可恢复

vtaskdelete任务删除函数,用于和删除一个任务。当一个任务删除另外一个任务时,形参为要删除任务创建时返回的任务句柄,如果删除自身,那么形参为NULL。

vtaskdelay 任务相对延时函数 ,每个任务都必须是死循环,并且每个任务都必须要有阻塞的情况,不然的话低优先级的任务就无法运行了。

vtaskdelayuntil 绝对延时函数,绝对延时函数常用于比较精准的周期运行任务,它以固定的频率定期执行不受外部的影响,任务从上一次运行到下一次运行开始的时候是绝对的,不是相对的。vtaskdelayuntil和vtaskdelay都是实现任务周期性延时的。但是vtaskdelay的延时是相对的,不确定的,他的延时是等vtaskdelay完毕后开始计算的,并且ctaskdelay延时时间到了以后如果有高级任务或者中断正在执行的话,被延时阻塞的任务并不会马上解除阻塞,所以每次执行任务的周期并不确定,而vtaskdelayuntil延时是绝对的,适用于周期性执行的任务。

xqueuecreate()消息队列创建函数,用于创建一个新的队列并返回可用于访问这个队列的队列句柄,队列句柄就是一个指向队列数据结构类型的指针,队列就是一个数据结构,用于任务间的数据的传递,每创建一个任务都需要为其分配RAM,一部分存储队列状态,剩下的作为队列消息的存储区域。

vqueuedelete()消息队列删除函数,队列删除是根据消息队列句柄直接删除的,删除之后这个消息队列的所有信息都会被系统回收清空,并且不能再次使用这个消息队列了,需要注意的是,无法删除没有被创建的消息队列。

xqueuesend是一个宏,展开是调用xqueuegenericsend()这个函数, 该 宏 是 为 了 向 后 兼 容 没 有 包 含 xQueueSendToFront() 和
xQueueSendToBack() 这 两 个 宏 的 FreeRTOS 版 本 。 xQueueSend() 等 同 于xQueueSendToBack()。
xquuesend()用于向队列尾部发送一个队列消息,消息以拷贝的形式入队,而不是引用的形式,这个函数不能再中断服务函数中调用,中断中必须用带中断保护功能的xqueuesendfromisr()来代替。

xQueueSendFromISR()是一个宏,宏展开是调用函数 xQueueGenericSendFromISR()。该宏是 xQueueSend()的中断保护版本,用于在中断服务程序中向队列尾部发送一个队列消息,

xqueuesendtofron()是一个宏,用于向队列队首发送一个消息,消息以拷贝的形式入队,而不是引用,该函数绝对不能在中断服务程序里面被调用,必须要又中断保护功能的函数才行

xQueueSendToFrontFromISR() 是 一 个 宏 , 宏 展 开 是 调 用 函 数xQueueGenericSendFromISR()。该宏是 xQueueSendToFront()的中断保护版本,用于在中断服务程序中向消息队列队首发送一个消息。

xqueuegenericsend ()通用消息队列发送函数,上面的消息发送函数都是xqueuegenericsend()展开的宏定义,真正在起作用的就是xqueuegenericsend函数,根据指定的参数不一样,发送消息的结果就是不一样。

xqueuegenericsenformisr()在中断中发送消息函数,该函数只能用于中断中执行。是不带阻塞机制的。

xqueuereceice是一个宏,宏展开是调用函数xqueuegenricreceive()。xqueue receive()用于从一个队列中接收消息并把消息从队列中删除,接收的消息是以拷贝的形式进行的,所以我们必须提供一个足够空间的缓冲区,该函数不能再中断中调用。

xqueuepeek函数在队列中接收消息但是不会删除消息。

xQueueReceiveFromISR()函数是 xQueueReceive ()的中断版本,用于在中断服务程序中接收
一个队列消息并把消息从队列中删除;

xqueuepeekfromisr是xqueuepeek的带中断版本。这两个函数都只能用于中断,不带阻塞机制的。

xqueuegenericreceive()从队列中读取消息。

消息队列使用注意事项:
1. 使用 xQueueSend()、xQueueSendFromISR()、xQueueReceive()等这些函数之前应先
创建需消息队列,并根据队列句柄进行操作。
2. 队列读取采用的是先进先出(FIFO)模式,会先读取先存储在队列中的数据。当
然也 FreeRTOS 也支持后进先出(LIFO)模式,那么读取的时候就会读取到后进
队列的数据。
3. 在获取队列中的消息时候,我们必须要定义一个存储读取数据的地方,并且该数
据区域大小不小于消息大小,否则,很可能引发地址非法的错误。
4. 无论是发送或者是接收消息都是以拷贝的方式进行,如果消息过于庞大,可以将
消息的地址作为消息进行发送、接收。
5. 队列是具有自己独立权限的内核对象,并不属于任何任务。所有任务都可以向同
一队列写入和读出。一个队列由多任务或中断写入是经常的事,但由多个任务读
出倒是用的比较少。

xsemaphorecreatebinary函数用于创建一个二值信号量。并返回一个句柄,其实二值信号量和互斥量都共同使用一个类型semaphorehandle_t的句柄。

xsemaphorecreatecounting()用于创建一个计数信号量。

vsemaphoredelete()用于删除一个信号量,包括二值信号量,计数信号量,互斥量和递归互斥量。

xsemaphoregive()用于释放信号量的宏,真正实现的工程是调用消息队列通用发送函数。
xsemaphoregivefromisr()用于释放一个信号量,带中断保护,被释放的信号量可以是二进制的信号量和计数信号量。他不能释放互斥量。因为互斥量不可以在中断中使用。

xsemaphoretake用于获取信号量,不带中断保护,获取信号量的对象可以是二值信号量也可以是计数信号量和互斥量,但是递归互斥量并不能使用这个API函数获取。

xsemaphorecreatemutex()用于创建一个互斥量,并返回一个互斥量句柄

xsemaphoretecreaterecursivemutex()用于创建一个递归互斥量,不是递归的互斥量由函数

xsmaphorecreatemutex()或者xsemaphoretemutexstatic()创建,且只能被同一个任务获取一次,如果同一个任务想再次获取则会失败,递归信号量则相反。它可以被同一个任务获取很多次,获取多少次就要释放多少次,递归信号量与互斥量一样,都实现了优先继承机制。

vsemaphoredelete()互斥量删除函数。

xsemaphoretake()互斥量获取函数。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值