下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

内核
最新资讯
简化任何设备的身份验证云连接。
利用 CoAP 设计节能型云连接 IoT 解决方案。
11.0.0 版 FreeRTOS 内核简介:
FreeRTOS 路线图和代码贡献流程。
使用 FreeRTOS 实现 OPC-UA over TSN。

Altera Nios II FreeRTOS 演示
在 Cyclone III FPGA 上运行
[RTOS 移植]




此演示是在 EBV Elektronik 的 DBC3C40 参考设计基础上开发的, 基于 Altera Cyclone III FPGA。

可以使用免费的 Quartus II 和 Nios II 嵌入式设计套件的 web 版来配置和编译 FPGA 和软件。

请注意,此移植最初是使用设计工具第 9 版的 pre-version 编写的。 Calvin Ruben 确保项目处于最新状态,并且将版本发布到 FreeRTOS 交互式页面, 兼容 Altera 工具的 9.1 版和 10 版。 我谨代表 FreeRTOS 社区感谢 Calvin 所做的一切。


重要提示!Altera Nios II 演示使用说明

使用此 RTOS 移植之前,请阅读以下所有要点。

  1. 源代码组织
  2. 演示应用程序
  3. RTOS 配置和使用详情
另请参阅常见问题:我的应用程序未运行,问题可能出在哪里?

源代码组织

Nios II IDE 项目文件位于 FreeRTOS/Demo/NiosII_CycloneIII_DBC3C40_GCC 目录中。即使您的应用程序 将项目导入 IDE 工作区时要选择的目录。

下载的 FreeRTOS zip 文件包含所有移植文件和演示应用程序项目文件。因此,该文件所含文件 远超此演示所用的文件。请参阅源代码组织部分,获取已下载文件的描述以及关于创建新项目的信息 。


演示应用程序

创建项目目录结构

Nios II IDE 是 Eclipse 的定制版本。 使用 Eclipse 托管 make 构建的最简单方法是在包含 Eclipse 项目文件的目录下找到所需的构建文件(C 源文件、头文件和链接器脚本) 。 FreeRTOS 下载包含一个名为 CreateProjectDirectoryStructure.bat 的批处理文件, 该文件将所有需要的构建文件从 FreeRTOS 目录结构中的正常位置复制到 Eclipse 项目目录的子目录中。 该批处理文件位于 FreeRTOS/Demo/NiosII_CycloneIII_DBC3C40_GCC 目录,且必须在将项目导入 Nios II IDE 之前执行

从命令提示符或 Windows 资源管理器执行 CreateProjectDirectoryStructure.bat。 该文件无法 在 Eclipse 环境中成功执行。

注意!CreateProjectDirectoryStructure.bat 必须在演示项目导入 Nios II IDE 之前执行,否则 存储在项目中的包含路径将被销毁。


将项目导入 Nios II IDE 工作区

  1. 注意! CreateProjectDirectoryStructure.bat 必须在演示项目导入 Nios II IDE 之前 执行。 请参阅上文说明。

  2. 启动 Nios II IDE。 启动后,系统可能会提示您选择工作区位置。 您可以使用现有工作区, 或在方便的目录中创建新的工作区。

  3. 在 Nios II IDE 中,从 File 菜单中选择 Import...。

  4. 此时将显示一个对话框。 选择 "Existing Projects Into Workspace",然后单击 "Next"。

  5. 浏览并选择 FreeRTOS/Demo/NiosII_CycloneIII_DBC3C40_GCC 目录。 该目录包含两个项目:一个称为 RTOSDemo,另一个 称为 RTOSDemo_syslib。

  6. 在完成导入过程之前,请确保已选中两个项目,请勿勾选 "Copy projects into workspace" 复选框。


将 FreeRTOS 项目导入 Nios II IDE 工作区

演示应用程序硬件设置

DBC3C40 参考设计附带的 CD 包含实现不同 Nios II 配置的一系列 .sof 文件。 本页展示的演示 使用 TFT.sof 开发的。

演示使用内置在 DBC3C40 上的 LED。 控制 LED 的功能在 FreeRTOS/Demo/NiosII_CycloneIII_DBC3C40_GCC/RTOSDemo/ParTest/ParTest.c 中实现。 如果使用的硬件平台具有不同的 IO 配置,则可能需要修改这些函数 。

演示包括 “ComTest” 任务,一个任务传输 UART 上的字符,然后由另一个任务接收。 如果 收到的任何字符不符合顺序或存在丢失的情况,则会锁定错误。 必须将环回连接器安装到 UART 才能使机制运行——只需将 UART Rx 引脚连接到 UART Tx 引脚即可。


构建和执行演示应用程序

  1. 打开 main.c 并搜索以 "#error" 开头的行。 删除该行(提供了关于设置目录结构的说明, 适用于那些没有阅读说明而使用项目的用户)。
  • 使用编程和调试接口将目标硬件连接到主机——此时可使用 Altera USB Blaster。

  • 要构建项目,只需在 "Project" 菜单中选择 "Build All" 即可。 构建应用程序时不应存在错误 或警告(假设 #error 语句已被删除,且 CreateProjectDirectoryStructure.bat 已被执行)。 初始 构建将需要一些时间,因为它会生成整个系统库。

  • 需要创建启动配置才能启动调试会话。 启动配置只需创建一次,此后 只需单击 "Debug" 速度按钮即可启动调试会话。 要创建启动配置, 首先在 IDE 项目窗口中选择 “RTOSDemo” 项目,然后在 “Run” 菜单中选择 “Debug...”。

  • 在打开的对话框中,双击 “Nios II hardware” 以创建新配置。 配置 参数会自动设置。
  • 最后单击 "Debug" 以对 MCU 进行编程,并启动调试会话。
  • 第一次下载尝试会导致 Nios II IDE 自动打开 Quartus II 编程器,从中可以打开 .sof 文件并 将其编程到 FPGA 中。 下载 .sof 文件后,可以单击 debug 速度按钮 以重新运行调试启动配置。 FPGA 首次上电后才需进行此操作。


    设置启动配置


    功能

    演示应用程序会在启动 RTOS 调度器之前创建 43 个任务。这些任务主要包括 标准演示应用程序任务(请参阅演示应用程序 部分,了解各任务详情)。这些任务的唯一目的是测试 RTOS 内核移植并 演示如何使用各种 API 函数。

    除了标准演示任务外,还创建了以下任务和测试:

    • 检查任务

      每五秒钟执行一次。其主要功能是检查所有 标准演示任务是否仍在运行。 当检查任务每 5 秒钟切换一次 LED 7 时, 表示系统中所有任务正在无错误地执行。 如果切换速度增加到 500 毫秒,则表示 至少有一个任务报告了错误——该报错任务的名称会被写入 Nios II IDE 终端。 可以通过从 UART 中移除回环连接器来测试该机制, 此方式会故意生成错误。

    • 寄存器测试任务

      在检查每个寄存器是否包含预期值之前,寄存器测试任务用已知值填充 Nios II 寄存器。 包含意外值的寄存器表示上下文切换机制存在错误。 创建两个寄存器测试任务, 每组使用不同的寄存器值集。

    正确执行时,演示应用程序的表现如下:

    • LED 0、1 和 2 受标准“闪烁”任务控制。 各 LED 将以不同的固定频率切换。

    • LED 4 和 5 受 ComTest 任务控制,每传输一个字符,其中一个 LED 就会切换,而另一个 LED 会在 正确收到字符时切换。

    • LED 7 受检查任务控制(如上所述)。 每 5 秒切换一次。




    RTOS 配置和使用详情


    RTOS 移植特定配置

    此演示的特定配置项目包含在 FreeRTOS/Demo/NiosII_CycloneIII_DBC3C40_GCC/RTOSDemo/FreeRTOSConfig.h 中。 您 可编辑本文件中定义的常量,以适合您的应用程序。 尤其是使用 configTICK_RATE_HZ 设置 RTOS tick 的频率。 演示项目提供的数值 1000Hz 可用于测试 RTOS 内核功能,但速度超过了大部分应用程序的频率要求。 降低此值将提高效率。

    每个移植都会将 "BaseType_t" 定义为该处理器的最有效数据类型。 本移植将 BaseType_t 定义为长整型。

    请注意,vPortEndScheduler() 尚未实现。


    中断服务程序

    中断入口点包含在 RTOS 内核移植层中(在 FreeRTOS/Source/portable/GCC/Nios II/port_asm.S 内),并被编写为 与 Altera HAL 兼容。 这意味着可按照 Altera HAL 文档编写中断服务程序,并可 使用标准 HAL alt_irq_register() 函数进行注册。

    有时需要中断服务程序中断一个任务,但返回到另一个任务。 如果中断服务 程序导致任务解除阻塞,并且解除阻塞的任务具有比当前执行的任务更高的优先级,就会出现这种情况。 宏 portEND_SWITCHING_ISR() 允许中断服务程序请求上下文切换——如果不需要上下文切换,则传递 0 至 portEND_SWITCHING_ISR();如果 需要上下文切换,则传递非零值。

    请参阅 FreeRTOS/Demo/NiosII_CycloneIII_DBC3C40_GCC/RTOSDemo/serial.c,中断服务程序示例和 portEND_SWITCHING_ISR() 的使用示例。


    内存分配

    演示应用程序项目中内置 Source/Portable/MemMang/heap_2.c, 以提供 RTOS 内核所需的内存分配。 请参阅 API 文档的内存管理部分, 获取完整信息。




    Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.