揭秘LiteOS在STM32上的动态运行
2024-02-06 09:42:09
LiteOS是如何在STM32上运行起来的呢?相信不少读者好奇过。在《LiteOS是怎么在STM32上开始运行的》中,我们和读者们一起从源码静态分析了一遍LiteOS的启动流程。为了更深入地了解LiteOS的启动细节,本文将提供一种新的方式,即基于LiteOS一站式开发工具LiteOS Studio,通过单步调试,来动态分析LiteOS的启动流程。
准备工作
- 硬件:STM32F407开发板
- 软件:LiteOS Studio
LiteOS Studio简介
LiteOS Studio是专为LiteOS系统打造的一款集成开发环境,提供集成的代码编辑、调试、编译、下载和固件分析等功能,极大地简化了LiteOS应用开发的复杂度。使用LiteOS Studio,可以直接在图形化界面上对LiteOS进行单步调试,非常方便。
动态分析启动流程
- 导入工程
首先,我们使用LiteOS Studio打开Hello LiteOS工程。
- 设置断点
为了方便观察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
函数
- 开始调试
设置好断点后,就可以开始调试了。可以在LiteOS Studio的菜单栏中选择 “Run” → “Start Debugging” (或使用快捷键F5),或者点击工具栏上的 “Start Debugging” 按钮来开始调试。
- 单步调试
当程序开始运行时,就会在第一个断点处停止。此时,可以通过点击工具栏上的 “Step Over” 按钮(或使用快捷键F6),逐条执行代码,并观察各个变量的值。
- 查看寄存器
在调试过程中,还可以查看寄存器的内容。可以在LiteOS Studio的 “Variables” 视图中,找到 “Registers” 节点,并展开它,就可以看到各个寄存器的值。
- 结束调试
当程序运行到最后一个断点处时,就会结束调试。此时,可以通过点击工具栏上的 “Stop Debugging” 按钮来结束调试。
启动流程分析
通过单步调试,我们可以看到LiteOS的启动流程如下:
- 复位处理
当STM32复位后,程序会从 startup_stm32f407xx.s
文件中的 Reset_Handler
函数开始执行。该函数会初始化堆栈指针和中断向量表,然后跳转到 main
函数。
- 系统初始化
在 main
函数中,会调用 LOS_KernelInit
函数来初始化LiteOS内核。该函数会创建LiteOS任务、中断和事件等对象,并启动任务调度器。
- 任务启动
任务调度器会根据任务的优先级,依次启动各个任务。在Hello LiteOS工程中,只有一个任务,即 hello_task
。该任务会在 application/hello_liteos.c
文件中的 main
函数中创建。
- 任务运行
hello_task
任务被启动后,会执行任务代码。在Hello LiteOS工程中,hello_task
任务会调用 LOS_TaskDelay
函数挂起自身,等待1000毫秒。
- 任务调度
在 hello_task
任务挂起后,任务调度器会切换到下一个任务。由于没有其他任务可以执行,所以任务调度器会再次切换回 hello_task
任务。
- 任务恢复
hello_task
任务恢复后,会继续执行任务代码。在Hello LiteOS工程中,hello_task
任务会调用 printf
函数输出 “Hello LiteOS!” 字符串。
- 任务终止
hello_task
任务执行完后,会调用 LOS_TaskDelete
函数来删除自身。此时,LiteOS内核会判断是否还有其他任务可以执行。如果没有,则LiteOS内核会停止运行。
总结
通过使用LiteOS Studio进行单步调试,我们可以更详细地展示了LiteOS在STM32上的启动流程。这有助于我们更深入地了解LiteOS,并为我们开发LiteOS应用程序提供了有益的帮助。