50、实时系统编程与软件跟踪技术解析

实时系统编程与软件跟踪技术解析

在实时嵌入式系统的开发中,高效的内核与精准的调试技术至关重要。本文将深入探讨相关的编程技术,包括内核的特性以及软件跟踪技术的原理和应用。

1. 内核测试函数分析

首先来看一个测试函数 lib2_test ,其代码如下:

void lib2_test(void) {
    uint32_t volatile i = l_delay;
    while (i-->OUL) {
        volatile double r = sin(impure_ptr2->y) * sin(impure_ptr2->y)
                          + cos(impure_ptr2->y) * cos(impure_ptr2->y);
        Q_ASSERT(fabs(r - 1.0) < 1e-99);
        /* assert the identity */
    }
}

这个函数的主要功能是利用数学恒等式 sin²(x) + cos²(x) = 1.0 进行计算和验证。具体步骤如下:
1. 初始化变量 i l_delay ,该变量决定了循环的迭代次数。
2. 在循环中,计算 r 的值,使用了 sin cos 函数,这会大量使用 80x87 FPU。
3. 通过 Q_ASSERT 断言 r 的值与 1.0 的差值小于 1e-99 ,以此验证计算的正确性。

此外,还涉及到库的线程上下文初始化:
- 初始化库 lib1 的线程上下文( x 变量),其值依赖于任务的优先级,每个任务的优先级不同, x 的值也不同。
- 初始化库 lib2 的线程上下文( y 变量),与 lib1 类似,但添加了相移,使得每个线程的值与 lib1 不同。

2. 内核参数设置与上下文切换

参数 l_delayCtr 从命令行设置,它决定了 lib2_test 函数的迭代次数,也就是该函数对 CPU 的负载。

在 QK 扩展调度器中,80x87 FPU 上下文的保存和恢复是自动处理的。在应用层面,需要完成以下操作:
1. 在每个活动对象中包含每个线程的 FPU 上下文。
2. 为每个使用 FPU 的任务设置 QK_FPU_FLAG
3. 使用 FPU 进行测试,同时要使用正确的编译器选项来选择 FPU。例如,使用 -f287 选项编译 QP 库和 DPP 应用程序,该选项会指示 Turbo C++ 编译器生成 FPU 硬件指令。

3. QK 内核特性

QK 是 QP 事件驱动平台中的一个轻量级、基于优先级的抢占式内核,属于运行至完成(RTC)或单栈内核。与大多数传统 RTOS 不同,QK 中的任务是一次性的 RTC 函数,而非无尽循环。其特点如下:
|特性|描述|
|----|----|
|执行特性|在活动对象应用中,QK 内核提供与其他传统基于优先级的抢占式内核或 RTOS 相同的执行配置文件,且在速度、堆栈使用、代码大小、复杂度、易用性等方面可能优于传统 RTOS。|
|高级特性|支持优先级上限互斥锁、线程本地存储和扩展上下文切换等高级功能,这些功能在共享内存、库或设备时非常有用。|
|可移植性|比大多数 RTOS 更容易移植到新的 CPU 和编译器,因为它可以使用几乎所有嵌入式 C/C++ 编译器支持的编译器生成的中断,大多数情况下无需编写汇编代码。|

4. 软件跟踪技术概述

在实际项目中,编写、编译和链接代码只是第一步,系统还需要进行测试、验证和调优。传统的单步调试器和 printf() 语句在嵌入式系统中往往不太实用,因此软件跟踪技术应运而生。

软件跟踪是一种在不停止应用程序的情况下获取诊断信息的方法,它通过对目标系统进行仪器化,记录有趣的离散事件,以便后续检索和分析。其典型设置如下:

graph LR
    A[嵌入式目标系统] -->|记录跟踪数据| B(RAM 缓冲区)
    B -->|通过数据链路发送| C(主机计算机)
    C -->|存储、显示和分析| D(分析结果)

软件跟踪系统通常具有以下特点:
- 最小侵入性 :对目标系统行为的影响最小,可在不中断或显著改变系统行为的情况下进行诊断。
- 选择性日志记录 :提供用户可定义的细粒度过滤器,只收集感兴趣的事件,减少对系统资源的占用。
- 循环跟踪缓冲区 :使用循环跟踪缓冲区,新数据会覆盖旧数据,遵循“最新最好”的原则,同时支持软件触发器来控制数据收集。
- 数据压缩 :对跟踪数据进行压缩,以减少缓冲区占用和数据传输带宽。
- 分离跟踪日志和传输机制 :将跟踪日志和数据传输机制分离,允许在代码的非关键路径中进行传输,支持多种数据传输机制。
- 数据整合和时间戳 :能够整合系统各部分的数据,包括并发线程和中断,并提供精确的时间戳。

5. Quantum Spy 软件跟踪系统

Quantum Spy 是 QP 事件驱动平台中的软件跟踪系统,由目标端的 QS 组件和主机端的 QSPY 应用程序组成。它在事件驱动的活动对象计算模型中特别有效,能够提供比传统 RTOS 更全面和详细的信息。

5.1 软件跟踪会话示例

以用餐哲学家问题(DPP)测试应用程序为例,展示软件跟踪的实际操作:
1. 构建配置 :在 Turbo C++ IDE 中加载 DPP - SPY.PRJ 项目,构建“Spy”配置,使跟踪仪器化生效。
2. 运行目标程序 :在具有串口的目标 PC 上运行 DPP - SPY.EXE 可执行文件。
3. 连接主机和目标 :通过 NULL - 调制解调器电缆将目标机器的串口连接到 Windows 或 Linux 主机工作站的串口。
4. 启动 QSPY 应用程序
- Windows :在命令提示符下输入 qspy –c COM1 –b 115200 ,其中 -c 指定接收跟踪数据的 COM 端口, -b 指定波特率。
- Linux :先在 <qp>/qpc/tools/qspy/linux/gnu/ 目录下运行 Makefile 构建可执行文件,然后在命令提示符下输入 qspy –c /dev/ttyS0 –b 115200 ,根据实际连接调整串口设备名。

5.2 人类可读的跟踪输出

QSPY 应用程序以人类可读的文本格式显示跟踪数据,以下是一个示例:

qspy host application 3.5.00
Copyright (c) Quantum Leaps, LLC.
Mon Feb 25 12:20:13 2008
-T 4
-O 4
-F 4
-S 1
-E 2
-Q 1
-P 2
-B 2
-C 2
Obj Dic: 16CA18D8->l_smlPoolSto
Obj Dic: 16CA1900->l_tableQueueSto
Obj Dic: 16CA1914->l_philoQueueSto[0]
...
EQ.INIT: Obj=l_tableQueueSto Len= 5
0000000000 AO.ADD : Active=16CA1CB8 Prio= 6
Obj Dic: 16CA1CB8->&l_table
Fun Dic: 141E0006->&QHsm_top
Fun Dic: 12DA00C9->&Table_initial
Fun Dic: 12DA020B->&Table_serving
Sig Dic: 00000008,Obj=16CA1CB8 ->HUNGRY_SIG
0000000000 AO.SUB : Active=l_table Sig=DONE_SIG
0000000000 AO.SUB : Active=l_table Sig=TERMINATE_SIG
Q_INIT : Obj=l_table Source=QHsm_top Target=Table_serving
0000000000 ==>Init: Obj=l_table New=Table_serving
0000070346 QF_isrE: IsrNest= 1, CurrPrio=255
TICK
: Ctr=
1
0000070367 QF_isrX: IsrNest= 1, CurrPrio=255
...

对这个跟踪日志的解读如下:
- 日志头部信息 :包含 QSPY 应用程序的版本号、运行日期和时间以及配置选项。
- 字典记录 :提供内存中各种对象的地址与符号名称的映射,无时间戳。
- 活动对象初始化 :如 EQ.INIT 记录表示事件队列的初始化, AO.ADD 记录表示添加活动对象。在时间 - 滴答中断未配置时,所有时间戳为 0000000000

通过以上内容,我们对实时系统编程中的内核测试、上下文切换、软件跟踪技术有了更深入的了解。这些技术对于开发高效、稳定的实时嵌入式系统具有重要意义。

实时系统编程与软件跟踪技术解析

5.3 软件跟踪的应用场景与优势

软件跟踪技术在实时系统开发中具有广泛的应用场景和显著优势,以下详细介绍:

应用场景
  • 系统测试与验证 :在系统测试阶段,软件跟踪可以记录系统的各种状态和事件,帮助开发人员验证系统是否按照预期运行。例如,在 DPP 应用中,可以通过跟踪日志检查活动对象之间的事件交换是否正确,状态机的转换是否符合设计。
  • 性能调优 :通过分析跟踪数据,开发人员可以了解系统的性能瓶颈,如哪些任务消耗了大量的 CPU 时间,哪些事件的处理延迟较大等。从而有针对性地进行优化,提高系统的整体性能。
  • 故障排查 :对于难以复现的间歇性故障,软件跟踪可以记录故障发生前后的系统状态和事件,帮助开发人员定位问题的根源。例如,当系统出现死锁或数据不一致的情况时,跟踪日志可以提供关键线索。
优势
  • 全面性 :软件跟踪可以记录系统中各个组件的详细信息,包括事件交换、状态机转换、上下文切换等,提供比传统调试方法更全面的系统视图。
  • 实时性 :在不停止系统运行的情况下获取诊断信息,能够观察系统的实时行为,发现一些在调试器停止系统时无法出现的问题。
  • 可重复性 :通过记录跟踪数据,可以进行多次回放和分析,确保问题能够被准确复现和解决。
6. 软件跟踪的配置与使用

在实际应用中,需要对软件跟踪系统进行合理的配置和使用,以充分发挥其优势。

6.1 编译时配置

在编译阶段,可以通过定义宏或使用编译器选项来启用或禁用软件跟踪功能。例如,在某些项目中,可以通过定义 QS_ENABLED 宏来启用跟踪功能,在不需要跟踪时取消定义该宏,从而减少代码的开销。

6.2 运行时配置

在运行时,可以通过配置软件跟踪系统的过滤器和触发器来控制数据的收集。以下是一些常见的配置选项:
|配置选项|描述|
|----|----|
|过滤器|可以根据事件类型、对象地址、时间范围等条件过滤跟踪数据,只收集感兴趣的事件。例如,可以只记录特定活动对象的事件,或者只记录某个时间段内的事件。|
|触发器|可以设置软件触发器来控制数据的收集开始和停止。例如,当某个特定事件发生时开始收集数据,当达到一定条件时停止收集数据。|

6.3 使用示例

以下是一个简单的使用软件跟踪系统的示例,假设我们要记录某个活动对象的所有事件:

// 启用软件跟踪
#define QS_ENABLED

// 配置过滤器,只记录特定活动对象的事件
QS_FILTER_ON(QS_AO_EVENT, &l_table);

// 在代码中记录事件
QS_BEGIN(QS_AO_EVENT, 0)
    QS_OBJ(&l_table);
    QS_SIG(HUNGRY_SIG);
QS_END()
7. 总结与展望

软件跟踪技术为实时系统的开发和调试提供了强大的支持,通过记录系统的详细信息,开发人员可以更深入地了解系统的行为,快速定位和解决问题。同时,QK 内核作为一个轻量级、高效的抢占式内核,在活动对象应用中具有显著的优势。

未来,随着实时系统的复杂性不断增加,软件跟踪技术也将不断发展和完善。例如,可能会出现更智能的过滤器和触发器,能够自动识别和记录关键事件;跟踪数据的分析工具也将更加强大,能够提供更直观的可视化结果和更深入的数据分析。

总之,掌握软件跟踪技术和 QK 内核的使用,对于开发高质量、高性能的实时嵌入式系统至关重要。希望本文能够帮助读者更好地理解和应用这些技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值