0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

多任务系统中的堆栈使用

麦克泰技术 来源:麦克泰技术 作者:麦克泰技术 2022-12-02 11:15 次阅读

在使用μ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菜单进行堆栈配置,无需直接更改链接器文件。

30bfb07e-71ee-11ed-8abf-dac502259ad0.png

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

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

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    48

    文章

    7551

    浏览量

    151391
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120305
  • 堆栈
    +关注

    关注

    0

    文章

    182

    浏览量

    19759
  • 应用程序
    +关注

    关注

    37

    文章

    3268

    浏览量

    57699

原文标题:多任务系统中的堆栈使用

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    AUTOSAR通信堆栈的配置 AUTOSAR通信模块测试方法

    )的开发和生产。通信堆栈是AUTOSAR架构的关键组成部分,负责处理ECU之间的通信。 AUTOSAR通信堆栈的配置 通信模型 : AUTOSAR定义了一种分层的通信模型,包括应用
    的头像 发表于 12-17 15:01 241次阅读

    freertos最多支持多少个任务

    以下几个因素: 系统资源 :FreeRTOS能够支持的任务数量受到系统硬件资源的限制,特别是处理器的RAM大小和性能。RAM用于存储任务的控制块(TCB)和
    的头像 发表于 09-02 14:21 875次阅读

    堆栈和内存的基本知识

    本文主要聊聊关于堆栈的内容。包括堆栈和内存的基本知识。常见和堆栈相关的 bug,如栈溢出,内存泄漏,堆内存分配失败等。后面介绍软件堆栈统计
    的头像 发表于 08-29 14:10 468次阅读
    <b class='flag-5'>堆栈</b>和内存的基本知识

    xTaskCreate能否把堆栈上限调整为2K或者1k?

    RTOS SDK 的系统任务优先级为 15 ,创建任务的接⼝口 xTaskCreate 为 freeRTOS ⾃自带接⼝口,使 ⽤用 xTaskCreate 创建任务时,
    发表于 07-22 06:31

    请问est_printf为什么要使用堆栈空间?

    发送大量与 malloc/free 相关的调试消息后,任务堆栈之一已溢出。 我的问题是,谁能告诉我为什么除了调用ets_printf本身之外,堆栈还会发挥作用?
    发表于 07-09 07:47

    esp32-c3工程怎么创建多个freertos任务?

    ESP-IDF给出的ESP32-C3的例程都只有一个任务。即void app_main() 而且没看见这个app_main任务是在哪里被创建的??? 如果我想建一个ESP32-C3的多任务
    发表于 06-27 06:37

    esp32S2创建任务时,若任务堆栈大小配置超过 4096*6 ,该任务会创建失败,如何解决?

    esp32S2创建任务时,若任务堆栈大小配置超过 4096*6 ,该任务会创建失败, xTaskCreat 返回 xReturn = ffffffff。是否应该修改FreeRTOSCo
    发表于 06-20 08:26

    系统的latency是如何产生的

    在当今数字时代,手机已成为人们日常生活不可或缺,多任务处理和实时响应对于用户体验越来越重要,抢占(preemption)机制在提升系统性能和用户体验方面发挥了至关重要的作用。内核抢占机制使得
    的头像 发表于 06-04 09:18 639次阅读
    <b class='flag-5'>系统</b><b class='flag-5'>中</b>的latency是如何产生的

    求助,关于stm32f1使用freeRTOS和Fatfs时任务堆栈大小问题求解

    哪位使用过freeRTOS和Fatfs时,使用Fatfs系统的函数如f_open()等等时,此任务堆栈大小大致需要多大,当前MAX_SS 定义为4096,我分配12K软件都跑飞了,请哪位使用分享一下经验,谢谢!~~?
    发表于 05-09 06:50

    IAR调试freertos系统怎样才能方便的获得任务堆栈情况?

    在IAR中将freertos移植到STM32,在进行任务堆栈分配时分配多大的堆栈时一个问题,如何比较方便的获得任务
    发表于 05-07 08:15

    请问freertos可视化调试打印任务信息是不是只可以打印一次?

    在freertos,使用可视化调试打印任务消息,但是打印不全,还只能打印一次,使用IAR自带的调试插件看,显示可视化调试任务堆栈顶全是a,这事怎么回事?
    发表于 05-07 06:16

    verilog函数和任务对比

    在verilog,函数和任务均用来描述共同的代码段,并且在模式内任意位置被调用,提高代码效率,让代码更加的直观,提高代码可读性。但是在实际使用的过程,函数和任务也存在诸多的不同,下
    的头像 发表于 02-12 18:43 885次阅读

    基于多任务优化和人工智能赋能态势感知技术

    随着作战任务系统的复杂性不断增加,在正确的时间做出正确的作战决策需要 (1) 实时态势感知,以及 (2) 提供自动建议的决策支持系统。这两项功能是作战任务管理
    的头像 发表于 01-18 15:22 653次阅读

    请教:有SPC560B的多任务实时系统的例程吗(freertos)

    请教:有SPC560B的多任务实时系统的例程吗(freertos)
    发表于 01-15 17:04

    嵌入式系统堆栈监控的作用

    在微控制器或微处理器堆栈是内存的一个保留区域,用于存储临时数据和函数调用信息,管理函数的执行,跟踪返回地址、局部变量和函数参数。堆栈监控是嵌入式系统运行
    的头像 发表于 01-05 11:13 494次阅读