实时系统编程与软件跟踪技术解析
在实时嵌入式系统的开发中,高效的内核与精准的调试技术至关重要。本文将深入探讨相关的编程技术,包括内核的特性以及软件跟踪技术的原理和应用。
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 内核的使用,对于开发高质量、高性能的实时嵌入式系统至关重要。希望本文能够帮助读者更好地理解和应用这些技术。
超级会员免费看

被折叠的 条评论
为什么被折叠?



