TI中文支持网
TI专业的中文技术问题搜集分享网站

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

Part Number:CC1310

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

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

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

 谢谢!!

Alex Zhang:

您好,关于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呢?

感谢!

,

Alex Zhang:

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

,

Alex Zhang:

要查看当前分配的最大任务堆栈大小,可以使用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了项目还是出现了任务创建失败的问题。还需要什么别的步骤吗?

,

Alex Zhang:

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

,

? ?:

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

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

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

,

Alex Zhang:

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

,

Alex Zhang:

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

,

Alex Zhang:

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

关于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 };

赞(0)
未经允许不得转载:TI中文支持网 » CC1310: 使用ti-rtos创建任务失败
分享到: 更多 (0)