专栏中心

EEPW首页 > 专栏 > 多任务系统中的堆栈使用

多任务系统中的堆栈使用

发布人:13261589816 时间:2023-01-05 来源:工程师 发布文章

在使用μC/OS的多任务应用程序中,main()启动后首先使用系统C栈,在OS启动后使用任务栈。

基于μC/OS-II或μC/OS-III编写应用代码时,用户必须为每个任务声明一个堆栈,用于任务运行现场及保存任务上下文(CPU寄存器)。在多任务处理开始之前执行的C代码将使用C栈。只有当应用程序的第一个任务开始运行时,栈才会从C栈中转移到任务栈。

不同的微控制器栈的实现也不同,许多32位处理器支持多个栈。例如,ARM Cortex-M内核有两个栈指针,分别指向主栈和进程栈。在基于μC/OS-III的应用中,多任务开始前使用主堆栈,其空间为链接命令文件中定义的堆栈区域。当应用程序调用OSStart()函数启动多任务时,进程堆栈指针被设置为第一个任务堆栈的栈顶地址,并修改控制寄存器,使任务开始运行时使用该堆栈。同时,主堆栈指针被用来指向μC/OS-III的中断堆栈OSCfg_ISRStk[]。后续多任务系统运行过程中,此堆栈将专门用于中断和异常处理程序。多任务启动后,C堆栈会丢失,导致嵌入式应用中可用的RAM量减少,在资源有限的应用中,可以重用C堆栈空间,用于任务堆栈,具体实现可以参考文章:技术小课堂| µC/OS-III的应用中CSTACK重用

由于main()对C堆栈的依赖,必须确保为这个堆栈留出足够的空间。如上所述,µC/OS-III用户还必须知道OSCfg_ISRStk[]栈的大小。OSCfg_ISRStk[]是一个数组,类似于任务堆栈,其大小由内核配置常量OS_CFG_ISR_STK_SIZE决定。另一方面,C堆栈的大小通常直接提供给链接器,因此在不同开发环境中对该堆栈进行更改的方法是不一样的。

在Segger Embedded Studio中,Cortex-M的应用中main()使用的堆栈通常被命名为stack,可以通过工程options菜单进行堆栈配置,无需直接更改链接器文件。

图片

如果基于μC/OS-III官方示例工程开发,通常不需要修改C栈的大小。这些工程已为main()的执行分配了足够的空间。不过,中断堆栈大小的定义OS_CFG_ISR_STK_SIZE可能需要进行一些调整。对于使用独立中断堆栈的应用,如果不在中断处理程序增加复杂的函数调用,示例的默认大小即可满足需求。

基于μC/OS构建的系统在main()运行过程中依赖C堆栈,一旦调用OSStart()后,系统就切换到任务堆栈,以便开始多任务处理。


专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们

关键词: 堆栈 μC/OS

相关推荐

消息称 vivo OS 部门新成立 AI 领域,大模型训练重心向端侧转移

Windows树大根深 俄罗斯操作系统国产化进展缓慢

国际视野 2023-02-10

Tenstorrent与AutoCore宣布战略合作,以AutoCore.OS赋能高性能RISC-V汽车计算

汽车智能座舱软件架构

TechInsights:华为鸿蒙 HarmonyOS 今年将取代苹果 iOS 成为中国第二大智能手机操作系统

嵌入式系统 2024-01-03

第五讲:嵌入式操作系统

QNX推出QNX OS for Safety(QOS)8.0

消息称小米 IoT 设备全面适配接入澎湃 OS,eSIM 智能手表也在路上

谷歌将开源Android Automotive OS SDV平台

μC OS-Ⅱ中文手册(PDF)

Arm 旗下热门开源嵌入式操作系统 Mbed OS 将于 2026 年 7 月结束官方维护

第八讲:代码的调试

51系列单片机的uC OS-II

详析GMSL在双汽车电子控制单元中的应用

汽车电子 2024-02-06

ASIX OS & ASIX Windows

更多 培训课堂
更多 焦点
更多 视频

技术专区