
FreeRTOS
学习野火《FreeRTOS+内核实现与应用开发实战》笔记
jiang_2018
这个作者很懒,什么都没留下…
展开
-
FreeRTOS任务通知实现步骤
任务通知数据结构任务通知不用创建,本身就在TCB中,如下分别是通知值和通知状态,状态有如下3种等待通知step1.关中断step2.如果ucNotifyState !=taskNOTIFICATION_RECEIVED ulNotifiedValue 清除 ulBitsToClearOnEntry ucNotifyState设置成taskWAITING_NOTIFICATION 如果xTicksToWait>0 把自己移到DelayedList阻塞原创 2022-05-02 13:00:00 · 488 阅读 · 0 评论 -
FreeRTOS事件组实现步骤
文章目录事件组数据结构等待事件组设置事件组中断中设置事件组事件组数据结构可以看到事件组结构体比队列占用资源少多了等待事件组step1.关调度器step2.判断uxEventBits是否满足条件,满足step3 不满足 uxBitsToWaitFor==0,开调度器,返回ERR uxBitsToWaitFor!=0,用xTasksWaitingForBits列表记录当前TCB,并把当前TCB从xReadyTasksLists移调到xDelayedTaskList原创 2022-05-02 11:15:00 · 401 阅读 · 0 评论 -
FreeRTOS消息队列、信号量、互斥量、递归互斥量实现步骤
消息队列消息队列结构由消息队列控制块+消息存储buffer组成,是全局变量,结构如下消息队列控制块中的链表 List_t xTasksWaitingToSend; //记录发送阻塞的TCB List_t xTasksWaitingToReceive;//记录接收阻塞的TCB读队列步骤 step1.关中断 step2.如果buffer中有数据,goto step3 如果buffer中没数据, 如果xTicksToWait=0,开中断,返回ERR原创 2022-05-02 10:45:00 · 1228 阅读 · 0 评论 -
RTOS临界段如何实现嵌套
存在的问题f1(){ disable_int do_something enable_int}f2(){ disable_int f1(); do_something enable_int}如上代码存在临界段嵌套问题,f1执行完后就打开中断了,所以f2的do_something不处于临界段中解决方法以FreeRTOS为例子非中断中,增加全局变量记录嵌套次数,只有为0时才使能中断中断中,通过备份basepri来实现嵌套,如果存在嵌套,则嵌套中写入basepri的是上原创 2022-04-19 19:34:49 · 851 阅读 · 0 评论 -
踩内存检测
目的实际项目中容易存在内存泄漏问题,为了更快检测出内存泄漏的点,以FreeRTOS heap_4的内存堆策略为例子,加以改进。在debug模式下,每次进行分配释放都进行检测,确保及时发现内存泄漏heap_4原始堆视图节点数据类型如下/* Define the linked list structure. This is used to link free blocks in orderof their memory address. */typedef struct A_BLOCK_LIN原创 2022-04-16 23:31:57 · 956 阅读 · 0 评论 -
软件看门狗怎么设计
有几个看门狗主控内部有条看门狗,叫做内部狗,有的产品外部有充电ic,也能起到看门狗的作用,一般和主控采用IIC通讯,叫做外部狗。环境以RTOS为例子,介绍看门狗设计设计目的能监控到每个线程是否有执行,并且能细化每个线程的喂狗超时时间设计介绍...原创 2022-04-16 21:48:20 · 1227 阅读 · 0 评论 -
apollo中断状态判断
在看apollo3 代码时发现下面这个函数void WsfSetOsSpecificEvent(void){ if(xRadioTaskEventObject != NULL) { BaseType_t xHigherPriorityTaskWoken, xResult; if(xPortIsInsideInterrupt() == pdTRUE) { // // Send an event to the main radi原创 2020-11-18 11:00:22 · 620 阅读 · 0 评论 -
FreeRTOS软件定时器中断进不去
问题场景开发中发现FreeRTOS软件定时器不走了,具体表现在软件定时器中断进不去。分析问题观察发现只有在某个任务执行期间,FreeRTOS的软件定时器才会不走,其他任务执行时正常,排查后是此任务的优先级比定时器任务高,且占用时间比较长,导致任务切不出去。解决问题在FreeRTOSConfig.h中修改定时器任务优先级为最高解决问题...原创 2020-11-12 10:21:58 · 2647 阅读 · 1 评论 -
记录一次使用FreeRTOS死等问题
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2020-11-11 20:50:33 · 1272 阅读 · 0 评论 -
FreeRTOS动态内存管理(heap_5)
文章目录heap_5.cvPortDefineHeapRegions常见问题heap_5.cheap5与heap4分配释放算法完全相同,只是heap5支持管理多块不连续的内存,本质是将多块不连续内存用链表串成一整块内存,再用heap4算法来分配释放。若使用heap5则在涉及到分配释放的函数调用时要先调用vPortDefineHeapRegions把多块不连续内存串成一块初始化。vPortDefineHeapRegions此函数原型void vPortDefineHeapRegions( const原创 2020-08-04 00:01:34 · 2594 阅读 · 0 评论 -
FreeRTOS动态内存管理(heap_4)
文章目录heap_4.c内存堆管理分配内存堆初始化把新构造的结构体插入空闲链表释放还剩空闲字节数历史剩余最小字节数适用范围、特点heap_4.c内存堆管理heap_4也是用链表来管理,但是链表头用的是结构体,链表尾用的是指针,链表尾占用ucHeap内存数据结构如下/* Define the linked list structure. This is used to link free blocks in orderof their memory address. */typedef str原创 2020-08-03 00:07:22 · 1152 阅读 · 0 评论 -
FreeRTOS动态内存管理(heap_2)
文章目录heap_2.c内存堆管理分配初始化内存堆把新构造的结构体插入空闲链表释放还剩空闲字节数适用范围、特点heap_2.c内存堆管理heap_2和heap_1一样是开辟一个大数组作为堆空间供用户使用,但是采用单项不循环链表来管理内存的分配释放,主要思想是用链表把内存块串起来,数据结构如下/* Define the linked list structure. This is used to link free blocks in orderof their size. */typedef原创 2020-08-02 20:23:02 · 704 阅读 · 0 评论 -
FreeRTOS动态内存管理(heap_1)
文章目录动态内存管理heap_1.c大数组在哪里实际可用数组字节数已分配字节数分配释放还剩空闲字节数适用范围、特点动态内存管理FreeRTOS提供5种动态内存管理策略,分别为heap_1到heap_5,源码在FreeRTOS/Source/portable/MemMang下,本质是对一个或者多个大数组进行操作来对系统提供内存的申请、释放(有的策略没有)功能。下面先看看heap_1是怎么做的。heap_1.c大数组在哪里/* Allocate the memory for the heap. */原创 2020-08-02 17:17:16 · 770 阅读 · 0 评论 -
FreeRTOS支持时间片
什么是时间片时间片就是同一个优先级下可以有多个任务,每个任务轮流地享有相同的 CPU 时间, 享有 CPU 的时间我们叫时间片。在 RTOS 中,最小的时间单位为一个 tick,即 SysTick 的中断周期,与其说 FreeRTOS 支持时间片,倒不如说它的时间片就是正常的任务调度。...原创 2020-05-24 00:24:11 · 1616 阅读 · 0 评论 -
FreeRTOS任务延时列表
之前的阻塞延时实现之前为了实现任务阻塞延时,在任务控制块TCB中添加了个成员xTicksToDelay,当任务需要延时时就设置xTicksToDelay,然后把该任务挂起,这里挂起只是将uxTopReadyPriority中对应的位清0(注意此时还不支持时间片,即同一优先级下只有一个任务,所以能直接清0,如果支持时间片还需判断该优先级列表上是否还有其它节点即是否还有其它任务,有就不能清0),并没有把该任务从任务就绪列表中删除,每次时基来临时(SysTick中断),就扫描各个任务的xTicksToDela原创 2020-05-23 22:42:29 · 491 阅读 · 0 评论 -
FreeRTOS多优先级实现
文章目录如何实现任务多优先级软件通用方法和硬件指令方法如何实现任务多优先级FreeRTOS中,数字优先级越小,逻辑优先级也越小,空闲任务优先级为0.List_t pxReadyTasksLists[configMAX_PRIORITIES]是数组,数组下标代表任务优先级,任务创建是根据设置的任务优先级插入到对应下标的列表根节点上,如下。要支持多优先级,就是再任务切换时让pxCurrentTCB指向最高优先级的TCB即可,之前时手动再任务1、任务2来回切换,现在问题就是怎么找到优先级最高的就绪任务T原创 2020-05-10 18:04:25 · 784 阅读 · 0 评论 -
FreeRTOS空闲任务与阻塞延时的实现
什么是阻塞延时、为什么需要空闲任务RTOS中的延时叫阻塞延时,即任务需要延时时,任务会放弃cpu使用权,cpu转而去做其他的事,当任务延时时间到后,任务重新请求获得cpu使用权。但当所有的任务都处于阻塞后,为了不让cpu空闲没事干就需要一个空闲任务让cpu干活。空闲任务的实现空闲任务实现和创建普通任务没区别,空闲任务在调用vTaskStartScheduler函数内部创建,如下...原创 2020-03-26 11:35:05 · 1170 阅读 · 1 评论 -
FreeRTOS临界段保护
文章目录临界段保护场合非中断场合中断场合使用例子临界段保护场合FreeRTOS中临界段保护有2种场合,中断和非中断,通过关中断(或者关部分中断)来实现临界保护。非中断场合task.h中#define taskENTER_CRITICAL() portENTER_CRITICAL()#define taskEXIT_CRITICAL() portEXIT_CRITICAL()p...原创 2020-03-24 17:29:43 · 810 阅读 · 0 评论 -
FreeRTOS任务创建与任务切换
文章目录任务控制块数据结构任务创建函数定义就绪表就绪表初始化启动调度器任务控制块数据结构任务控制块数据结构在task.c声明typedef struct tskTaskControlBlock{ volatile StackType_t * pxTopOfStack; //栈顶指针 ListItem_t xStateListItem; //任务节点 StackType_t * pxS...原创 2020-03-24 12:25:31 · 668 阅读 · 0 评论 -
FreeRTOS列表与列表项
文章目录前言列表项数据结构列表项初始化列表数据结构列表初始化将列表项插入列表尾部将列表项按照升序排列插入到列表将列表项从列表删除前言FreeRTOS列表与列表项其实就是链表和节点,在list.c和list.h实现列表项数据结构//列表项数据结构typedef struct xLIST_ITEM{ TickType_t xItemValue; //辅助值,用作节点做顺序排序 str...原创 2020-03-23 13:00:53 · 641 阅读 · 0 评论