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

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

3天内不再提示

RTOS任务的堆栈大小与代码量有啥关系吗?

strongerHuang 来源:strongerHuang 作者:strongerHuang 2021-05-26 09:34 次阅读

最近有小伙伴问了这样一个问题:我有个任务中的代码量很多,是不是这个任务的堆栈需要分配很大才行?

下面就围绕任务代码量,以及堆栈进行描述相关内容。

1RTOS任务堆栈分配

市面上很多RTOS的任务都是需要提前分配堆栈大小,也就是在创建任务的时候分配好堆栈的大小。 比如uCOS创建一个检测(Check)任务:

// 任务优先级#define TASK_CHECK_PRIO 6 // 任务堆栈大小#define TASK_CHECK_STK_SIZE 128 // 堆栈OS_STK TaskCheckStk[TASK_CHECK_STK_SIZE]; // 创建任务 - 信号检测OSTaskCreateExt((void (*)(void *)) AppTaskCheck, (void *) 0, (OS_STK *)&TaskCheckStk[TASK_CHECK_STK_SIZE-1],

(INT8U ) TASK_CHECK_PRIO, (INT16U ) TASK_CHECK_PRIO, (OS_STK *)&TaskCheckStk[0], (INT32U ) TASK_CHECK_STK_SIZE, (void *) 0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); // 任务应用实现void AppTaskCheck(void *p_arg){ // 代码··· (void)p_arg; for(;;) { // 代码··· }} FreeRRTOS创建一个任务类似,也是在创建时分配堆栈大小:

#define TASK_CHECK_PRIO 6#define TASK_CHECK_STK_SIZE 128 BaseType_t xReturn; xReturn = xTaskCreate(AppTaskCheck, “AppTaskCheck”, TASK_CHECK_STK_SIZE, NULL, TASK_CHECK_PRIO, NULL); 除了堆栈,其实还有像消息队列、消息邮箱等也是需要提前分配堆栈。 比如FreeRTOS创建CLI消息队列:

#define CLI_QUEUE_NUM 256 //CLI接收队列数#define CLI_PACKAGE_LEN 2 //CLI数据包长度 QueueHandle_t xCLIRcvQueue = NULL; /* 创建队列 */if(xCLIRcvQueue == NULL){ xCLIRcvQueue = xQueueCreate(CLI_QUEUE_NUM, CLI_PACKAGE_LEN);}

这就是创建任务(或队列)的分配堆栈,至于具体分配多少,与你实际情况有关,下面章节我会描述。

2任务代码量

一个任务的代码量,就是你任务中调用的那些代码。 比如上面例子中的代码:

// 任务应用实现void AppTaskCheck(void *p_arg){ // 代码··· (void)p_arg; for(;;) { // 代码··· }}

这里可能写了几千行代码,或者调用了上百个函数,每个函数里面都有不少代码。

这样下来,这一个任务的代码量就很大了。

3任务代码量和堆栈大小有关系吗?

很多人就存在一个疑惑:任务挂起,要在堆栈中临时保存任务,如果这个任务的代码量很大,是不需要很大堆栈空间才行?

答案:不一定需要很大堆栈空间,任务代码量和堆栈也没有直接关系。

可能很多初学者存在这么一个误区:保存一个任务,就是把这个任务所有代码都保存起来(在堆栈中)。

堆栈主要保存是这个任务自身的变量(控制块),还有临时变量等这些关键变量信息,而并非要保存所有代码。

4堆栈分配多大才合适?

任务堆栈大小,主要取决于你任务中【临时变量】的多少。 注意:临时变量包含你代码中所有嵌套函数中的临时变量。 对于RAM资源相对较大的处理器,你可以尽量分配多一点堆栈资源。 但是,很多时候,我们的RAM资源都是相对比较紧张的。这个时候,就需要你综合平衡。 比如静态局部变量:

void AppTaskCheck(void *p_arg){ static uint8_t aaa; //静态局部变量 (void)p_arg; for(;;) { // 代码··· }} 这里的aaa变量就不会占用该任务的堆栈空间,但是它会占用全局变量(RAM)空间。 用静态局部变量,还是临时变量,要牵涉到你项目具体情况,比如:RAM资源、代码运行效率等。(临时变量还会有一个数据拷贝过程) 所以,该如何分配堆栈,该用静态还是临时变量,需要综合考虑你项目的情况而定。

编辑:jq

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

    关注

    68

    文章

    18250

    浏览量

    222043
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1318

    浏览量

    113697
  • 代码
    +关注

    关注

    30

    文章

    4554

    浏览量

    66729

原文标题:RTOS任务的堆栈大小与代码量有关吗?

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

收藏 人收藏

    评论

    相关推荐

    如何设定RTOS中的任务栈(线程栈)大小呢?

    首先说明的是,在 `RT-Thread` 中,将本文提及的 `任务` 称之为 `线程`。
    的头像 发表于 12-01 16:40 646次阅读

    RTOS内功修炼记(一)— 任务到底应该怎么写?

    本篇文章讲述了任务的三大元素:任务控制块、任务栈、任务入口函数,并讲述了编写RTOS任务入口函数
    的头像 发表于 12-01 16:36 341次阅读
    <b class='flag-5'>RTOS</b>内功修炼记(一)— <b class='flag-5'>任务</b>到底应该怎么写?

    什么是堆栈溢出?如何分配堆栈空间大小

    前些日子bug交流群里的小哥调试了一个堆栈溢出的bug,动不动数据就被篡改了,应该也是搞得焦头烂额,头皮发麻!当时bug菌看了下,于是抛出了自己的一些调试经验,一般这样的问题80%是越界和堆栈溢出造成的,没想到还真是堆栈溢出。
    的头像 发表于 11-08 09:52 1595次阅读
    什么是<b class='flag-5'>堆栈</b>溢出?如何分配<b class='flag-5'>堆栈</b>空间<b class='flag-5'>大小</b>?

    怎么确定单片机堆栈大小

    怎么确定单片机堆栈大小,例如51stack的大小怎么预留?其他单片机的不同之处,及与ARM区别
    发表于 11-02 06:36

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

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

    RTOS相比裸机有什么优点?RTOS相比裸机更方便吗?

    RTOS相比裸机有什么优点?RTOS相比裸机更方便吗? RTOS代表实时操作系统,专门为需要高可靠性和可预测性的系统设计。相比之下,裸金属或“裸”系统的硬件或软件层最少,严重依赖开发人员的代码
    的头像 发表于 10-29 16:33 1000次阅读

    freertos怎么查看任务堆栈大小

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

    KAN316如何确定应用程序的堆栈使用情况

    堆栈是以后进先出(LIFO)方式添加或删除数据的内存区域。 在RTOS中,每个线程都有一个单独的内存区用于堆栈。 在函数执行期间,数据可能会添加到堆栈的顶部;当函数退出时,它会从
    发表于 08-28 07:27

    RTX51微型实时内核资料

    RTX51 TINY是一个小型实时内核,专为代码大小是最重要因素的单芯片应用而设计。 RTX51微内核只需要900字节的代码空间,非常适合不需要RTOS特性的应用程序,如消息传递、信号
    发表于 08-12 06:18

    构建RTOS Kernel指南 (上)

    System). 简单来说,RTOS是一个调度一切可利用的资源完成实时任务,并控制所有实时任务协调一致运行的操作系统,或者说,其内核是一个任务管理的框架。 市面上已存有许多优秀的
    的头像 发表于 08-03 08:45 386次阅读
    构建<b class='flag-5'>RTOS</b> Kernel指南 (上)

    RTOS任务间通信为什么不用全局变量?

    RTOS任务间通信为什么不用全局变量?原因在于使用全局变量存在诸多弊端。
    发表于 07-05 09:06 421次阅读

    了解一下RTOS消息队列的应用

    基于RTOS的应用中,通常使用队列机制实现任务间的数据交互,一个应用程序可以任意数量的消息队列,每个消息队列都有自己的用途。 什么是消息队列? 消息队列是一个内核对象(即数据结构),通过它可以将
    发表于 06-12 14:17

    RTOS中的任务是线程?进程?还是协程?

    今天为大家讲解讲解OS中的线程、进程和协程的这几个概念,同时一起看看RTOS中的任务到底属于哪一种。
    的头像 发表于 06-04 17:19 1226次阅读
    <b class='flag-5'>RTOS</b>中的<b class='flag-5'>任务</b>是线程?进程?还是协程?

    CMSIS RTOS任务管理

    RTOS
    橙群微电子
    发布于 :2023年05月29日 10:06:26

    嵌入式RTOS任务栈 和 系统栈

    简介明了带你了解嵌入式RTOS任务栈 和 系统栈
    的头像 发表于 05-16 09:57 2050次阅读
    嵌入式<b class='flag-5'>RTOS</b>的 <b class='flag-5'>任务</b>栈 和 系统栈