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空间肯定有富余。 会不会是对齐的问题?既然挂掉,那么肯定是有原因的,查出来就好了。 偶的神呐,难道真是对齐的问题。
我试过了
#define IDLE_THREAD_STACK_SIZE 254 //正常运行
#define IDLE_THREAD_STACK_SIZE 256 //不能运行
#define IDLE_THREAD_STACK_SIZE 258 //正常运行 是的,栈必须要对齐的,而静态分配出来必须得对齐(动态的会自动做对齐)。
我加了个ALIGN的宏(rtdef.h),但是IAR编译器因为它太古怪了,不知道应该如何做代码兼容。 现在貌似OK了。
我用的是IAR EW M16C编译环境。
我在定义每个线程堆栈的前面增加了#pragma data_alignment=4(强制4字节对齐)如下:
#pragma data_alignment=4
static rt_uint8_t rt_thread_stack; 唉,就是这种的对齐方式
这个方式和GCC,armcc都不兼容,代码上非常难处理,lgnq有什么好办法?还有上次那个IAR编译的符号弱化也是的,没对应的。。。 最彻底的方法就是换一个开发环境
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.
这下彻底开源了
有时间的话,尝试一下。 之前用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") 其实 还有个最简单的办法
学ucos
设置的堆栈数组类型是uint32_t的 那么天然就是对齐的
当然了 那么设置堆栈大小的时候记得除个4就是了 #define ALIGN(n,bsize) ( (n+bsize-1)/(bsize)*(bsize) )
#define ALIGN4(n) ALIGN((n),4)
设个宏来手动对齐,我觉得应该可以吧 回复【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]