freeRTOS
文章平均质量分 54
qq_45671732
这个作者很懒,什么都没留下…
展开
-
freeRTOS任务管理
这个小节讲述的是任务的优先级别,设置 获取等操作通过freeRTOS的API文档可以知道每一个任务优先级是从0到 configMAX_PRIORITIES - 1(0代表空闲优先级,configMAX_PRIORITIES - 1是我们可以人为设置的优先级,而且数值越大,说明任务的优先级越高),这个configMAX_PRIORITIES 定义在FreeRTOSConfig.h头文件中。好,我们打开之前的示例,进行修改,获取任务函数的优先级。/*原创 2022-12-09 17:01:51 · 698 阅读 · 0 评论 -
mutex互斥量
xSemaphoreCreateMutex()创建mutex互斥量,vTaskSuspendAll()挂起任务调度器,使用xTaskCreate()函数创建任务,xTaskResumeAll()恢复任务调度器。大部分情况,线程使用的数据都是局部变量,变量的地址空间在线程栈空间内,这种情况,其他线程无法获得这种变量。但有时候,很多变量都需要在线程间共享,这样的变量称为共享变量,可以通过数据的共享,完成线程之间的交互。我们为了解决带来的一系列问题,我们需要一把锁。多个线程并发的操作共享变量,会带来一些问题。原创 2022-08-19 11:55:26 · 216 阅读 · 2 评论 -
计数型信号量
1.事件计数:每次事件发生,事件处理函数将释放信号量(信号量计数值加1),其他处理任务会获取信号量(信号量计数值减1)来处理事件。假设有一家停车场,总共有10个空闲停车位,当一个车放置在停车位中,空闲停车位减少1,当一个车从停车位中开出,空闲停车位增加1,那么计数型信号量就可以理解为空闲停车位,也可以理解为有效地 可以用的资源的数目。对于carInTask()的函数,调用uxSemaphoreGetCount()函数获取到计数型信号量的数目,调用xSemaphoreTake()获取信号量。原创 2022-08-19 11:53:42 · 854 阅读 · 1 评论 -
二进制信号量
我们在app_main()中调用xSemaphoreCreateBinary()函数,创建一个二进制信号量,创建完后使用xSemaphoreGive()函数释放创建的信号量,使用xTaskCreate()创建任务。二进制信号量能够满足任务间的互斥和同步,需要的系统开销最小,因此也称快速信号量。在myTask1()和myTask2()中先获取信号量,循环打印后释放信号量。本小节就来认识二进制信号量的创建等过程。xSemaphore:创建的信号量句柄。创建一个二进制信号量,并返回一个句柄。原创 2022-08-19 11:51:18 · 517 阅读 · 1 评论 -
软件定时器
一个软件定时器(或者只是一个“定时器”)允许一个函数在未来的一个设定的时间执行。由计时器执行的函数被称为计时器的回调函数。计时器从启动到执行它的回调函数之间的时间称为计时器的周期。简单地说,计时器的回调函数在计时器的周期到期时执行。改变软件定时器的周期 xTimer:正在分配新时段的计时器。首先要调用xTimerCreate()函数去创建定时器,并给软件定时器传入一个回调函数TimerCallBack()。调用pcTimerGetName()函数返回创建计时器时分配给计时器的人类可读文本名称。原创 2022-08-19 11:46:11 · 661 阅读 · 0 评论 -
Queue邮箱
写数据端wirteTask()写入一个数据到邮箱队列中,readTask()从邮箱队列中读取数据,可以通过写数据的方式来控制readTask()读数据端的执行方向。原创 2022-08-19 11:27:18 · 191 阅读 · 0 评论 -
Queue集合
在接收数据端recTask设置为:当队列集合中的某一个队列存在数据,则会返回相应存在数据的队列的句柄给recTask,recTask会根据相应的队列句柄去相对应的队列中取数据。上图讲述的是三个发送数据端分别向对应的队列中发送数据,sendTask1发送数据111到队列1中,sendTask2发送数据222到队列2中,sendTask3发送数据333到队列3中。接收数据端recTask如何接收数据呢?原创 2022-08-19 11:25:37 · 171 阅读 · 1 评论 -
Queue的多进单出模型
这里值得提一句的是,三个发送数据端可以赋予相同的优先级,也可以赋予不同的优先级,这是根据实际情况去调整的。对于接收数据端,要比三个数据端赋予的优先级还要大才可以,这也是为了保证当消息队列缓冲区中存放了数据,接收端的任务函数可以立即取出并进行处理。在这个延时过程中,发送数据端不断的向队列中发送数据,由于队列是FIFO(First in First Out)先进先出的特点,最先进入的数据会最先被接收数据端取到。创建三个发送数据的任务函数,具体的可以参考上一小节,发送数据的函数创建好后,再创建接收数据的函数。原创 2022-08-19 11:14:12 · 179 阅读 · 0 评论 -
Queue的三种数据传递
队列是任务间通信的主要形式。它们可以用于在任务之间、中断和任务之间发送消息。在大多数情况下,它们被用作线程安全的FIFO (First In First Out)缓冲区,新数据被发送到队列的后面,尽管数据也可以发送到队列的前面。一个sendTask向队列发送数据,一个recTask从队列中接收数据。原创 2022-08-19 11:05:58 · 778 阅读 · 0 评论