掌握51单片机:Small RTOS操作系统实战指南

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本书由陈老编著,详细介绍了为51系列单片机量身打造的实时操作系统——Small RTOS。该系统基于著名嵌入式RTOS进行优化,提供任务调度、内存管理和中断处理等关键功能。书中包含"dp-51"示例程序,帮助开发者通过实践学习RTOS基础功能,如任务创建、通信和时间管理。Small RTOS让51单片机支持多任务环境,适用于智能家居、工业控制等项目,并通过任务调度和内存管理等特性提升系统响应速度和稳定性。 RTOS

1. 51单片机专用实时操作系统(RTOS)介绍

在现代嵌入式系统中,51单片机因其简单易用和功能强大而广泛应用于许多领域。为了满足实时性的要求,引入实时操作系统(RTOS)是非常重要的。RTOS的使用能够在提高系统稳定性和可维护性的同时,增强任务调度的灵活性和资源利用的效率。

实时操作系统的定义与重要性

实时操作系统是专门为了处理实时任务而设计的操作系统,它保证了系统能够及时响应外部事件并完成特定操作。RTOS对于那些对时间敏感的应用至关重要,如工业控制、医疗设备和汽车电子等领域,能够确保系统的稳定性和可靠性。

51单片机及其应用环境概述

51单片机是一种经典的8位微控制器,具有成本低、外围电路简单等优点,常用于需要较小计算能力的场合。51单片机通常配备有限的RAM和ROM空间,因此对操作系统的要求相对严格。

RTOS在51单片机中的作用与优势分析

RTOS在51单片机上的应用可以极大地提高系统的任务管理能力。它能为多任务环境提供有效的调度策略,支持优先级管理、中断处理和同步通信等重要功能。使用RTOS的优势在于它能更好地保证任务的实时性,同时简化应用程序的复杂性。

通过分析RTOS的引入背景、51单片机的应用环境和RTOS带来的优势,我们可以看到在51单片机上使用RTOS是实现复杂系统功能的有效方式。接下来,我们将深入探讨RTOS的内部工作机制,以及如何利用RTOS来优化任务调度和提高系统性能。

2. 任务调度和优先级管理

2.1 任务的基本概念与创建

2.1.1 任务状态的转换和管理

在实时操作系统中,任务(或线程)是操作系统调度的基本单位。一个任务通常拥有三种状态:就绪(Ready)、运行(Running)和阻塞(Blocked)。任务状态的转换如图2-1所示。

任务状态的转换通常由以下几种事件触发: - 创建任务 时,任务进入就绪状态。 - 任务调度器 选择运行任务,任务状态从就绪转为运行。 - 任务主动放弃CPU 或等待资源时,任务状态从运行转为就绪或阻塞。 - 资源满足条件 后,阻塞状态的任务被唤醒,变为就绪状态。 - 调度器决定 时,运行状态的任务被剥夺CPU,回到就绪状态,另一个就绪状态的任务获得CPU,开始运行。

2.1.2 任务优先级的分配原则

在RTOS中,任务优先级是任务调度的关键因素。优先级的分配需要遵循以下原则:

  • 重要性原则 :任务按照其在系统中的重要性分配优先级。越重要的任务,其优先级越高。
  • 响应时间原则 :需要快速响应的任务应分配较高的优先级。
  • 资源依赖原则 :依赖特定资源的任务可能需要更高的优先级以避免资源竞争导致的延迟。
  • 优先级逆置问题 :优先级逆置是指低优先级任务在等待被高优先级任务占用的资源时,可能会导致比它优先级低的任务得到执行,而它自身却无法执行。解决这一问题需要使用优先级继承或优先级天花板等策略。

任务优先级分配表如表2-1所示,展示了不同任务按照优先级分配的示例。

| 任务名称 | 优先级 | 描述 | |-----------|--------|------| | Task1 | 高 | 处理紧急事件 | | Task2 | 中 | 周期性数据采集 | | Task3 | 低 | 非实时性后台任务 |

任务优先级在创建时分配,并可在系统运行中动态调整。优先级的调整应谨慎进行,避免频繁改变造成系统的不稳定。

2.2 任务调度策略

2.2.1 循环调度与抢占式调度的区别

任务调度策略定义了任务如何在系统中获得执行机会,主要分为循环调度和抢占式调度两种:

  • 循环调度 :任务按照某种顺序依次执行。一旦一个任务执行完毕,或者由于某些原因被阻塞,调度器将切换到下一个任务。这种调度方式简单,但不适合实时性要求高的系统。

  • 抢占式调度 :允许任务在运行中被更高级别的任务抢占。这种调度方式提供了更好的实时性支持。RTOS通常采用抢占式调度策略。

抢占式调度的伪代码实现如下:

void preemptive_scheduler() {
    while (true) {
        for (each task in ready_queue) {
            if (task->priority > running_task->priority) {
                schedule(); // 调度函数用于切换任务上下文
            }
        }
    }
}

2.2.2 实时调度算法的原理与应用

实时调度算法是实时操作系统的核心,用于确保任务按时完成。常见的实时调度算法包括:

  • 速率单调调度(RM) :周期性任务的优先级与其执行频率成正比。
  • 最早截止时间优先(EDF) :非周期性任务的优先级基于任务的截止时间,截止时间越早,优先级越高。

这些算法在保证实时性方面各有优劣,选择合适的算法是确保系统稳定运行的关键。例如,EDF算法适用于动态变化的任务集合,而RM算法适用于可预测的任务集合。

2.3 优先级反转及其解决方案

2.3.1 优先级反转现象分析

优先级反转是当一个高优先级任务因为等待一个低优先级任务占用的资源而无法执行,而这个低优先级任务又被一个中等优先级任务抢占的情况。优先级反转会减慢高优先级任务的响应时间,影响系统的实时性。

优先级反转现象的示例: 1. 任务A(高优先级)需要资源R。 2. 资源R被任务C(低优先级)占用。 3. 任务B(中优先级)抢占任务C。 4. 任务A因资源R被占用而无法执行。

2.3.2 优先级天花板与优先级继承策略

为解决优先级反转问题,提出了两种策略:

  • 优先级天花板 :将资源R的优先级提升到所有使用该资源的任务中的最高优先级。这样,当低优先级任务占用该资源时,不会被中等优先级任务抢占。
  • 优先级继承 :当低优先级任务占用高优先级任务需要的资源时,临时提升该低优先级任务的优先级至高优先级任务的优先级。

优先级天花板的伪代码实现如下:

void priority Ceiling_protocol(Resource *resource) {
    resource->ceiling_priority = max_task_priority;
    if (resource->owner_task->priority < max_task_priority) {
        resource->owner_task->priority = max_task_priority;
    }
}

通过这些策略,优先级反转问题得到了有效控制,从而确保了系统的实时性能。

3. 高效的内存管理机制

3.1 内存管理的基本概念

3.1.1 静态与动态内存分配的区别

在编程中,内存分配是管理程序数据所需内存的过程。有两种常见的内存分配方式:静态和动态内存分配。静态内存分配在编译时进行,其地址和大小是固定的,而动态内存分配在程序运行时进行,可以调整内存大小。

静态内存分配通常用于全局变量和局部静态变量,这些变量的内存被分配在程序的全局数据区域。它的好处是速度快,因为地址在编译时已经确定,不需要额外的运行时开销。然而,这种方式的局限性在于分配的内存大小必须在编译时确定,且在程序的整个生命周期内保持不变。

相比之下,动态内存分配具有更大的灵活性。它允许程序根据运行时的需要,来分配和释放内存。在C语言中,动态内存是通过函数如 malloc free 来管理的。动态内存的缺点是管理不当可能会导致内存泄漏,指针悬挂等问题。

3.1.2 内存碎片的产生与解决方法

内存碎片是指在内存中分散的小块未使用空间,它阻碍了大块连续内存的形成,影响程序的进一步内存分配。内存碎片主要有两种:内部碎片和外部碎片。内部碎片发生在固定大小的内存块中,分配的内存大于实际需求时产生的空闲空间。外部碎片发生在内存块之间的空闲空间。

解决内存碎片的方法包括: - 使用内存池,预先分配固定大小的内存块,减少内存碎片的产生。 - 使用内存碎片整理技术,动态调整已分配内存的位置,以便形成大的连续内存区域。 - 采用特殊的内存分配算法,如伙伴系统,将内存分成不同大小的块,尽量满足内存请求。

3.2 内存池与内存堆的管理

3.2.1 内存池的设计与实现

内存池是一种预分配固定大小内存块的管理策略。在RTOS中,内存池能够保证快速和确定性的内存分配,这对于实时系统来说是极其重要的。内存池的设计需要考虑如何高效地分配和回收内存块,同时最小化内存碎片。

实现内存池的步骤通常包括: 1. 预先分配一大块内存。 2. 将内存分割成固定大小的块。 3. 设计一种算法或数据结构来跟踪哪些内存块是空闲的,哪些是已分配的。

一个简单内存池的实现示例代码如下:

#define BLOCK_SIZE 100
#define POOL_SIZE 1000

typedef struct {
    void *next;
} MemoryBlock;

static MemoryBlock pool[POOL_SIZE / BLOCK_SIZE];
static MemoryBlock *freeList = NULL;

void InitializeMemoryPool() {
    int i;
    MemoryBlock *p = pool;
    for (i = 0; i < POOL_SIZE / BLOCK_SIZE - 1; ++i) {
        p->next = p + 1;
        p = p->next;
    }
    p->next = NULL; // 最后一个内存块
    freeList = pool;
}

3.2.2 内存堆的管理机制和优化策略

内存堆管理负责动态分配的内存块,它通常用于不能预先知道内存大小的场景。堆的管理比内存池复杂,因为它需要处理各种大小的内存请求,且往往会产生更多的碎片。

在内存堆管理中,常见的优化策略包括: - 堆内存的快速分配 :使用快速的内存分配算法,例如最佳适配、最差适配或首次适配等。 - 内存块合并 :在释放内存块时,检查相邻的内存块是否空闲,并将其合并,以减少碎片。 - 延迟释放机制 :并不立即释放内存块,而是标记为可回收,直到堆内存紧缺时,再统一处理。 - 内存池与堆的结合使用 :对于频繁分配和释放的小块内存使用内存池管理,对于不规则的大块内存分配使用堆管理。

3.3 实时内存管理策略

3.3.1 实时内存分配与释放的特殊要求

实时内存管理需要特别考虑内存分配和释放的速度和确定性。在RTOS中,内存分配操作应该尽可能快,并且是可预测的。因此,对于实时系统,通常建议使用内存池管理来避免内存分配的不确定性。

此外,实时内存管理需要考虑以下几个特殊要求: - 时间确定性 :内存分配和释放的时间必须是可预测的,不能出现长时间的延迟。 - 内存碎片最小化 :避免内存碎片的产生,确保有足够的连续内存满足实时任务的需求。 - 内存泄漏防护 :提供机制监测和防止内存泄漏,确保系统的稳定运行。 - 内存访问保护 :防止任务非法访问内存,包括内存越界和非法释放。

3.3.2 内存管理与实时性的权衡

在实时系统中,内存管理的权衡体现在速度、确定性和资源利用率之间。为了提升实时性,系统设计者需要在不同的内存管理策略间做出选择。

  • 速度与确定性 :快速的内存分配通常意味着简化算法,这可能会牺牲资源利用率和灵活性。
  • 资源利用率 :精心设计的内存管理机制可以最大化内存利用率,但可能会引入不可预测的延迟。
  • 灵活性与复杂度 :更灵活的内存管理机制(如堆管理)能够处理各种大小的内存请求,但可能增加内存碎片和管理开销。

在实际应用中,设计者需要根据具体应用场景和RTOS的要求来做出权衡,选择最适合当前系统需求的内存管理策略。

4. 中断服务处理和实时性保障

4.1 中断系统的工作原理

中断系统是实时操作系统(RTOS)响应外部或内部事件的关键机制。当中断发生时,当前的任务可能会被暂时挂起,以便处理器能够处理更紧急的事件。为了理解如何有效管理这些事件,首先要深入分析中断系统的分类和优先级处理。

4.1.1 中断的分类与优先级

中断可以分为同步中断和异步中断。同步中断是由处理器执行指令直接产生的中断,而异步中断通常由外部事件(如I/O操作)产生。为了高效处理这些中断,它们需要被赋予不同的优先级。中断优先级的设置是确保关键任务能够及时响应的关键。通常情况下,关键硬件操作、定时器和紧急通信事件会分配较高的优先级。

在51单片机上,中断优先级是固定的,但通过软件可以间接控制中断的响应顺序。例如,可以关闭较高优先级的中断源,直到一个较低优先级的中断处理完毕。通过编程方式控制中断的开关状态,可以有效地控制中断处理的优先级。

EA = 0; // 关闭全局中断
// ...执行关键代码段...
EA = 1; // 开启全局中断

在上述代码段中,关闭和开启全局中断是管理中断优先级的一种常见方法。关闭全局中断可以防止中断处理程序打断当前执行的代码,特别是在需要原子操作时。这段代码后面,通常会跟随一些对共享资源的操作,以确保数据的一致性和完整性。

4.1.2 中断嵌套的处理与限制

在复杂的实时系统中,中断嵌套是常见的现象,即一个中断服务程序(ISR)的执行可能会被另一个更高优先级的中断打断。51单片机支持一定深度的中断嵌套,但需要注意的是,并不是所有中断都可以嵌套处理。

中断嵌套的处理需要考虑中断优先级和中断服务程序的设计。中断服务程序应该尽可能短小精悍,以减少对其他中断的阻塞时间。同时,软件设计者需要合理设置中断优先级,确保关键任务不会因为中断嵌套而产生过长的延迟。

4.2 实时性保障机制

实时性是RTOS的核心特征之一。为了保障系统的实时性,必须合理编写中断服务程序,并分析中断延迟。

4.2.1 中断服务程序的编写准则

中断服务程序(ISR)的编写准则主要包括以下几点:

  1. 最小化处理时间 :ISR应迅速完成其任务,避免执行复杂的逻辑,尤其是不需要的I/O操作。
  2. 避免阻塞操作 :ISR应避免执行可能阻塞的函数调用,比如对共享资源的操作应使用原子指令。
  3. 标志位机制 :ISR可以设置标志位通知主程序有中断发生,而将详细处理工作留给主程序完成。
  4. 优化中断延迟 :利用中断嵌套和优先级策略来减少响应时间和任务切换的延迟。

4.2.2 实时操作系统下的中断延迟分析

中断延迟包括中断响应时间和中断处理时间。中断响应时间是指从中断发生到ISR开始执行的时间,这包括硬件中断识别和软件中断处理入口建立的时间。中断处理时间是指执行ISR的时间。

为了减少中断延迟,可以采用以下措施:

  1. 优化中断向量表 :确保中断向量表放置在可以迅速访问的内存区域。
  2. 中断使能寄存器优化 :使用硬件寄存器来管理中断使能状态,减少软件中断使能的时间。
  3. 预设中断服务代码 :将ISR的主要逻辑代码预先编译好,减少中断处理时的代码执行时间。

4.3 中断与任务的协同工作

中断和任务之间必须协同工作,以确保系统的稳定性和实时性。中断驱动和轮询驱动是两种常见的设计模式。

4.3.1 中断驱动与轮询驱动的优缺点

中断驱动设计模式下,任务在等待事件时挂起,直到中断发生后由ISR唤醒。这种方法的优点在于响应时间短,因为处理器不需要不断地轮询检查事件,从而可以执行其他任务,节省资源。

轮询驱动模式中,任务不断检查事件是否发生,这种方法的优点是简单,但缺点是效率低下,尤其是在事件频率较低时会浪费大量CPU时间。

4.3.2 中断与任务间的数据交换与同步

中断和任务之间需要进行数据交换和同步,以便共享数据。这通常通过信号量、消息队列、标志位或邮箱等同步机制实现。这些机制可以确保数据的一致性和完整性,防止数据竞争和冲突。

// 示例:使用信号量进行数据交换同步
 семафор = xSemaphoreCreateBinary();

// 在中断服务程序中
xSemaphoreGiveFromISR(семафор);

// 在任务中
xSemaphoreTake(семафор, portMAX_DELAY);

在上述代码中,信号量被用于中断和任务之间的同步。在中断服务程序中,信号量被释放(给予),而在任务中,它被取得。使用信号量可以保证任务不会访问未准备好的数据。

总之,中断服务处理和实时性保障是RTOS中的关键组成部分。通过合理设计中断处理机制和任务调度策略,可以极大提升系统的响应速度和稳定性,从而为51单片机应用提供良好的实时性能支持。

5. 任务同步与通信机制

5.1 同步机制的基本原理

在多任务环境下,任务同步是指多个任务在运行时需要协调一致,以确保数据的一致性和防止竞态条件的出现。这是实时系统设计中不可或缺的一部分。

5.1.1 临界区的保护策略

保护临界区是为了确保在任意时刻,只有一个任务能够访问到共享资源。在51单片机等嵌入式系统中,常见的方法包括使用标志位、原子操作等。

一个典型的临界区代码段可能如下所示:

// 临界区代码段
critical_section {
    // 开启临界区标志位
    disable_interrupts();
    // 执行临界区任务
    access_shared_resource();
    // 关闭临界区标志位
    enable_interrupts();
}

5.1.2 互斥锁与信号量的应用对比

互斥锁(Mutex)和信号量(Semaphore)是实现任务同步的两种常见机制。互斥锁通常用于保护临界区,而信号量则用于管理资源的访问。

  • 互斥锁: 保证同一时间只有一个任务能够获取锁并访问临界区。
  • 信号量: 用于控制对一类资源的访问,信号量值表示可用资源的数量。

5.2 通信机制的基本原理

任务间的通信是通过通信机制实现的。通信机制允许任务之间交换数据或同步状态。

5.2.1 信号量与消息队列的实现机制

  • 信号量: 除了用于同步,信号量也可用于任务间通信。通过P(wait)和V(signal)操作进行通信。
  • 消息队列: 允许多个任务发送消息到队列,并由其他任务接收。消息队列可以包含任意类型和大小的消息。
// 信号量的基本用法
semaphore_wait(my_semaphore); // 等待信号量
// 执行相关任务
semaphore_signal(my_semaphore); // 释放信号量

// 消息队列的使用示例
message_queue_send(queue, message); // 发送消息到队列
message = message_queue_receive(queue); // 从队列接收消息

5.2.2 消息队列与邮箱的使用场景分析

  • 消息队列: 适用于数据量较大的消息传递,可以使用数组、链表或内存池等数据结构实现。
  • 邮箱: 通常用于轻量级通信,只传递指向消息的指针。

5.3 实际应用中的同步与通信策略

在实际应用中,选择合适的同步与通信策略至关重要。

5.3.1 多任务间的资源共享策略

设计资源共享策略时,必须考虑到实时性和系统资源的限制。考虑使用信号量来控制对共享资源的访问,利用互斥锁保护关键区域,并根据任务的执行情况动态调整资源的分配。

5.3.2 同步与通信机制在系统稳定性中的作用

良好的同步和通信机制可以显著提高系统的稳定性和可靠性。例如,在多任务环境中,使用消息队列可以有效地减少任务间的耦合,提高系统的可维护性和可扩展性。

综上所述,任务同步和通信机制是RTOS中不可或缺的部分,它们不仅保障了系统数据的一致性和实时性,还对提高系统的整体性能和稳定性起到了关键作用。在接下来的章节中,我们将继续探讨与这些主题相关的更为深入的内容。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本书由陈老编著,详细介绍了为51系列单片机量身打造的实时操作系统——Small RTOS。该系统基于著名嵌入式RTOS进行优化,提供任务调度、内存管理和中断处理等关键功能。书中包含"dp-51"示例程序,帮助开发者通过实践学习RTOS基础功能,如任务创建、通信和时间管理。Small RTOS让51单片机支持多任务环境,适用于智能家居、工业控制等项目,并通过任务调度和内存管理等特性提升系统响应速度和稳定性。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

Small RTOS(51) 1.20.3v 说明文件 编写动机: 就像在嵌入系统中使用C语言替代汇编一样,在嵌入系统中使用RTOS是大势所趋。原因主要是现在在大多数情况下编程效率比执行效率重要(单片机便宜嘛)。但纵观51RTOS,keil c51 所带的RTX Full 太大(6k多),且需要外部ram,又无源代码,很多时候不实用。RTX Tiny虽然小(900多字节),但是任务没有优先级和中断管理,也无源代码,也不太实用。而ucosII虽有源代码,但是它太大,又需要外部ram,所有函数又必须是重入函数,用在51这类小片内RAM的单片机上有点勉强。于是,我借鉴ucosII和RTX Tiny编写了Small RTOS 51,虽然它为51系列编写,但是它还是比较容易移植到其它CPU上。 与作者联系方法: 可以给[email protected](原[email protected])写信,或是在www.zlgmcu.com.cn上的论坛ARM与ucosII区提问(目前本人是版主)或是在www.c51bbs.com的论坛上提问(不推荐。c51bbs和21ic网名均为cmj)。 版本号定义方式: a.bc.d a:主版本号,一般重大改变时改变它。 bc:次便本号,一般功能增加时改变它。 d:同一版本的修订序号。 版本升级: 1.20.3版 2004年6月8日 修正Os_q.c的一个BUG,造成FIFO发送数据时,在队列中有大量数据且队列较大时,可能会出错。 1.20.2版 2004年2月4日 修正for Keil c51的Os_cpu_c.c的StkDelB函数的BUG,它会影响任务删除的正确执行。 1.20.1版 2004年2月4日 修改OSWait(K_SIG | K_TMO, x) 只能通过信号唤醒的bug。 1.20.0版 2003年8月3日 支持任务动态建立与删除。函数功能向一般的RTOS靠拢。支持C51的重入函数(用关键字reentrant定义的函数)。支持动态内存分配(使用动态内存分配的任务必须使用重入栈)。 1.12.1版 2003年2月5日 修正OS_MAX_TASKS为8、16时的bug。同时修正一些小bug。 1.12.0版 2003年1月24日 OS_MAX_TASKS就是用户任务数量。同时修正一些小bug。 1.11.0版 2002年12月2日 各个任务具有自己的关中断计数器,不在互相影响(这意味着如果一个任务在任务放弃CPU前关了中断,当它再次进入运行态时中断还是关的)。优先级最低的任务作为系统保留任务不再需要用户编写,同时节约一些内存。增加一些注释。更正在Keil C51下Memory Model为非Small 模式的Bug。 1.10.5版 2002年10月26日 更正许多小Bug。 1.10.4版 2002年10月6日 合并Os_cpu_a.asm和OS_CPU_A_task16.ASM。统一了一下代码风格 1.10.3版 2002年9月16日 修改了Os_cpu_a.asm和OS_CPU_A_task16.ASM的LoadCtx代码使之执行更快,代码更小 1.10.2版 2002年9月9日 更正OSWait()的Bug,在极端情况下,这个Bug可能造成可能锁死任务。 修改OSQIntPost()的Keil C51特殊代码,它会造成阅读障碍。 1.10.1版 2002年9月4日 更正OSTimeTick的Bug,它在keil c51中不会有问题,但移植的其它系统可能出错。 1.10版 2002年9月1日 增加Small RTOS 对消息队列(简化的)和信号量的支持;改变了开关中断的方式;增加可移植的变量定义;修正一些Bug。 1.00版 2002年6月20日 使用户可以进行更多的配置,可以禁止中断管理,51系列支持软的非屏蔽中断,并调整目录结构等. 0.60版 2002年5月10日 修改OS_CORE.c使之在keil c51可以重入。不再需要禁止覆盖分析。 0.52版
编辑推荐 本书主要特点: 分为原理篇和应用篇,原理与实践相结合,两篇相对独立,又紧密联系。 原理篇以分析源码为特色,深入浅出地介绍RTOS的基本概念以及Small RTOS51的工作原理。 应用篇以DP-51单片综合仿真实验仪为硬件平台,通过对单片机常用和热门外围器件实用驱动程序的分析,详细介绍基于Small RTOS51的编程方法,以及如何为这些外围器件编写中间件,并给出一个完整的例子,让读者全面掌握基于Small RTOS51的编程方法,体会了RTOS下编程的优点。 内容简介 Small RTOS51是为51系列单片机而编写的。它是完全免费的、源代码公开的多任务实时操作系统。它可在无任何外部数据存储器的单片80C51系统上运行,并且是可移植的。全书分两部分。第一部分为基础篇,介绍Small RTOS51和一些基本概念,并详细分析Small RTOS51的工作原理。第二部分为应用篇,给出部分常用硬件在Small RTOS51下驱动程序的源代码。这些源代码在DP—51单片机仿真实验仪上全部调试通过,且只要经过很少的改动,或是不改动,就可以在其他环境下使用。应用篇还通过对这些源代码的分析,让读者理解基于RTOS的编程方法,并给出完整的例子让读者全面掌握基于RTOS的编程方法。 本书可以作为高等院校相关专业的课程教材、实验参考资料或课外读物,对嵌入工应用开发人员也有重要的参考价值。 目录 第一部分 原理篇 第0章 绪论 第1章 Small RTOS51简介 1.1 Small RTOS51的特点 1.2 Small RTOS51的运行条件 1.3 Small RTOS51的存储器需求 1.4 Small RTOS51的任务堆栈的计算 1.5 关于可重入功能 1.6 关于C51的库函数 1.7 关于51系列单片机派生类型的多数据指针和数学单元 1.8 关于51系列单片机的寄存器段 1.9 关于局部变量 第2章 基本概念 2.1 嵌入式系统 2.2 实时系统 2.3 前、后台系统 2.4 操作系统 2.5 实时操作系统 2.6 代码的临界区 2.7 资源 2.8 共享资源 2.9 任务 2.10 任务切换 2.11 内核 2.12 调度 2.13 非占先式内核 2.14 占先式内核 2.15 可重入性 2.16 任务优先级 2.17 信号量 2.18 死锁 2.19 消息队列 2.20 中断 2.21 时钟节拍 第3章 一个简单的例子 3.1 Small RTOS51的安装及目录结构 3.2 例子简介 3.3 Config、h、Os_cfg、h和Os_cpu.h 3.4 与编程器无关的数据类型 3.5 OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL() 3.6 main()函数 3.7 建立任务 3.8 删除任务 3.9 用户任务 3.10 软非屏蔽中断 3.11 中断服务程序的编写 3.12 Os_cpu.h可改变的其他内容 3.13 Small RTOS51的其他注意事项 第4章 任务管理—核心的核心 4.1 临界区 4.2 任务 4.3 任务状态 4.4 与任务相关的数据结构 4.5 任务调度 4.6 Small RTOS51中的中断处理 4.7 时钟节拍 4.8 Small RTOS51初始化和启动 4.9 建立任务 4.10 任务堆栈 4.11 删除任务 4.12 时间服务及任务的挂起和恢复 4.13 获取当前Small RTOS51的版本号 4.14 OSInt…()函数 第5章 如何切换任务 5.1 CPU可以执行多个任务的原因 5.2 CPU怎样运行才能执行多个任务 5.3 何时进行任务切换 5.4 Small RTOS51任务切换时的程序框图 5.5 数组OSTsakStackBotton[]和Small RTOS51的堆栈结构 5.6 变量OSFastSwap 5.7 常量数值OSMapTb[] 5.8 软非屏蔽中断的堆栈SP2[] 5.9 中断切换函数OSIntCtxSw()OSIntCtxSw() 5.10 任务主动放弃CPU-OS_TASK_SW() 5.11 堆栈变换函数C_OSCtxSw() 5.12 恢复新任务环境LoadCtx() 5.13 优先级最低的任务OSIdle() 5.14 Small RTOS51初始化函数OSStart() 5.15 系统时钟节拍中断OSTickISR() 第6章 任务之间的通信和同步之信号量 6.1 概述 6.2 使Keil C51函数具有重入性的特殊方法 6.3 数据结构 6.4 IN_OS_SEM_CHK宏及相关代码 6.5 初始化一个信号量 6.6 等待一个信号量 6.7 发送一个信号量 6.8 无等待地请求一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值