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

    文章

    6809

    浏览量

    147637
  • 寄存器
    +关注

    关注

    30

    文章

    5028

    浏览量

    117722
  • 堆栈
    +关注

    关注

    0

    文章

    171

    浏览量

    19524
  • 应用程序
    +关注

    关注

    37

    文章

    3136

    浏览量

    56393

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    ZMC运动控制器多任务编程一

    、用户多任务程序。运动控制器支持多任务编程,各任务可以独立执行,任务间不受影响。通过划分任务,程序模块化,简化错误处理,提高
    发表于 11-07 09:52

    51单片机多任务操作系统的原理是什么?

    51单片机多任务操作系统的原理
    发表于 11-06 08:10

    关于FreeRTOS创建任务时的堆栈问题

    usStackDepth指定堆栈大小。 请问,这个堆栈是用来干什么的? 是任务中分配的局部变量放在这个堆栈里吗? 或者是任务切换过程中保存局
    发表于 10-31 08:08

    51怎么做到多任务处理而不干扰其他任务

    51怎么做到多任务处理而不干扰其他任务
    发表于 10-30 06:33

    基于RTX51嵌入式多任务实时操作系统的智能卡电能表设计

    电子发烧友网站提供《基于RTX51嵌入式多任务实时操作系统的智能卡电能表设计.pdf》资料免费下载
    发表于 10-26 09:12 2次下载
    基于RTX51嵌入式<b class='flag-5'>多任务</b>实时操作<b class='flag-5'>系统</b>的智能卡电能表设计

    freertos怎么查看任务堆栈的大小?

    要通过什么方法来获取当前任务堆栈大小
    发表于 10-12 08:01

    什么叫多任务系统 FreeRTOS任务管理

    的函数完成所需的处理。有时候我们也需要中断中完成一些处理。相对于多任务系统而言,这个就是单任务系统,也称作前后台系统,中断服务函数作为前台程
    的头像 发表于 09-28 10:56 346次阅读
    什么叫<b class='flag-5'>多任务</b><b class='flag-5'>系统</b> FreeRTOS<b class='flag-5'>任务</b>管理

    如何通过多任务访问Keil RTX程序EEPROM

    V2.1,努埃杜-基数01 V2.1 当微控制器应用程序同时必须处理许多任务时, 我们可以使用 RTOS (实时操作系统) 来帮助我们管理这些任务。 在 RTOS 系统
    发表于 09-01 07:42

    如何通过多任务访问Keil RTX程序EEPROM

    V2.1,努埃杜-基数01 V2.1 当微控制器应用程序同时必须处理许多任务时, 我们可以使用 RTOS (实时操作系统) 来帮助我们管理这些任务。 在 RTOS 系统
    发表于 08-23 06:04

    51单片机多任务执行例子

    51单片机多任务同时执行。RTX51 tiny是一种实时操作系统(RTOS),可以用它来建立多个任务(函数)同时执行的应用(从宏观上看是同时执行的,但从微观上看,还是独立运行的)。嵌入式应用
    发表于 08-04 15:59 0次下载

    51单片机多任务同时执行

    51单片机多任务同时执行。RTX51 Tiny是一种实时操作系统(RTOS),可以用它来建立多个任务(函数)同时执行的应用(从宏观上看是同时执行的,但从微观上看,还是独立运行的)。嵌入式应用
    发表于 08-03 16:58

    Arduino上的多任务处理

    电子发烧友网站提供《Arduino上的多任务处理.zip》资料免费下载
    发表于 06-14 11:05 0次下载
    Arduino上的<b class='flag-5'>多任务</b>处理

    PicoSem:Arduino框架下的Raspberry多任务

    电子发烧友网站提供《PicoSem:Arduino框架下的Raspberry多任务.zip》资料免费下载
    发表于 06-13 09:21 1次下载
    PicoSem:Arduino框架下的Raspberry<b class='flag-5'>多任务</b>

    嵌入式多任务系统多任务机制理论篇

    在单处理器(嵌入式MCU)的计算机系统中,在某一具体时刻处理器只能运行一个任务,但是可以通过将处理器运行时间分成小的时间段,多个任务按照一定的原则分享这些时间段的方法
    发表于 05-08 09:38 400次阅读
    嵌入式<b class='flag-5'>多任务</b><b class='flag-5'>系统</b>的<b class='flag-5'>多任务</b>机制理论篇