1.前言 嵌入式实时操作系统需要对整个系统环境产生的事件作出响应.可以采用中断方式也可以采用轮询方式来进行处理.如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好. 注:必须说明的是,只有以”FromISR”或”FROM_ISR”结束的API 函数或宏才可以在中断服务例程中. 2. 延迟中断处理 图 利用二值信号量实现中断与任务同步 延迟中断的实现 (1)通过在中断处理中增加二值信号量,中断发生时解除任务的阻塞状态,让任务得以执行,相当于让任务与中断同步: (2)这样中断处理例程中…
1.前言 最新的 FreeRTOS 移植中允许中断嵌套.中断嵌套需要在 FreeRTOSConfig.h 中设置configKERNEL_INTERRUPT_PRIORITY 和configMAX_SYSCALL_INTERRUPT_PRIORITY 2.控制中断嵌套的常量 常量 描述 configKERNEL_INTERRUPT_PRIORITY 设置系统心跳时钟的中断优先级.如 果 在 移 植 中 没 有 使 用 常 量configMAX_SYSCALL_INTERRUPT_PRIORITY…
1.前言 访问一个被多任务共享,或是被任务与中断共享的资源时,需要采用”互斥”技术以保证数据在任何时候都保持一致性.这样做的目的是要确保任务从开始访问资源就具有排它性,直至这个资源又恢复到完整状态 FreeRTOS 提供了多种特性用以实现互斥,但是最好的互斥方法(如果可能的话,任何时候都当如此)还是通过精心设计应用程序,尽量不要共享资源,或者是每个资源都通过单任务访问. 2.本章内容 本章期望让读者了解以下内容: 为什么,以及在什么时候有必要进行资源管理与控制. 什么是临界区. 互斥是什么…
1.前言 不同的嵌入式系统具有不同的内存配置和时间要求.所以单一的内存分配算法只可能适合部分应用程序. FreeRTOS 将内存分配作为可移植层面(相对于基本的内核代码部分而言).这使得不同的应用程序可以提供适合自身的具体实现. 本章期望让读者了解以下事情: FreeRTOS 在什么时候分配内存. FreeRTOS 提供的三种内存分配方案范例 2.FreeRTOS内存管理概述 (1)当内核请求内存时,其调用pvPortMalloc()而不是直接调用malloc():当释放内存时,调用vPortF…
1.前言 多任务系统中存在一种潜在的风险.当一个任务在使用某个资源的过程中,即还没有完全结束对资源的访问时,便被切出运行态,使得资源处于非一致,不完整的状态 2.并发抢占导致错误的场景 (1)访问外设 如两个任务并发访问LCD (2)读-改-写操作 ARM7下的赋值操作被编译成多条汇编语言 /* The C code being compiled. */ : PORTA |= 0x01; /* The assembly code produced. */ 0x00000264 481C LDR…
1.前言 消息队列不仅可以用于事件通信,还可以用来传递数据 2.实例说明消息队列的执行过程 3.主要API API名称 说明 参数 返回值 xQueueSendFromISR()完全等同于 xQueueSendToBackFromISR()   xQueue 目标队列的句柄.这个句柄即是调用 xQueueCreate()创建该队列时的返回值. pvItemToQueue 发送数据的指针.其指向将要复制到目标队列中的数据单元.由于在创建队列时设置了队列中数据单元的长度,所以会从该指针指向的空间复制…
1.前言 在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题. 因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢失. 为此引入多值信号量来处理这个问题. 2.二值信号量和多值信号量的原理图 二值信号量的处理过程如下图所示: 多值信号量的原理图: 3.计数信号量的典型用法 3.1 事件计数 事件发生时信号量计数值加1,延迟处理任务每处理一个任务信号量计数值减1,信号量的计数值是已发生的事件数与已处理的事件数之间…
1.前言 本章主要是为刚接触FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出侦测上 2.printf-stdarg.c 当调用标准C 库函数时,栈空间使用量可能会急剧上升,特别是IO 与字符串处理函数,比如sprintf().在FreeRTOS 下载包中有一个名为printf-stdarg.c 的文件. 这个文件实现了一个栈效率优化版的小型sprintf(),可以用来代替标准C 库函数版本.在大多数情况下,这样做可以使得调用sprintf()及相关函…
1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性.本章主要讲述任务相关特性及调度相关的知识. 2. 任务的总体特点 任务的状态 (1)任务有两个状态,运行态和非运行态 (2)任务由非运行态转入运行态为切入,相反为切出 设置优先级 (1)最高优先级在FreeRTOSConfig.h 中 设 定 的 编 译 时 配 置 常 量configMAX_PRIORITIES中进行设置.注:FreeRTOS 本身并没有限定这个常量的最大值,但这个值越大,则内核花销的内存空间就越多.建议将此常量设…
1.前言 freeRTOS中所有任务的通信和同步机制都是基于队列来实现. 2.队列的特点 图 队列的读写操作 队列的数据存储 (1)队列可以保存有限个具有确定长度的数据单元,队列可以保存的最大单元数目称为队列的深度: (2)队列创建时需要设定队列深度和每个单元的大小: (3)队列先进先出 多任务存取 队列是内核中具有独立权限的对象,不属于任何任务,可以有多个任务进行读写 读队列阻塞 (1)任务读取队列数据时可以指定一个阻塞超时时间: (2)未超过阻塞超时时间,队列为空,任务将保持阻塞状态: (3…