返回

揭秘LiteOS在STM32上的动态运行

开发工具

LiteOS是如何在STM32上运行起来的呢?相信不少读者好奇过。在《LiteOS是怎么在STM32上开始运行的》中,我们和读者们一起从源码静态分析了一遍LiteOS的启动流程。为了更深入地了解LiteOS的启动细节,本文将提供一种新的方式,即基于LiteOS一站式开发工具LiteOS Studio,通过单步调试,来动态分析LiteOS的启动流程。

准备工作

  • 硬件:STM32F407开发板
  • 软件:LiteOS Studio

LiteOS Studio简介

LiteOS Studio是专为LiteOS系统打造的一款集成开发环境,提供集成的代码编辑、调试、编译、下载和固件分析等功能,极大地简化了LiteOS应用开发的复杂度。使用LiteOS Studio,可以直接在图形化界面上对LiteOS进行单步调试,非常方便。

动态分析启动流程

  1. 导入工程

首先,我们使用LiteOS Studio打开Hello LiteOS工程。

  1. 设置断点

为了方便观察LiteOS的启动细节,我们需要在适当的位置设置断点。可以通过点击代码行旁边的灰色区域,或使用快捷键F9,在代码行上设置断点。以下是在STM32平台上启动LiteOS时需要设置的断点:

  • startup_stm32f407xx.s 文件中的 Reset_Handler 函数
  • kernel/liteos_kernel.c 文件中的 LOS_Start 函数
  • kernel/liteos_task.c 文件中的 OsTaskCreate 函数
  • application/hello_liteos.c 文件中的 main 函数
  1. 开始调试

设置好断点后,就可以开始调试了。可以在LiteOS Studio的菜单栏中选择 “Run” → “Start Debugging” (或使用快捷键F5),或者点击工具栏上的 “Start Debugging” 按钮来开始调试。

  1. 单步调试

当程序开始运行时,就会在第一个断点处停止。此时,可以通过点击工具栏上的 “Step Over” 按钮(或使用快捷键F6),逐条执行代码,并观察各个变量的值。

  1. 查看寄存器

在调试过程中,还可以查看寄存器的内容。可以在LiteOS Studio的 “Variables” 视图中,找到 “Registers” 节点,并展开它,就可以看到各个寄存器的值。

  1. 结束调试

当程序运行到最后一个断点处时,就会结束调试。此时,可以通过点击工具栏上的 “Stop Debugging” 按钮来结束调试。

启动流程分析

通过单步调试,我们可以看到LiteOS的启动流程如下:

  1. 复位处理

当STM32复位后,程序会从 startup_stm32f407xx.s 文件中的 Reset_Handler 函数开始执行。该函数会初始化堆栈指针和中断向量表,然后跳转到 main 函数。

  1. 系统初始化

main 函数中,会调用 LOS_KernelInit 函数来初始化LiteOS内核。该函数会创建LiteOS任务、中断和事件等对象,并启动任务调度器。

  1. 任务启动

任务调度器会根据任务的优先级,依次启动各个任务。在Hello LiteOS工程中,只有一个任务,即 hello_task。该任务会在 application/hello_liteos.c 文件中的 main 函数中创建。

  1. 任务运行

hello_task 任务被启动后,会执行任务代码。在Hello LiteOS工程中,hello_task 任务会调用 LOS_TaskDelay 函数挂起自身,等待1000毫秒。

  1. 任务调度

hello_task 任务挂起后,任务调度器会切换到下一个任务。由于没有其他任务可以执行,所以任务调度器会再次切换回 hello_task 任务。

  1. 任务恢复

hello_task 任务恢复后,会继续执行任务代码。在Hello LiteOS工程中,hello_task 任务会调用 printf 函数输出 “Hello LiteOS!” 字符串。

  1. 任务终止

hello_task 任务执行完后,会调用 LOS_TaskDelete 函数来删除自身。此时,LiteOS内核会判断是否还有其他任务可以执行。如果没有,则LiteOS内核会停止运行。

总结

通过使用LiteOS Studio进行单步调试,我们可以更详细地展示了LiteOS在STM32上的启动流程。这有助于我们更深入地了解LiteOS,并为我们开发LiteOS应用程序提供了有益的帮助。