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