This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教 局部字符串变量堆栈溢出问题

Other Parts Discussed in Thread: SYSBIOS

A:
static        char msg[]="System started!\r\n";
//发送启动测试信息
void MSg_sendStartMsg()
{
        ComSndBytes_CSL_COM1(msg,sizeof(msg)-1);
}

B:
//发送启动测试信息
void MSg_sendStartMsg()
{     
      char msg[]="System started!\r\n";
        ComSndBytes_CSL_COM1(msg,sizeof(msg)-1);
}

上面A B两种写法,  ComSndBytes_CSL_COM1只是发送数组

A种写法运行不报错,B种写法bios一运行就提示
ti.sysbios.knl.Task: line 368: E_stackOverflow: Task 0xc2334750 stack overflow.
xdc.runtime.Error.raise: terminating execution

B种写法 栈已经改的很大了

  • 而且 Task 0xc2334750 也是不对的 ,没有这个task地址

  • 两年了问题还没解决!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    苍天啊,谁能帮帮我!

  • 看看B写法,msg被分配到什么地址了

    然后扩大栈地址

    线程和系统栈可以单独配

  • 上面是2年前的问题,当时就按照不报错的写了,

    用以前修改一下字符串声明之类的就会好了,但现在程序写了比较大了,编译后的bin文件有300KB,出问题的概率越来越大,怀疑是堆栈分配问题,或者 sys/bios 和编译器有 bug,我们现在准备量产,但是这个问题一直解决不了是个隐患。

    现在出现堆栈溢出报错如下:


    代码在上次可用的基础上修改非常少,都没有用到堆栈,后来多处查找原因,有推荐把 app.cfg 中修改 Task.enableIdleTask = false,
    就是取消 Idle 任务,现在倒不出错误了


    出问题时机是启动 mmcsd 驱动的时候就会堆栈溢出,查看里面驱动是 dda_mmcsdbios.c 中 第900 行
        if (TRUE != Semaphore_pend(gMmcsdCallbackSem, BIOS_WAIT_FOREVER))
    运行到这句就堆栈溢出。
    提示的任务也不是定义的任务,好像是飞掉了

    下面是 app.cfg 文件内容,是有问题的


    var Task        = xdc.useModule("ti.sysbios.knl.Task");
    var BIOS        = xdc.useModule("ti.sysbios.BIOS");
    var ECM         = xdc.useModule("ti.sysbios.family.c64p.EventCombiner");
    var System      = xdc.useModule("xdc.runtime.System");
    var Cache       = xdc.useModule("ti.sysbios.hal.Cache");
    var Semaphore   = xdc.useModule("ti.sysbios.knl.Semaphore");
    var Hwi         = xdc.useModule("ti.sysbios.hal.Hwi");
    var Queue       = xdc.useModule("ti.sysbios.knl.Queue");
    var Main        = xdc.useModule('xdc.runtime.Main');
    var SysStd      = xdc.useModule('xdc.runtime.SysStd');
    var Assert      = xdc.useModule('xdc.runtime.Assert');
    var Diags       = xdc.useModule('xdc.runtime.Diags');
    var c64Hwi      = xdc.useModule("ti.sysbios.family.c64p.Hwi");
    var Timer = xdc.useModule('ti.sysbios.timers.timer64.Timer');
    var Load = xdc.useModule('ti.sysbios.utils.Load');
    var ti_sysbios_io_GIO = xdc.useModule('ti.sysbios.io.GIO');
    var ti_sysbios_io_GIO0 = xdc.useModule('ti.sysbios.io.GIO'); 
    var ti_sysbios_io_GIO1 = xdc.useModule('ti.sysbios.io.GIO'); 

    Main.common$.diags_ASSERT = Diags.ALWAYS_ON;
    Main.common$.diags_INTERNAL = Diags.ALWAYS_ON;

    System.SupportProxy = SysStd;

    BIOS.heapSize = 33554432;

    Program.stack = 5242880;

    ECM.eventGroupHwiNum[0] = 7;
    ECM.eventGroupHwiNum[1] = 8;
    ECM.eventGroupHwiNum[2] = 9;
    ECM.eventGroupHwiNum[3] = 10;

    Program.sectMap[".text"] = "DDR";

    var HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    BIOS.heapTrackEnabled = false;
    Program.sectMap[".my_sect_ddr"] = new Program.SectionSpec();
    Program.sectMap[".my_sect_ddr"].loadSegment = "DDR";
    var timer0Params = new Timer.Params();
    timer0Params.instance.name = "timer2";
    timer0Params.startMode = xdc.module("ti.sysbios.interfaces.ITimer").StartMode_USER;
    timer0Params.gpioDatDir.gpio_diro12 = 1;
    timer0Params.controlInit.cp = 1;
    timer0Params.period = 1500;
    timer0Params.periodType = xdc.module("ti.sysbios.interfaces.ITimer").PeriodType_COUNTS;
    timer0Params.controlInit.tien = 0;
    timer0Params.extFreq.lo = 12288000;
    Program.global.timer2 = Timer.create(2, null, timer0Params);
    Load.hwiEnabled = false;
    Load.swiEnabled = false;
    Timer.intFreqs[2].lo = 24000000;



    var iomFxns = "I2c_IOMFXNS";
    var initFxn = "user_i2c_init";
    var deviceParams = "i2cParams1";
    var deviceId = 1;
    ti_sysbios_io_GIO.addDeviceMeta("/i2c1", iomFxns, initFxn, deviceId, deviceParams);


    var iomFxnsu0 = "Uart_IOMFXNS";
    var initFxnu0 = "user_uart_init0";
    var deviceParamsu0 = "uartParams0";
    var deviceIdu0 = 0;
    ti_sysbios_io_GIO1.addDeviceMeta("/uart0", iomFxnsu0, initFxnu0, deviceIdu0, deviceParamsu0);

    var iomFxnsu1 = "Uart_IOMFXNS";
    var initFxnu1 = "user_uart_init1";
    var deviceParamsu1 = "uartParams1";
    var deviceIdu1 = 1;
    ti_sysbios_io_GIO1.addDeviceMeta("/uart1", iomFxnsu1, initFxnu1, deviceIdu1, deviceParamsu1);


    Task.defaultStackSize = 32768;
    Task.idleTaskStackSize = 32768;
    BIOS.heapSection = "heap";
    Program.heap = 33554432;
    Program.sectMap["heap"] = new Program.SectionSpec();
    Program.sectMap["heap"].loadSegment = "DDR";


    Task.enableIdleTask = true;
    Task.idleTaskVitalTaskFlag = true;


    // 调试用
    BIOS.libType = BIOS.LibType_Custom;
    print(BIOS.customCCOpts);

    //=================================================
    如果修改为 Task.enableIdleTask = false; 即可不出现堆栈溢出的问题。
    这只是其中一种修改方法,有时候修改一下字符串常量也可以没问题,过去把 sprintf 库、mmcsd 驱动、iic 驱动都重新编译过暂时解决了堆栈溢出的问题。
    怀疑是代码或变量常量在内存位置变了才引发问题


    这个问题已经困扰我们 2 年了,希望能解决,非常感谢

  • http://e2e.ti.com/support/embedded/tirtos/f/355/p/241947/847134#pi317008=2

    运行不存在的线程

  • 我的程序还没运行到中断就出错了,应该不是这个问题