1.CPU移植要求: 1) 处理器有对应的能产生可重入代码的C编译器2) 处理器支持中断且能提供周期性的中断(通常介于10到1000Hz之间)。 3) 可以关中断和开中断4) 处理器支持存储和载入堆栈指针、 CPU寄存器、堆栈的指令。5) 处理器有足够的RAM用于存放uC/OS-III的变量、 结构 Read More
一个处理器,在不断地分配和释放内存的过程中,一整块连续的内存被分散为很多离散的小块内存, 这些叫做内存碎片, 内存碎片过多会导致内存的浪费。 uC/OS 的内存管理机制就是为了尽量减少内存碎片。大致的思路是一次性取出一个较大 的内存分区,把这个内存分区分成若干个内存块,然后将内存块逐个串成单向链表。 Read More
等待的多个内核对象是指多值信号量和消息队列的任意组合 。 如果想要使用“等待多个内核对象”,就必须事先使能“等待多个内核对象”。“等待多个内核对象” 的使能位于“os_cfg.h”。 1.OSPendMulti () OSPendMulti () 函数用于等待多个内核对象(多值信号量或消息队列)。 Read More
任务消息队列跟任务信号量一样,均隶属于某一个特定任务, 不需单独创建,任务在则在, 只有该任务才可以接收这个任务消息队列的消息,其他任务只能给这个任务消息队列发送消息, 却不能接收。任务消息队列与(普通)消息队列极其相似,只是任务消息队列已隶属于一个特定任务, 所以它不具有等待列表, 省去了等待任务 Read More
多值信号量和和互斥信号量主要用来标志事件是否发生和协调资源的访问。如果要给资源赋予内容进行传递, 信号量就力有所不及了。这时候就需要用到 uC/OS 操作系统的另一个内核机制了,那就是消息队列。 2.原理 如果想要使用消息队列,就必须事先使能消息队列。 消息队列的使能位于“os_cfg.h”。 消息 Read More
1.使用消息队列 消息队列函数: 任务中消息队列函数: 2.客户端和服务器端 错误管理任务管理其它任务或ISR发给它的错误情况。 3.消息队列的组成 消息由四个变量组成:指向下一条消息的指针、用于表明该消息所指向数据的大小的变量、 存放消息最后一次被提交的时间戳的变量、消息中包含一个指向实际数据的指 Read More
1.任务的消息队列 uC/OS-III在任务中内建了一个消息队列。用户可以直接发送消息给任务而不通过外部消息队列。 这个特性不仅简化了代码, 还提供了效率。每个任务都内建一个消息队列。 uC/OS-III中与任务消息队列相关的服务都是以OSTask???()开头的。 设置OS_CFG.H中的OS_C Read More
信号量和消息队列均是单独的内核对象,是独立于任务存在的。 任务信号量 仅发布给一个特定任务 。任务消息队列 可以发布给多个任务。 任务信号量伴随任务存在,只要创建了任务,其任务信号量就是该任务的一个数据成员,任务信号量的数据成员被包含在任务控制块里。 1.OSTaskSemPost () OSTas Read More
事件标志组,顾名思义,就是若干个事件标志的组合,代表若干个事件是否发生,通常用于集合两个或两个以上事件的状态 。 1.如果想要使用事件标志组,就必须事先使能事件标志组。消息队列的使能位于“os_cfg.h”。 2.OSFlagCreate () 要使用 uC/OS 的事件标志组必须先声明和创建事件标 Read More
事件标志组 1.当任务要与多个事件同步时可以使用事件标志。若其中的任意一个事件发生时任务被就绪, 叫做逻辑或(OR)。若所有的事件都发生时任务被就绪,叫做逻辑与( AND)。 2.用户可以创建任意个事件标志组( 限制于RAM)。 uC/OS-III中与事件标志组相关的函数都是以 OSFlag???( Read More
1.经常通过发送信号量实现同步。每个任务都有内建的信号量,通过任务内建的信号量不仅可以简化信号量通信的代码而且更加有效。 与任务内建的信号量相关的函数都是以 OSTaskSem???()为前缀的。相关的代码都在OS_TASK.C中。 2.挂起(等待)任务信号量 当任务被创建时,也会内建一个信号量,信 Read More
互斥信号量是 uC/OS 操作系统的一个内核对象, 与多值信号量非常相似,但它是二值的,只能是 0 或 1,所以也叫二值信号量, 主要用于保护资源。 1.如果想要使用互斥信号量,就必须事先使能互斥信号量。 互斥信号量的使能位于“os_cfg.h”。 2.OSMutexCreate () 要使用 uC Read More
多值信号量是 uC/OS 操作系统的一个内核对象, 主要用于标志事件的发生和共享资源管理。 1.如果想要使用多值信号量,就必须事先使能多值信号量。 多值信号量的使能位于“os_cfg.h”。 2.OSSemCreate () 要使用 uC/OS 的多值信号量必须先声明和创建多值信号量,调用 OSSe Read More
1.信号量 信号量是一个“ 锁定机构”,代码需要获得钥匙才可以访问共享资源。占用该资源的任务不再使用该资源并释放资源时,其它任务才能够访问这个资源。 通常有两种类型的信号量:二值信号量和多值信号量。 (1).二值信号量二值信号量的值只能是 0或 1. (2).多值信号量 多值信号量计数值可以是 0到 Read More
1.大部分独占资源的方法都是创建临界段:1) 关中断方式2) 锁调度器方式3) 信号量方式4) mutex方式 2.独占共享资源的最快和最简单方法是关中断 然而,关/开中断是和CPU相关的操作,其相关代码被放在与CPU相关的文件中(见 CPU.H)。 uC/OS-III中与 CPU相关的模块叫做uC Read More
1.可以修改IP,或同时修改CS和IP的指令系统称为转移指令。 转移指令就是可以控制CPU执行内存中某处代码的指令。 8086CPU转移行为有以下几类: (1).只修改IP,称为段内转移,如:jmp ax. (2).同时修改CS和IP,称为段间转移,,比如:jmp 1000:0. 段内转移又分为:短 Read More
1.调度的内部实现通过这两个函数完成调度功能: OSSched()和OSIntExit()。OSSched()在任务级被调用, OSIntExit()在中断级被调用。这两个函数都在OS_CORE.C中定义。 调度所需用的两个数据结构。位映像表和就绪列表: (1).OSSched() (2).OSIn Read More
1.计算机是进行数据处理、运算的机器,在机器指令中,必须明确给以隐含的说明,否则计算机就无法工作。 (1).处理数据的位置 (2).处理数据的长度 2.使用描述性的符号reg(表示一个寄存器)和sreg(表示一个段寄存器) (1).reg集合包括: ax,bx,cx,dx,ah,al,bh,bl,c Read More
在 uC/OS 系统中,中断相当于一个优先级最高的任务。中断一般用于处理比较紧急的事件, 而且只做简单处理,例如标记该事件,带退出中断后再做详细处理。在使用 uC/OS系统时, 一般建议使用信号量、 消息或事件标志组等标志中断的发生,将这些内核对象发布给处理任务,处理任务再做详细处理。 1.在使用 Read More
任务等待多个对象。然而, uC/OS-III只允许同时等待多个信号量和消息队列。换句话说,不能同时等待多个事件标志组或mutex。 1.任务可以同时等待多个信号量和消息队列。 任务接收到一个信号量或消息就会被就绪。 任务通过调用OSPendMulti()等待多个对象,并可使设置等待时限。这个时限对应 Read More
内存管理 uC/OS-III可以获得连续的内存块。内存块大小可以相同, 所有的内存分 区包含了整数个内存块。 在特定的时间执行内存块的分配和释放。内存分 区以内存块数组的形式被静态分配的。如果分配后不被释放,也可以调用 malloc()动态分配。 不要在嵌入式系统中使用malloc()和free() Read More
同步 uC/OS-III中用于同步的两种机制:信号量和事件标志组 。 1.信号量 信号量最初用于控制共享资源的访问。信号量可用于ISR与任务间、任务与任务间的同步。 “ N”表示信号量可以被累计。初始化时也可以设置为非0值,表明已经有事件发生。ISR或任务可以提交信号量多次,信号量计数值会记录该信号 Read More
消息传递 有些情况下任务或ISR与另一个任务间进行通信,这种信息交换叫做作业间的通信。 可以有两种方法实现这种通信: 全局变量、 发送消息。 1.果使用全局变量,任务或ISR就须确保它独占该变量。如果防止被ISR嵌套, 那么就只有关中断这种方法来保护这个变量。 如果是任务间共享该变量, 那么可以通过 Read More
1.共享资源可以是:变量(静态的或全局的)、结构体、内存空间、 I/O等。 多个任务可能会同时要求占用资源: 内存空间、 全局变量、 指针、缓冲区、 列表、 环形缓冲区等。 通过共享资源, 任务间通信将会比较简单。当然,避免任务间的竞争和防止资源被破坏是非常重要的 。 2.大部分独占资源的方法都是创 Read More
1.当uC/OS-III转向执行另一个任务的时候,它保存了当前任务的CPU寄存器到堆栈。并从新任务的的堆栈中CPU寄存器载入CPU。这个过程叫做上下文切换。 上下文切换需要一些开支。 CPU的寄存器越多, 开支越大。 上下文切换部分的代码是移植uC/OS-III时需编写的。该部分代码要适用于处理器。 Read More
1.当任务等待信号量、 mutex、事件标志组、消息队列时,该任务会被放入挂起队列。 挂起队列是一个OS_PEND_LIST类型的数据结构,它包含了三部分内容。 .NbrEntries 挂起队列中有几个任务。.TailPtr 指向队列的尾部(最低优先级的任务).HeadPtr 指向队列的首部(最高优 Read More
调度器,决定了任务的运行顺序。 uC/OS-III是一个可抢占的, 基于优先级的内核。根据其重要性每个任务都被分配了一个优先级。uC/OS-III支持多个任务拥有相同的优先级。 1.抢占式调度 uC/OS-III通过两种方法处理中断提交的事件:直接提交或延迟提交。 从调度的角度看, 这两种方法产生的 Read More
1.CPU的中断处理 理器通常有多个中断源。 例如, UART中断、 DMA中断、 ADC中断、定时器中断等。 2.中断器件标志中断处理器,然后中断处理器将优先级最高的中断提交给CPU。 现在的中断控制器都是智能的,允许定义中断优先级,记住哪些中断还处于挂起状态。在大多数情况下,中断控制器会直接提供 Read More
1.软件定时器是 uC/OS 操作系统的一个内核对象,软件定时器是基于时钟节拍和系统管理创建的软件性定时器,理论上可以创建无限多个,但精准度肯定比硬件定时稍逊一筹。 2.软件定时器启动之后是由软件定时器任务 OS_TmrTask() 统一管理,在创建软件定时器之前必须先使能软件定时器和配置软件定时器 Read More
1.软件定时器管理 uC/OS-III提供了软件定时器服务(相关代码在OS_TMR.C中)。当设置OS_CFG.H中的OS_CFG_TMR_EN为1时软件定时器服务被使能。 2.uC/OS-III 定时器的分辨率决定于时基频率,也就是变量OS_CFG_TMR_TASK_RATE_HZ的值,它是以 H Read More
1.时间管理 uC/OS-III为用户提供了与时间管理相关的服务。 在uC/OS-III中设置了能提供时基中断的中断源。该中断源提供 10Hz 到 1000Hz 之间的中断(需设置OS_CFG_APP.H中的 OS_CFG_TICK_RATE_HZ为中断源提供的频率)。然而,频率越高, CPU额外的 Read More
1.STM32 的芯片中具有 bxCAN 控制器 (Basic Extended CAN), 它支持 CAN 协议 2.0A 和2.0B 标准。 2.外设中具有 3 个发送邮箱,发送报文的优先级可以使用软件控制,还可以记录发送的时间;具有 2 个 3 级深度的接收 FIFO,可使用过滤功能只接 收或 Read More
1.帧的种类 通信是通过以下 5 种类型的帧进行的。 • 数据帧 • 遥控帧 • 错误帧 • 过载帧 • 帧间隔 另外, 数据帧和遥控帧有标准格式和扩展格式两种格式。标准格式有 11 个位的标识符(Identifier: 以下称 ID),扩展格式有 29 个位的 ID。 2.数据帧 数据帧由 7 个 Read More
1.uC/OS-III提供很多服务可以把任务添加到就绪列表中。 最明显的服务是OSTaskCreate(), 它通常创建准备运行的任务并将任务放入就绪列表中。如图6-6所示,就绪列表中该优先级中已经有两个任务了。OSTaskCreate()就会将这个任务插入到列表的未部。 ( 1).在调用OSTas Read More
准备好运行的任务被放到就绪列表中, 如图6-1。就绪列表是一个数组( OSRdyList[]),它一共有OS_CFG_PRIO_MAX条记录,记录的数据类型为OS_RDY_LIST(见OS.H)。就绪列表中的每条记录都包含了三个变量 .Entries 、 .TailPtr 、 .HeadPtr。 . Read More
准备运行的任务被放置于就绪列表中。就绪列表包括2个部分:位映像组包含了优先级信息,一个表包含了所有指向就绪任务的指针。 1.优先级 图6-1到6-3显示了优先级的位映像组。它的宽度取决于CPU_DATA的数据类型( 见CPU.H), 它可以是8位、 16位、 32位。根据处理器相应地设定。 uC/O Read More
1.OSTaskCreate () 要使用 uC/OS 的任务必须先声明任务控制块和创建任务,调用 OSTaskCreate () 函数可以创建一个任务。 2.OSTaskSuspend () OSTaskSuspend () 函数用于挂起一个任务,令任务暂停运行。 任务可以多次调用 OSTaskS Read More
1.[bx+idata] 我们用[bx]的方式来指明一个内存单元,还可以用一种更灵活的方式来指明内存单元:[bx+idata]表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)。 如:mov ax,[bx+200] 数学化的描述为:(a... Read More
1.and和or指令 (1).and指令:逻辑与指令,按位进行与运算。 (2).or指令:逻辑或指令,按位进行或运算。 2.ASCII码 如果我们要显示“a”,就要给显卡提供“a”的ASCII码,方法是将“a”的ASCII码写入显存。 3.以字符形式给出的数据 汇编中... Read More
1.将数据、栈、代码存入到一个段中使得程序显得混乱。 2.如果数据、栈、代码需要的空间超过64KB,就不能放在一段中(一个段的容量不能大于64KB(8086CPU的16位的,段的大小2^16Byte))。 3.可以通过定义代码段的方法来定义多个段,然后再在段里面定义需... Read More