This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CC1310: 使用ti-rtos创建任务失败

Part Number: CC1310

最近在项目中创建任务发现可能是由于无法分配足够的task stack size而创建任务失败的问题。

项目中我先创建了一个1024的任务,然后在这个任务中又去创建了两个512的任务,在这时程序没有问题,任务都能正常创建,但如果我要是再创建一个512的任务就会失败。

想请问我该如何查看最大可用的task stack size大小,能否修改这个值?

 谢谢!!

  • 您好,关于task stack size的大小是可以修改的,具体如何查看的方法,我为您提供了以下链接,希望可以帮助到您。

    https://e2echina.ti.com/support/wireless-connectivity/sub-1-ghz/f/sub-1-ghz-forum/756090/cc1310

    这个帖子里面有很详细的介绍,谢谢

  • 你好,我查看了您提供的链接,其中回复的内容为如何查看具体任务在运行中的可用stack size, 单个任务在创建任务的时候我知道是可以设置stack size的。

    而我这边碰到的问题看上去像是总共可供程序使用的task stack size为2.5k左右,因为我只能建立3个task,累计task stack size为2k(还有一个idle task默认512的stack size)当我想继续创建任务的时候就会失败。

    我想问的是 是否存在这个2.5k左右的可供task使用的总stack size参数,如果有的话在哪修改? 如果没有的话 那为何我只能建立累计2k左右的task呢?

    感谢!

  • 您好,我已经跟进您的问题,这需要一些时间来回复您

  • 要查看当前分配的最大任务堆栈大小,可以使用ROV:

    在上面的链接中有提到的,这个方法

    但实际上,要检查总堆栈限制,您可以查看编译时内存分配工具:这个工具在view中选择这个memory

    在这个项目(互斥)中,我们看到可用的堆总数为4096,分配的堆栈大小为1024。

    但您可以在链接器文件中对此进行配置,如下所示:

    因此,你能试着根据自己的需求调整这些价值观,并告诉我它是否有效吗?

  • 感谢您的认真回复,有个地方我之前搞错了,需要纠正,程序中还包含了一个1k的消息队列和一个1个字节的消息队列。但是还是存在几个问题。

    1. 由于我使用的是iar开发环境,所以不知能否通过iar查看rov信息。因为我并没有找到能在iar中查看rov信息的方法,如果可以的话麻烦您提供一下使用链接谢谢!

    我理解在iar开发环境应该是去修改项目中的CC1310_LAUNCHXL_TIRTOS.icf文件。其中相关内容如下所示:

    /*
    * Define CSTACK block to contain .stack section. This enables the IAR IDE
    * to properly show the stack content during debug. Place stack at end of
    * retention RAM, do not initialize (initializing the stack will destroy the
    * return address from the initialization code, causing the processor to branch
    * to zero and fault)
    */
    define symbol STACKSIZE = 1024;
    define block CSTACK with alignment = 8, size = STACKSIZE { section .stack };
    place at end of RAM_region { block CSTACK };
    do not initialize { section .stack, section .noinit};
    
    /* Export stack top symbol. Used by startup file */
    define exported symbol STACK_TOP = RAM_end__ + 1;
    
    /* HeapMem Primary Heap configuration */
    define symbol HEAPSIZE = 0x1000;
    define block primary_heap with alignment = 8, size = HEAPSIZE { };
    
    /* Place heap just before CSTACK */
    place at end of RAM_region { block primary_heap };

    2. 关于icf文件的相关信息,我是这么理解的您看对不对,一开始的stack size只是用来设置CSTACK的,而CSTACK是用于在调试时查看stack信息的(不知该如何查看呢?)

    后面的HEAPSIZE其实才是用于task的可用stack?

    3.. 加上两个消息队列的大小,大约会用掉3.5k+的大小,这样的话创建任务失败就能解释通了,但我尝试了将HEAPSIZE 从0x1000改到0x2000并rebuild了项目还是出现了任务创建失败的问题。还需要什么别的步骤吗?

  • 您好,我将会跟进您的问题,下周一回为您回复。谢谢

  • 关于为什么修改iar中的icf文件不起作用的原因找到了。是因为生成的iar工程默认使用的是sdk文件路径下的icf文件,而不是项目路径下的icf文件(这一点感觉官方做的并不好,会让人误以为直接修改项目中的icf文件即可)。将iar中icf文件的路径改为当前项目下的路径即可。这样修改HEAPSIZE就能生效了

    不过关于icf文件中CSTACK和primary_heap都是使用place at end of RAM_region。这样不会有冲突吗?

    还有iar中查看ROV信息的相关链接还是希望您能提供一下,麻烦 谢谢!

  • 您好,您的问题已经更新跟进了

  • 您好,关于IAR的应用方法,建议您这边到官方论坛去了解,我们这边只提供TI ccs的技术支持,谢谢

  • 您好,最近问题得到了新的更新回复希望可以帮助到您,谢谢

    关于ROV,其实在IAR里不叫ROV,叫TI-RTOS意识,你会在IAR的导航栏上找到它:

    再次使用互斥锁示例,您可以看到信号量计数,例如:

    关于CSTACK问题,mutex.map有答案:

    *******************************************************************************
    *** PLACEMENT SUMMARY
    ***
    
    "A0":  place at address 0x0 { ro section .intvec };
    "A1":  place at end of [from 0x0 to 0x1'ffff] { ro section .ccfg };
    "P1":  place in [from 0x0 to 0x1'ffff] { ro };
    define block CSTACK with size = 1K, alignment = 8 { section .stack };
    "A2":  place at end of [from 0x2000'0000 to 0x2000'4fff] { block CSTACK };