
FreeRTOS
文章平均质量分 63
Freertos μC/OS-II
小阳先生的宝库
你所浪费的今天,是许多人奢望的明天;你所厌恶的现在,是未来的你回不去的曾经。
展开
-
Freertos-递归锁
1.死锁的概念假设有 2 个互斥量 M1、 M2, 2 个任务 A、 B:A 获得了互斥量 M1B 获得了互斥量 M2A 还要获得互斥量 M2 才能运行,结果 A 阻塞B 还要获得互斥量 M1 才能运行,结果 B 阻塞A、 B 都阻塞,再无法释放它们持有的互斥量死锁发生!2.自我死锁任务 A 获得了互斥锁 M它调用一个函数函数要去获取同一个互斥锁 M,于是它阻塞:任务 A 休眠,等待任务 A来释放互斥锁!死锁发生!3.递归锁任务 A 获得递归锁 M 后,它还可以多次去原创 2022-03-08 16:41:26 · 933 阅读 · 0 评论 -
Freertos-互斥量的基本使用
刚创建的互斥量可以被成功"take"“take"互斥量成功的任务,被称为"holder”,只能由它"give"互斥量;别的任务"give"不成功。在 ISR 中不能使用互斥量。本程序创建 2 个发送任务:故意发送大量的字符。 可以做 2 个实验:使用互斥量:可以看到任务 1、任务 2 打印的字符串没有混杂在一起。不使用互斥量:任务 1、任务 2 打印的字符串混杂在一起。main函数/* 互斥量句柄 */SemaphoreHandle_t xMutex;int main( void ).原创 2022-03-03 15:41:13 · 900 阅读 · 0 评论 -
freertos之队列的阻塞访问
1.概念只要知道队列的句柄,谁都可以读、写该队列。任务、 ISR 都可读、写队列。可以多个任务读写队列。任务读写队列时,简单地说:如果读写不成功,则阻塞;可以指定超时时间。如果能读写了就马上进入就绪态,否则就阻塞直到超时。读取队列的任务个数没有限制,那么当多个任务读取空队列时,这些任务都会进入阻塞状态。写队列的任务个数没有限制,那么当多个任务写"满队列"时,这些任务都会进入阻塞状态。有多个任务在等待同一个队列的数据。当队列中有数据时,哪个任务会进入就绪态?优先级最高的任务如果大家的优先级相原创 2022-03-03 15:14:55 · 2136 阅读 · 0 评论 -
Freertos中空闲任务的重要性
1. 代码这次反着来,我们先看一段代码;任务 1:任务 1 的大循环里,创建任务 2,然后休眠一段时间任务 2:打印一句话,然后就删除自己任务1代码:void vTask1( void *pvParameters ){ const TickType_t xDelay100ms = pdMS_TO_TICKS( 100UL ); BaseType_t ret; for( ;; ) { printf("Task1 is running\r\n"); ret = xT原创 2022-03-01 15:50:05 · 1611 阅读 · 1 评论 -
Freertos中两个delay函数
vTaskDelay:至少等待指定个数的 Tick Interrupt 才能变为就绪状态vTaskDelayUntil:等待到指定的绝对时刻,才能变为就绪态。main代码:int main( void ){ prvSetupHardware(); /* Task1的优先级更高, Task1先执行 */ xTaskCreate( vTask1, "Task 1", 1000, NULL, 2, NULL ); xTaskCreate( vTask2, "Task 2", 1000, NUL原创 2022-03-01 15:35:32 · 2694 阅读 · 0 评论 -
FreeRTOS的内部机制(基础少勿看)
一.深挖创建任务这里就是创建了一个Task1的任务。点击创建任务往内部跳转。得到如下的一个TCB结构体。TCB结构体在内存里面分配一个TCB结构体表示一个任务的创建。现在问题来了,,1000:代表着这个任务所需栈的大小,为1000*4位,栈的大小:1.取决于局部变量 2.调用深度 所以最好多分配一下 适当调整栈:就是一块空闲的内存vTask1的大小从那里分配呢?从这个大的数组中划分出一部分给某个任务使用。创建的整个流程用图表示:二.任务状态的切换原创 2021-11-04 15:39:14 · 596 阅读 · 0 评论 -
FreeRTOS中的堆栈计算
1.栈的重要性其实不管是普通的程序还是Freertos程序,分配的栈的大小是很重要的,要不然带不动程序,就容易造成程序的崩溃。函数调用时的现场保护和返回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间。2.检测堆大小xPortGetFreeHeapSize()可以获取调用时堆中空闲内存的大小,以字节为单位。使用它可以优化堆的大小。需要注意,当使用heap_3时是不能调用这个函数的。xPortGetMinimumEverFreeHeapSize()此函数返回FreeRTOS应用程序原创 2021-10-31 17:17:35 · 6293 阅读 · 0 评论 -
Freertos基本概念----(猫和老鼠)
1.实时操作系统与非实时操作系统的区别FreeRTOS中优先级的数值越小,代表该任务的优先级越低,最低优先级为0解释:哈皮狗的优先级最高 次之是汤姆猫 最后是杰瑞鼠 之后依然用这个例子现在有一块大肥肉,哈皮狗 汤姆猫 杰瑞鼠都想吃 那么谁先吃呢?杰瑞鼠看到了一块大肥肉(CPU),迫不及待的就去吃,刚吃一口,汤姆猫来了,杰瑞鼠立刻溜之大吉。汤姆猫开始享受美味,汤姆猫吃饱了离开了/汤姆猫被主人叫走离开了,杰瑞鼠才能继续吃这块肉,你要是问我?汤姆猫要是把肉吃完了,,,,,,你走!在实时操原创 2021-10-28 11:01:25 · 719 阅读 · 0 评论 -
FreeRTOS-低功耗tickless模式
1.整体思路图2.keil5中配置当将宏定义configUSE_TICKLESS_IDLE配置为1时且系统运行满足以下两个条件时,系统内核会自动的调用低功耗宏定义函数portSUPPRESS_TICKS_AND_SLEEP()。1.当前空闲任务正在运行,所有其它的任务处在挂起状态或者阻塞状态。2.只有当系统可运行于低功耗模式的时钟节拍数大于等于这个参数时,系统才可以进入到低功耗模式。默认配置为2,我们自定义时一定不能小于2这个函数被空闲任务调用,是低功耗tickless的关键3.原创 2021-09-22 13:41:14 · 1096 阅读 · 0 评论 -
FreeRTOS-互斥信号量(五)
介绍互斥信号量所用到的函数1.互斥量创建函数xSemaphoreCreateMutex() 功能:互斥量创建函数参 数:void 无返回值:返回一个互斥量句柄 2.互斥量获取函数 xSemaphoreTake( xSemaphore, xBlockTime )参数:xSemaphore:互斥量句柄xBlockTime : portMAX_DELAY 没有申请到资源阻塞, 0 申请到立马返回3.互斥量释放函数 xSemaphoreGive( xSemaphore原创 2021-08-03 17:06:31 · 3516 阅读 · 0 评论 -
互斥信号量的优先级继承机制(六)
1.互斥信号量基本概念互斥量又称互斥信号量(本质是信号量),是一种特殊的二值信号量。任意时刻互斥量的状态只有两种,开锁或闭锁。当互斥量被任务持有时,该互斥量处于闭锁状态,这个任务获得互斥量的所有权。当该任务释放这个互斥量时,该互斥量处于开锁状态, 任务失去该互斥量的所有权。互斥信量更多的是用于保护资源的互锁。2.优先级继承互斥量具有优先级继承机制,而二值信号量没有。也就是说,某个临界资源受到一个互斥量保护,如果这个资源正在被一个低优先级任务使用,那么此时的互斥量是闭锁状态,也代表了没有任务原创 2021-08-03 17:06:12 · 2266 阅读 · 4 评论 -
FreeRTOS-二值信号量(四)
首先介绍二值信号量用到的几个函数1. 二值信号量的创建xSemaphoreCreateBinary();//创建二值信号量参数:无返回值:返回一个二值信号量的句柄2. 二值信号量的获取 xSemaphoreTake( xSemaphore, xBlockTime ) 参数: xSemaphore:二值信号量句柄 xBlockTime: portMAX_DELAY 既没有申请到资源阻塞, 申请到立马返回返回值:成功返回pdPASS 3. 二值信号量的释放xSemaphor原创 2021-08-03 17:05:52 · 411 阅读 · 0 评论 -
FreeRTOS-计数信号量(三)
介绍计数信号量所用到的函数1.创建计数信号量SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount);功 能: 创建一个计数信号量。参 数:uxMaxCount: 计数信号量的最大值, 当达到这个值的时候,信号量不能再被释放。uxInitialCount: 创建计数信号量的初始值。返 回 值:如果创建成功则返回一个计数信号量句柄,用于原创 2021-08-03 17:05:33 · 419 阅读 · 0 评论 -
FreeRTOS-消息队列(二)
首先介绍三个函数:1.消息队列创建函数函 数 原 型:QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );功 能:用于创建一个新的队列。参 数:uxQueueLength: 队列能够存储的最大消息单元数目,即队列长度。uxItemSize: 队列中消息单元的大小,以字节为单位。返 回 值:如果创建成功则返回一个队列句柄,用于访问创建的队列。 如果创建不成功则返回N原创 2021-08-03 17:05:14 · 747 阅读 · 0 评论 -
FreeRTOS的模板(一)
先来认识一下框架BaseType_t Task_Ret = pdPASS;//创建任务返回值 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,//任务函数名称 const char * const pcName,//任务名称 ,最好有意义好辩认 const configSTACK_DEPTH_TYPE usStackDepth,//为任务分配的栈空间 void * const pvParameters,//任务形参,原创 2021-08-03 17:04:52 · 369 阅读 · 0 评论 -
移植FreeRTOS到STM32程序中(超详细)
系列文章目录文章目录系列文章目录前言一、移植过程二、修改添加部分程序三、修改错误总结前言在大三时,学了一段时间Freertos,当时没养成好习惯,没有写成文章当成笔记发到优快云上,也不至于换电脑时,删掉了很多资料笔记。再加上工作中没用到Freertos,直接跑的裸机,我想再不整理下,就废了。长时间不用,真的会忘记呀!开发板是STM32F103一、移植过程打开下载的源码库,有这些文件夹在自己的程序文件夹Freertos里创建文件夹这个是官方源码库文件原创 2021-07-29 14:31:01 · 7073 阅读 · 12 评论