lgnq 发表于 2010-5-5 11:29:58

idel 线程堆栈大小改大了,系统反而挂掉了

我把RT_USING_HEAP注释掉了,如下
/* Using Dynamic Heap Management */
//#define RT_USING_HEAP

list_thread()发现idel线程堆栈大小为0x80,最大使用了0x76,感觉有点紧巴巴。

于是在idel.c中修改idel线程堆栈大小为0x100,如下:
#define IDLE_THREAD_STACK_SIZE        256

但是修改完后,系统反而无法运行了,这是为什么?

PS:RAM空间肯定有富余。

ffxz 发表于 2010-5-5 12:20:43

会不会是对齐的问题?既然挂掉,那么肯定是有原因的,查出来就好了。

lgnq 发表于 2010-5-5 14:10:04

偶的神呐,难道真是对齐的问题。
我试过了
#define IDLE_THREAD_STACK_SIZE 254         //正常运行
#define IDLE_THREAD_STACK_SIZE 256         //不能运行
#define IDLE_THREAD_STACK_SIZE 258         //正常运行

ffxz 发表于 2010-5-5 14:12:32

是的,栈必须要对齐的,而静态分配出来必须得对齐(动态的会自动做对齐)。

我加了个ALIGN的宏(rtdef.h),但是IAR编译器因为它太古怪了,不知道应该如何做代码兼容。

lgnq 发表于 2010-5-5 16:28:34

现在貌似OK了。

我用的是IAR EW M16C编译环境。

我在定义每个线程堆栈的前面增加了#pragma data_alignment=4(强制4字节对齐)如下:

#pragma data_alignment=4
static rt_uint8_t rt_thread_stack;

ffxz 发表于 2010-5-5 23:23:24

唉,就是这种的对齐方式

这个方式和GCC,armcc都不兼容,代码上非常难处理,lgnq有什么好办法?还有上次那个IAR编译的符号弱化也是的,没对应的。。。

lgnq 发表于 2010-5-6 11:35:08

最彻底的方法就是换一个开发环境

http://www.kpitgnutools.com/index.php
KPIT GNU Tools are free, user-friendly GNU toolchains for Renesas micros with free customer support across the world.

这下彻底开源了

有时间的话,尝试一下。

draapho 发表于 2010-8-5 13:51:15

之前用IAR宏定义中断函数也是同样问题。后参考他人的宏定义,方法如下:

// 中断函数定义
#define   _PRAGMA_STR(A)         _Pragma(#A)
#define   PRAGMA_STR(A)            _PRAGMA_STR(A)
#define   __VECTOR__(A)            vector=A
#define   SIGNAL(A)                \
          PRAGMA_STR(__VECTOR__(A))\
          __interrupt void SIGNAL##_##A(void)

========================================================

这样就把IAR的中断函数定义
#pragma vector=TIMER1_COMPA_vect
__interrupt void SIGNAL_TIMER1_COMPA_vect(void)

简化成了
SIGNAL(TIMER1_COMPA_vect)

=======================================================
应该可供align的方法参考。

IAR参考手册中有关于_Pragma()的介绍:
_Pragma()
The preprocessor operator _Pragma can be used in defines and has the equivalent effect of the #pragma directive.

The syntax is:_Pragma("string")

mail2li 发表于 2010-8-5 18:04:57

其实 还有个最简单的办法
学ucos
设置的堆栈数组类型是uint32_t的 那么天然就是对齐的
当然了 那么设置堆栈大小的时候记得除个4就是了

snoopyzz 发表于 2010-8-5 18:14:26

#define ALIGN(n,bsize)    ( (n+bsize-1)/(bsize)*(bsize) )
#define ALIGN4(n)    ALIGN((n),4)

设个宏来手动对齐,我觉得应该可以吧

ffxz 发表于 2010-8-6 08:05:57

回复【7楼】draapho
之前用iar宏定义中断函数也是同样问题。后参考他人的宏定义,方法如下:
// 中断函数定义
#define   _pragma_str(a)         _pragma(#a)
#define   pragma_str(a)            _pragma_str(a)
#define   __vector__(a)            vector=a
#define   signal(a)                \
          pragma_str(__vector__(a))\
          __interrupt void signal##_##a(void)
========================================================
这样就把iar的中断函数定义
#pragma vector=timer1......
-----------------------------------------------------------------------

谢谢。IAR的宏经过lgnq建议已经改成类似的方式,在新版本中已经包含了这个ALIGN宏。
页: [1]
查看完整版本: idel 线程堆栈大小改大了,系统反而挂掉了