下载 FreeRTOS
 

出色的 RTOS & 嵌入式软件

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

Tern E-Engine 80x186 RTOS 移植
[嵌入式以太网示例]



此页面描述了 Tern 系列基于 x186 的控制器的 FreeRTOS 移植,预配置演示应用程序针对 Tern E-Engine 控制器 (以太网引擎) (如果您想使用其他开发板,请参阅此处说明 )。 E-Engine 控制板包括一个基于 i2chip 的 WizNET 嵌入式 TCP/IP 处理器,演示应用程序通过一个(当前)简单的 HTTP 接口使用该处理器 显示 RTOS 状态信息。

演示应用程序仅限于小型内存模型,以便使用 Paradigm C/C++ 编译器的评估版 - 随控制器套件交付的 Tern 版,进行构建和 调试。

E-Engine 通过内存映射接口连接 i2chip。 单独的 FreeRTOS 演示应用程序 演示了使用 ARM7 处理器通过 I2C 接口与同一 TCP/IP 协处理器连接。

请注意,经 Tern Inc 许可,文件 socket.c、i2chip_hw.c 与相关标头和库包含在内。 这些文件的版权归 Tern Inc 所有, 不受修改后的 GPL 覆盖。

Paradigm C/C++ 第 7 版用户请注意: 第 7 版使用了略微不同的堆栈框架,因此需要对 RTOS 内核移植文件 文件进行一些修改。 Dave Lyneham 慷慨地提供了一个包含必要更改的项目,以及 readme.txt 文件,以解释为什么需要这些更改。 文件可以从 FreeRTOS Interactive x86 论坛获取。 感谢 Dave!


重要提示!Tern Inc. 80x186 RTOS 演示使用说明

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

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

源代码组织

FreeRTOS 下载文件包含所有 FreeRTOS 移植的源代码,因此包含的文件多于此演示使用的文件。 请参阅源代码组织部分,获取 下载文件的描述和有关创建新项目的信息。

可以使用预配置的 Paradigm Tern 版编译器项目文件构建 E-Engine 演示应用程序,该文件名为 RTOSDemo.ide ,位于 FreeRTOS/Demo/WizNET_DEMO_TERN_186 目录。


演示应用程序

演示应用程序设置

将 E-Engine 控制器板连接到运行 Web 浏览器的计算机,可直接使用点对点(交叉) 电缆完成,或使用标准以太网电缆通过集线器/路由器完成。

演示使用的 IP 地址由 FreeRTOS/Demo/WizNET_DEMO_TERN_186/HTTPTask.c 顶部定义的常量 "ucIPAddress" 设置。 Web 浏览器计算机和控制器板使用的 IP 地址必须兼容。 为此,可以将二者 IP 地址中的前三个八位元组设置成相同的值。 例如,如果运行 Web 浏览器的计算机所用 IP 地址是 192.168.100.1,那么控制器板的 IP 地址可以使用 192.168.100.2 到 192.168.100.254 范围内的任何地址 网络上已经存在的任何地址)。

演示使用的 MAC 地址由同一文件中的常量 “ucMacAddress” 设置。 必须确保所配置的 MAC 地址在控制器板所连接的网络上是唯一的。

演示应用程序包含通过串行端口发送和接收字符的任务。 一个任务发送的字符 需要另一个任务来接收,如果任何字符被遗漏或接收顺序错误,则标记错误情况。 串行端口上 需要环回连接器才能运行此机制。 串行端口测试被预配置为在控制器板上使用 COM2,因为 调试器接口默认使用 COM1。 要将 COM2 Tx 引脚循环到 E-Engine 板上的 COM2 Rx 引脚,最简单的方法是 在 COM2 连接器的引脚 2 和 3 上放置跳线,使两个引脚短接在一起。


构建和执行演示应用程序

Tern 版的 Paradigm 开发工具允许直接从 Paradigm IDE 内进行远程调试。 这些说明假定 Tern 调试监视器已编程到控制器板闪存 - 新购买的控制器板的默认设置。
  1. 使用控制板随附的 RS232 带状电缆将 E-Engine 连接到主机 PC。 控制器板上应使用 COM1。

  2. 在 Paradigm IDE 中打开 RTOSDemo.ide 项目文件。


    Paradigm IDE 中显示的演示项目。

    项目分区如下:

    • i2chip_src - 包含 i2chip 驱动程序的源池。 大部分代码由 Tern Inc 提供且版权归 Tern Inc 所有。

    • FreeRTOS_source - 包含 FreeRTOS 内核源代码的源池。

    • DemmoApp_source - 包含标准 FreeRTOS 演示应用程序文件的源池。

    • RTOSDemo - 此项目包含对上述三个源池的引用。 它还包含 main.c 和 httptask.c。 main.c 是程序入口点。 它创建所有演示应用程序任务,然后启动 RTOS 调度器。 httptask.c 包含简单的 http 服务。

  3. 在项目窗口中(如上图所示) ,右键单击“RTOSDemo [.axe]”行,然后从弹出菜单中选择“Edit local options”。 将显示 以下项目选项对话框。

  4. 在项目选项窗口中,选择“Directories”主题,然后编辑 include(包含)和 library(库)路径名称,以正确指向您的 Paradigm C/C++ 安装(我的安装位于 c:devtoolsparadigm 目录中,如下图所示)。

  5. 关闭项目选项窗口,然后在 IDE 的“Project”菜单中选择“Build All”。 源构建和链接时不应报错或出现警告。

  6. 最后从 IDE 的“Debug”菜单中选择“Run”。 IDE 应连接到目标板,下载可执行文件并启动应用程序运行。 请注意,使用此方法时,程序正在从 RAM 执行,如果目标板重启,程序将丢失。

  7. 打开 Web 浏览器,并在地址栏类型“http://192.168.0.23”中,将此 IP 地址替换为 ucIPAddress 常量设定的地址。


    在 Web 浏览器中输入 IP 地址
    (当然,根据您的系统,使用正确的 IP 地址)


功能

演示应用程序可创建 25 个任务,主要包括标准演示应用程序任务(请参阅 (演示应用程序部分,了解各个任务的详细信息)。 此外,另有 4 个任务反复动态创建和删除(遵循标准的"死亡"演示)。

正确执行时,演示应用程序将为左侧显示的网页提供服务。 该页面每秒都会自动刷新。

表中列出了 RTOS 调度器控制下的每个任务以及以下任务:

空闲任务执行循环的计数来自空闲任务钩子,参见 HTTPTask.c 中的定义。

滴答数应以 configTICK_RATE_HZ 常量指定的速率递增,参见 FreeRTOSConfig.h 中的定义。

最后,main() 还创建了一个“检查”任务。 该检查任务可以监控系统中的所有其他任务。 如果检查任务发现任何其他任务的潜在错误, 将显示红色的错误消息。 如果从未检测到错误,则显示 "No errors detected"(未检测到错误)。 如需测试这个机制,可以 移除 COM2 上的环回连接器,以故意生成错误。


配置和用法详情

HTML 页面

当下载时,只返回单个动态生成的页面,正如 HTTPTask.c 中的硬编码。 不过,Tern 开发套件包括 用于 E-Engine 控制器的紧凑型闪存驱动程序,可轻松集成到 RTOS 演示中。 这将允许创建标准 HTML 页面, 并从 Windows 主机写入闪存卡,然后从 E-Engine 控制器提供。 此外,FreeRTOS 下载包含 uIP 源代码。 uIP 包含一个非常简单的 cgi 类型函数,允许轻松创建包含动态数据的页面。

自此演示创建以来,FreeRTOS 已对 uIP 堆栈做出一些修改。 请参阅嵌入式以太网示例列表页面,获取更多详细信息。


任务状态表

出于演示目的,在所服务网页上显示的表格是有趣的,但由于创建期间需要让 RTOS 调度器长时间处于禁用状态, 所以不建议在生产应用程序中使用。


中断服务程序

为了简单起见,RTOS 调度器上下文切换机制依赖于编译器生成的中断服务程序的序言和尾声代码。 因此 每个能导致上下文切换的 ISR 都必须有相同的进入和退出代码。 能导致上下文切换的 ISR 则不能 直接在 ISR 函数中定义任何堆栈变量。 解决此问题的一个简单方法是,用高级 ISR 函数调用另一个较低级函数, 例如:
/* This is the lower level function called from the top level 
ISR function. */
int iCalledFunction( void )
{
/* Variables can be declared here. */
int iSwitchRequired = false;

    /* ... ISR code goes here ... */

    /* Assume the ISR code necessitates a context switch. */
    iSwitchRequired = true;

    return iSwitchRequired;
}


/* This is the top level function in which variables cannot be 
declared on the stack.  This is the function installed on the 
vector. */
void __interrupt prvISRFunction( void )
{
/* Variables cannot be declared here! */

    /* Call the lower level function to do the work. */
    if( iCalledFunction() )
    {
        /* If the called function necessitates a context switch
        then call portEND_SWITCHING_ISR() immediately prior to
        exiting. */
        portEND_SWITCHING_ISR();
    }
}

E-Engine 演示应用程序中包含的串行端口和 WIZnet 驱动程序证明了这一机制。

将 ISR 使用的变量声明为静态变量可能会具有相同的效果。

不会引起上下文切换的中断服务程序没有特殊要求。


i2Chip 驱动程序

下载中所包含的 i2chip 驱动程序是 Tern Inc 提供的驱动程序的轻微修改版本(修改内容是 在用于解除 HTTPTask 阻塞的中断服务程序中加入信号量)。 此驱动程序不是为多任务系统而编写,因此 与 FreeRTOS.org 一起使用时没有进行优化。 可以通过以下方式提高效率:
  • 选择哪些中断应该唤醒 HTTPTask,哪些不应该。 目前,任何事件都会唤醒 HTTPTask,即使没有要执行的 处理。
  • 取消 ISR 之外的驱动程序代码内的状态位轮询,取而代之的是, 在 ISR 和任务代码之间使用更加面向状态机的组织。


浮点

Borland 浮点库不是可重入的,不应与 RTOS 调度程序一起使用。 关于如何使它们可重入的信息已有相当完善的记录, 有关信息可以在网上找到。


RTOS 移植特定配置

此移植的特定配置项目位于 Source/Demo/WizNET_DEMO_TERN_186/FreeRTOSConfig.h。可以对此文件中定义的常量 进行编辑,以适应您的应用程序。尤其是,使用 configTICK_RATE_HZ 定义来设置 RTOS 滴答的频率。提供的数值为 1000 Hz, 对于测试 RTOS 内核功能很有用,但比大多数应用程序要求的速度快。降低此值可提高效率。

每个端口会定义 (#define) 'BaseType_t' 为该处理器的最有效数据类型。此端口将 BaseType_t 定义为 short(16 位)类型。

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

RTOS Tick 中断使用定时器 1 和 2。 使用快速滴答率将取消对定时器预分频的要求,因此仅使用定时器 2。


优化

“Global Register Allocation”(全局寄存器分配)优化选项似乎会破坏代码。






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