在FreeRTOS上移植了mmwavelink后出现的bug(多级函数调用造成的栈溢出)

一.环境

硬件环境: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来保存不需要栈空间,所以参数有点多

因此,用指针比变量省栈,函数调用级数越多,栈越用的多.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值