搜索
bottom↓
回复: 10

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

[复制链接]

出0入0汤圆

发表于 2010-5-5 11:29:58 | 显示全部楼层 |阅读模式
我把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空间肯定有富余。

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-5-5 12:20:43 | 显示全部楼层
会不会是对齐的问题?既然挂掉,那么肯定是有原因的,查出来就好了。

出0入0汤圆

 楼主| 发表于 2010-5-5 14:10:04 | 显示全部楼层
偶的神呐,难道真是对齐的问题。
我试过了
#define IDLE_THREAD_STACK_SIZE 254         //正常运行
#define IDLE_THREAD_STACK_SIZE 256         //不能运行
#define IDLE_THREAD_STACK_SIZE 258         //正常运行

出0入0汤圆

发表于 2010-5-5 14:12:32 | 显示全部楼层
是的,栈必须要对齐的,而静态分配出来必须得对齐(动态的会自动做对齐)。

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

出0入0汤圆

 楼主| 发表于 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[IDLE_THREAD_STACK_SIZE];

出0入0汤圆

发表于 2010-5-5 23:23:24 | 显示全部楼层
唉,就是这种的对齐方式

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

出0入0汤圆

 楼主| 发表于 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.

这下彻底开源了

有时间的话,尝试一下。

出0入0汤圆

发表于 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")

出0入0汤圆

发表于 2010-8-5 18:04:57 | 显示全部楼层
其实 还有个最简单的办法
学ucos
设置的堆栈数组类型是uint32_t的 那么天然就是对齐的
当然了 那么设置堆栈大小的时候记得除个4就是了

出0入0汤圆

发表于 2010-8-5 18:14:26 | 显示全部楼层
#define ALIGN(n,bsize)    ( (n+bsize-1)/(bsize)*(bsize) )
#define ALIGN4(n)    ALIGN((n),4)

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

出0入0汤圆

发表于 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宏。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 08:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表