一.环境
硬件环境:STM32F411RET6
软件环境:IAR-8.3,FreeRTOS-v9.0
二.问题描述
在移植mmwavelink后在单步debug mmwavelink软件时发现在rlDevicePowerOn();函数后,运行打印函数卡死了.
三.问题解决
思路:单步debug,定位哪一步之后有问题,再注释掉该句看是否还有问题
按照这个思路最厚定位的结果是,进入到rlDriverInit(deviceMap,clientCb);函数就是出现这个问题
然后发现这个函数传入的参数是一个结构体变量而非指针,这样会增加栈的开销,然后就把IAR的icf文件栈加大,发现不好使,改成指针传入就没问题,到这里就又糊涂了
实在没辙就人工在main函数开始造了这个错误环境发现没问题,,,,更郁闷了....
巧合看到了FreeRTOS的宏定义文件的任务栈大小宏,于是改大了发现好使.又一次丢脸,,,,对RTOS还是不够深刻,没有理解任务栈和系统栈的区别
没有根本理解裸机和操作系统的区别,,,,由裸机编程转系统编程不易呀
下面介绍一下问题涉及到的知识点:
有操作系统和裸机下的堆栈设置不同---裸机下是在icf文件设置,操作系统是在任务栈设置
要明确出错是在裸机环境还是操作系统
函数调用以及多级函数调用都是在栈空间完成,调用之前都要保存形参和局部变量
假如如下代码
int bar(int c, int d, int e, int f, int g, int h)
{
int z = c + d + e + f + g + h;
return z;
}
int foo(int a, int b, int c, int d, int e, int f)
{
return bar(a, b, c, d, e, f);
}
int main(void)
{
foo(2, 3, 4, 5, 6, 7);
return 0;
}
由于ARM传参默认四个参数之后都由R0-R4来保存不需要栈空间,所以参数有点多
因此,用指针比变量省栈,函数调用级数越多,栈越用的多.