FreeRTOS临界保护】的更多相关文章

下面的是个人笔记,所有的话都适用于我本人理解,可能存在不对的地方. 进入临界保护(支持嵌套):taskENTER_CRITICAL(); 退出临界保护(支持嵌套):taskEXIT_CRITICAL();   中断里进入临界保护(支持嵌套):  taskENTER_CRITICAL_FROM_ISR(); 中断里退出临界保护(支持嵌套):   taskEXIT_CRITICAL_FROM_ISR( x );   进入临界保护的定义代码: 从中可以看出,uxCriticalNesting++,正因…
以下转载自安富莱电子: http://forum.armfly.com/forum.php 临界段代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须关中断,而临界段代码执行完毕后,要立即开中断. FreeRTOS 临界段相关知识补充FreeRTOS 的源码中有多处临界段的地方, 临界段虽然保护了关键代码的执行不被打断, 但也会影响系统的实时性.比如此时某个任务正在调用系统 API 函数,而且此时中断正好关闭了,也就是进入到了…
郑重声明,版权所有! 转载需说明. FREERTOS堆栈大小的单位是word,不是byte. 根据处理器架构优化系统的任务优先级不能超过32,If the architecture optimized method is used then configMAX_PRIORITIES cannot be greater than 32. vTaskDelay() delay from call the vTaskDelay vTaskDelayUntil delay from last wake…
以下教程(大部分章节)(尤其理论介绍部分)转载自安富莱电子,官网链接: http://forum.armfly.com/forum.php 然后根据安富莱的教程自己做了分析和测试,希望大家共同进步. 其中也有个别章节是正点原子和野火的教程. 提高篇开始是自己根据使用经验的原创,期间也有参考官方资料的原创.主要先使用安富莱的教程达到入门水平.有需要时还得分析源码. 目录 1.FreeRTOS——1 2.FreeRTOS基础知识 3.FreeRtos——移植 4.FreeRtos——单任务 5.Fr…
在WINDOWS里面使用临界来保护多线程需要访问的共享对象,现在,DELPHI有了新的跨平台临界保护者--System.TMonitor 代码演示如下: FConnections := TObjectDictionary<TIdTCPConnection,TDSTCPChannel>.Create; ... procedure TCMServerForm.CMServerTransportDisconnectEvent(Event: TDSTCPDisconnectEventObject);v…
摘 要:从Keil C51的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于Keil C51的一种调度方式.为此,构造这一实时操作系统,并有针对性地介绍此系统的堆管理方法.任务的建立以厦任务的切换等.关键词:51单片机 实时操作系统 任务重八调度 目前,大多数的产品开发是在基于一些小容量的单片机上进行的.51系列单片机,是我国目前使用最多的单片机系列之一,有非常广大的应用环境与前…
前面小玩了一下ucos和lwip,但是都还不是真正的网络多任务,真正的网络多任务应该是什么样子的呢?应该是有一个专门的任务负责网络的通讯,他负责将数据发送出去,将数据接收回来,而其他的需要用到网络的任务与这个任务通讯,这才是能够极大提升网络效率的办法,lwip支持这种办法,不过移植起来就比较磨人了 首先第一步是修改lwip的配置文件,如下 #define NO_SYS 0 //使用UCOS操作系统 改了这个之后会发现卧槽一下子缺了好多东西,实际上是这样,lwip使用一系列的宏和方法封装了一个操作…
http://blog.csdn.net/ygrx/article/details/8020516 好久没有做过技术工作了,前几天因为一些需要,要在ST的OS20平台上进行了LWIP的移植,有一些心得,写出来供大家参考. LWIP的背景我就不介绍了,相信能看到这篇文章的人都对其背景有过了解了. LWIP的模块化还是很强的,所以移植起来没有想象的那么多困难,一个协议栈在某个平台上移植,其实主要来说包括两个大的部分接口,注意一下,我使用的是最新的LWIP1.4.0. 1.与系统相关的接口,比如多线程…
玩过TI 的ZigBee或者BLE的人,都会接触到OSAL.OSAL是什么?OSAL英文全称:operating system abstraction layer(操作系统抽象层).基于OSAL的调度机制,OSAL支持多任务,而且一个任务内支持多个事件执行.有关OSAL调度机制的实现原理,可以去网上搜索资料.在OSAL下,我们就可以把对数据或者单片的操作转化成各种任务,各种事件,真正做到有条不紊.和较为复杂UCOS系统比起来,OSAL实现起来比较简单,其核心也只是做一些任务的轮询调度.OSAL占…
前言: 除了thread,boost::thread另一个重要组成部分是mutex,以及工作在mutex上的boost::mutex::scoped_lock.condition和barrier,这些都是为实现线程同步提供的. 原文链接:http://blog.csdn.net/yefengnidie/article/details/6428596 一.Boost锁 mutex:boost提供的mutex有6种:boost::mutex      唯一锁,同时只能由一个线程访问,不分读写boos…
中断屏蔽寄存器 PRIMASK.FAULTMASK和BASEPRI 1.PRIMASK:这是个只有1个位的寄存器.当它置1时, 就关掉所有可屏蔽的异常,只剩下 NMI和硬fault可以响应.它的缺省值是0,表示没有关中断 2.FAULTMASK:这是个只有1个位的寄存器.当它置1时,只有NMI才能响应,所有其它的异常,包括中断和fault,通通闭嘴.它的缺省值也是0,表示没有关异常 3.BASEPRI:这个寄存器最多有9位(由表达优先级的位数决定).它定义了被屏蔽优先级的阈值.当它被设成某个值后…
举例 等待事件标志组的任务,要是在中断服务程序中设置事件标志组,但不知道当前有多少个任务在等待此事件标志,这个操作即为不确定性操作,为了不在中断服务程序中执行此不确定性操作,只在中断服务程序中给一确定任务发送消息,而在此确定任务中执行事件标志组置位操作,对于临界段的处理,则是将临界段改为调度锁来完成…
本文介绍队列的基本知识,具体源代码分析见<FreeRTOS高级篇5---FreeRTOS队列分析> 1.FreeRTOS队列 队列是基本的任务间通讯方式.能够在任务与任务间.中断和任务间传送信息.大多数情况下,队列用于具有线程保护的FIFO(先进先出)缓冲区:新数据放在队列的后面.当然.数据也能够放在队列的前面,在下一篇讲队列API函数时,会涉及到数据的存放位置. 图1-1:读写队列 图1-1所看到的的队列中.最多能保存5个项目,而且假设队列永远不会满.任务A使用API函数xQueueSend…
主要特点:协程(co-routine):任务间的中断通信机制              支持可抢占式/协作式任务调度 .FreeRTOS-MPU              内核对象可以动态或静态分配 . 所有任务间的通信与同步机制都是基于队列实现的(从堆分配实现) : OpenRTOS是FreeRTOS的商业版本 SAFERTOS: 安全认证版的FreeRTOS 任务管理:任务的创建.删除.挂起.恢复,查询/设定任务的优先级,任务的延时 队列管理:包括队列的创建,发送到队列头/尾,从队列中接收,…
(一)临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段 (二)FreeRTOS 与 临 界 段 代 码 保 护 有 关 的 函 数 有 4 个,两个是任务级的临界段代码保护,两个是中断级的临界段代码保护 1. 任务级临界段代码保护taskENTER_CRITICAL()和 taskEXIT_CRITICAL()是任务级的临界代码保护,一个是进入临界段,一个是退出临界段,这两个函数成对使用 void taskcritical_test(void) { ) { ) total_num…
临界段,用一句话概括就是一段在执行时不能被中断的代码段. 临界段被打断的情况,一个是系统调度,还有一个就是外部中断. 对临界段的保护就是对中断的开和关. 空闲任务与阻塞延时 xTicksToDelay是任务控制块的一个成员,用于记录任务需要延时的时间,单位为SysTick的中断周期. 多优先级 FreeRTOS中,数字优先级越小,逻辑优先级也越小. 空闲任务的优先级最低,为0.空闲任务一直处于就绪状态. 就绪列表是一个数组,里面存储的是就绪任务的TCB中的xStateListItem节点. 创建…
最近项目用到FreeRTOS,在实际调试中发现我自己的一段代码本来好用的(在无RTOS的情况下),但是当我在带RTOS的情况下把代码放到一个单独的任务中运行时我发现本来好用的代码莫名其妙的出现问题,有一定的概率会失败,考虑到应该是内核发生了调度导致代码中时序比较严格的地方被打断因此会出现时好时不好的现象,因此我对时序严格的地方调用了taskENTER_CRITICAL();和taskEXIT_CRITICAL();进行任务切换保护和中断但是结果还是一样,由此一来这个问题困扰了好久,我就开始怀疑f…
FreeRTOS系列第1篇---为什么选择FreeRTOS? 1.为什么学习RTOS? 作为基于ARM7.Cortex-M3硬件开发的嵌入式工程师,我一直反对使用RTOS.不仅因为不恰当的使用RTOS会给项目带来额外的稳定性风险,更重要的是我认为绝大多数基于ARM7.Cortex-M3硬件的项目,还没复杂到使用RTOS的地步,使用状态机就足够了. 对于现代的微处理器,特别是资源相对丰富ARM7.Cortex-M3硬件来说,RTOS占用的硬件资源已经越来越可以忽略.所以在当今环境下,我们无需担心R…
前言 本节主要讲解启动调度器. 这些都是与硬件相关,所以会分两条线走:posix和cortex m3. 原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/16076476.html 调度器的基本概念 调度器 调度器就是使用相关的调度算法来决定当前需要执行的任务. 调度器特点: 调度器可以区分就绪态任务和挂起任务. 调度器可以选择就绪态中的一个任务,然后激活它. 不同调度器之间最大的区别就是如何分配就绪态任务间的完成时间. 嵌入式实时操作系统的核心就是调度器…
前言 任务调度实现的两个核心: 调度器实现:(上一章节已描述调度基础) 任务切换实现. 接口层实现. 原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/16080202.html 6.1 任务切换基础 任务切换就是在就绪列表中寻找优先级最高的就绪任务,然后去执行该任务. 任务切换有两种方法: 手动:taskYIELD(),调用该API,强制触发任务切换.在中断中强制任务切换调用portYIELD_FROM_ISR(). 系统:系统节拍时钟中断,在该中断回调…
前言 本章节的时钟系统节拍主要分析FreeRTOS内核相关及北向接口层,南向接口层不分析. 本章节的系统延时主要分析任务系统延时实现. 原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/16085130.html 笔记手码. 相关代码仓库:李柱明 gitee 7.1 系统节拍配置 FreeRTOS的系统时钟节拍可以在配置文件FreeRTOSConfig.h里面设置:#define configTICK_RATE_HZ( ( TickType_t ) 100…
前言 本章主要讲解内部存储空间(RAM)的管理. 详细分析heap5方案. 参考: 李柱明博客 https://freertos.blog.csdn.net/article/details/51606068 C标准库的内存管理 C标准库的内存管理用到的API是malloc()和free(),但是不建议在RTOS中直接调用,因为: C标准库的内存管理实现可能比较大,不适合小型嵌入式RAM不足的设备. 可能会产生内存碎片,对于安全性要求高的嵌入式设备不适合. 这两个函数会使得链接器配置得复杂. 待补…
目录 前言 11.1 任务同步 11.2 信号量概念 11.3 二值信号量 11.3.1 二值信号量概念 11.3.2 优先级翻转 11.3.3 二值信号量运作机制 11.4 计数信号量 11.4.1 计数信号量概念 11.4.2 计数信号量运作 11.5 互斥量 11.5.1 互斥量概念 11.5.2 优先级继承机制概念 11.5.3 互斥量运作 11.6 递归互斥量 11.6.1 递归互斥量概念 11.6.2 递归互斥量运作 11.7 死锁概念 11.8 创建信号量 11.8.1 创建二值信…
上一次,我们简单的测试了FreeRTOS的基于IAR EWARM v6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建一个“FreeRTOSTestProject”项目文件夹,并在其下创建FreeRTOS.Libraries.Project.User文件夹. 与无操作系统的项目一样User中存放应用文件:Project中存放项目文件:Libraries中存放STM32F1xx标准库文件.而在FreeRTOS文件夹中存放…
临界段代码(critical sections),也叫临界区(critical region),是指那些必须完整连续运行,不可被打断的代码段.μC/OS-Ⅲ系统中存在大量临界段代码.采用两种方式对临界段代码进行保护:关闭中断.给调度器上锁.两种临界段代码保护功能均通过宏定义实现. 对于中断处理程序和任务都会访问的临界段代码,必须使用关中断的方式进行保护:对于仅由任务访问的临界段代码,可以采用关中断的方式也可以采用给调度器上锁的方式进行保护. 同时,μC/OS-Ⅲ系统还具有测量关闭中断时间.调度器…
任务函数原型: void ATaskFunction(void * pvParameters); 任务不允许从实现函数中返回.如果一个任务不再需要,可以用vTaskDelete()删除; 一个任务函数可以用来创建多个任务,各任务均是独立的执行实例,拥有属于自己的栈空间. 典型的任务函数结构: void ATaskFunction( void *pvParameters ) { /* 可以像普通函数一样定义变量.用这个函数创建的每个任务实例都有一个属于自己的iVarialbleExample变 量…
源:FreeRTOS初步认识 用了半天时间对FreeRTOS有了一个初步的认识,大概总结一下,其中混杂了系统实现和实际应用方面的问题. 现只是以应用为目的,实现方面待以后进一步研究. 1.FreeRTOS提供的功能包括:任务管理.时间管理.信号量.消息队列.内存管理.与平台有关的文件包含在portable文件夹中,主要是port.c, portmacro.h两个文件.平台无关的文件主要是:list.c(基本链表结构), queue.c(包括消息队列,信号量的实现), croutine.c,tas…
1. 多任务系统存在一个潜在的风险:资源管理. 2. 基本临界区:taskENTER_CRITICAL() 与 taskEXIT_CRITICAL() 或 taskENTER_CRITICAL_FROM_ISR( x ) 与 taskEXIT_CRITICAL_FROM_ISR() 之间的代码. 基本临界区可以保证对某个寄存器的访问不被中断. 3. 在基本临界区不会切换到其他任务. 中断可以执行,也允许嵌套,但只针对优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORI…
<一>临界段 临界段对象通过提供所有线程必须共享的对象来控制线程.只有拥有临界段对象的线程才能够访问保护的资源.在另一个线程可以访问该资源之前,前一线程必须释放临界段对象,一遍新的线程可以获取对对象的访问权. 注意:互斥量是内核对象,可以跨进程使用,而临界段对象只能在进程内的线程间使用(虽然互斥量可以用于进程内的线程,但线程间的通信,互斥量没有临界段对象高效). 与临界段有关的API函数 名称 作用 InitializeCriticalSection() 创建一个临界段 DeleteCriti…
@2019-04-09 [问题] 控制程序工作一段时间异常重启 [分析] 经定位分析重启原因为看门狗复位导致 [解决] 经排查发现在中断服务函数中使用了FreeRTOS的系统时延函数vTaskDelay,调试发现进入vTaskDelay函数后,会在函数xTaskResumeAll中进入临界段函数, 进而发现程序会卡死在下面代码处: ) { configASSERT( ( portNVIC_INT_CTRL_REG & portVECTACTIVE_MASK ) == ); } 上边代码表示发生一…