2年了 sys/bios总是堆栈溢出,请帮忙看看哪里问题,谢谢 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 8853|回复: 12
打印 上一主题 下一主题

[未解决] 2年了 sys/bios总是堆栈溢出,请帮忙看看哪里问题,谢谢

[复制链接]

12

主题

40

帖子

167

积分

注册会员

Rank: 2

积分
167
跳转到指定楼层
楼主
发表于 2017-5-4 16:06:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在用sys/bios写了一个程序,隔三差五会出现堆栈溢出,每次修改一下字符串声明之类的就会好了,但现在程序写了比较大了,出问题的概率越来越大,怀疑是堆栈分配问题,或者 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年了,希望这次能解决,非常感谢









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
www.52dsp.com 待售,欢迎联系
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2017-5-4 16:34:51 | 只看该作者
既然是任务栈溢出 那就把溢出的任务的栈改大一点试试

TaskParams.stackSize = 4096;

你那样改的话把所有任务的栈都改大了 然后系统栈就不够用了
回复 支持 反对

使用道具 举报

12

主题

40

帖子

167

积分

注册会员

Rank: 2

积分
167
板凳
 楼主| 发表于 2017-5-4 17:17:22 | 只看该作者
希望缄默 发表于 2017-5-4 16:34
既然是任务栈溢出 那就把溢出的任务的栈改大一点试试

TaskParams.stackSize = 4096;

那个所谓的溢出任务 根本就不是一个任务,是内存里面其他的野指针,图中圈出来的

增加堆栈这些最常见的招式都用过了

现在的现象是启用 idle任务就堆栈溢出,禁用就没问题,这个问题不是堆栈设置导致的,现在堆栈最小的是32K,最大的6M

点评

看内存地址挺正常的 不过具体要看你的 CMD 文件和 MAP 文件  详情 回复 发表于 2017-5-5 11:33
www.52dsp.com 待售,欢迎联系
回复 支持 反对

使用道具 举报

12

主题

40

帖子

167

积分

注册会员

Rank: 2

积分
167
地板
 楼主| 发表于 2017-5-4 17:23:29 | 只看该作者
有时候 加上 BIOS.libType = BIOS.LibType_Custom; 这句重新生成bios就可以解决问题,有时候有需要改其他的地方

总之是不知道哪个地方就会出问题,非常头大

点评

有可能是药不对症  详情 回复 发表于 2017-5-5 11:33
www.52dsp.com 待售,欢迎联系
回复 支持 反对

使用道具 举报

12

主题

40

帖子

167

积分

注册会员

Rank: 2

积分
167
5#
 楼主| 发表于 2017-5-4 17:28:20 | 只看该作者

有一点是确定的 就是调用mmcsd驱动就会堆栈溢出
已经重新把原来8K的堆栈加到了128K,没什么效果
或者mmcsd驱动有bug?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

点评

那也有可能任务本身访问有问题 不一定是驱动的  详情 回复 发表于 2017-5-5 11:34
www.52dsp.com 待售,欢迎联系
回复 支持 反对

使用道具 举报

32

主题

97

帖子

2049

积分

金牌会员

Rank: 6Rank: 6

积分
2049
6#
发表于 2017-5-5 10:04:57 | 只看该作者
希望缄默 发表于 2017-5-4 16:34
既然是任务栈溢出 那就把溢出的任务的栈改大一点试试

TaskParams.stackSize = 4096;

请问任务栈和系统栈的总和是一定的吗?

点评

不啊 可以自己分配啊 系统栈在 Program.stack 配置 但是任务栈是在系统堆上分配的 由 bios.heapSize 或者 memory.heapSize 来配置  详情 回复 发表于 2017-5-5 11:36
回复 支持 反对

使用道具 举报

32

主题

97

帖子

2049

积分

金牌会员

Rank: 6Rank: 6

积分
2049
7#
发表于 2017-5-5 10:05:47 | 只看该作者
希望缄默 发表于 2017-5-4 16:34
既然是任务栈溢出 那就把溢出的任务的栈改大一点试试

TaskParams.stackSize = 4096;

还有系统栈是对应的谁的?
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
8#
发表于 2017-5-5 11:33:04 | 只看该作者
gongxd 发表于 2017-5-4 17:17
那个所谓的溢出任务 根本就不是一个任务,是内存里面其他的野指针,图中圈出来的

增加堆栈这些最常见的 ...

看内存地址挺正常的
不过具体要看你的 CMD 文件和 MAP 文件
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
9#
发表于 2017-5-5 11:33:27 | 只看该作者
gongxd 发表于 2017-5-4 17:23
有时候 加上 BIOS.libType = BIOS.LibType_Custom; 这句重新生成bios就可以解决问题,有时候有需要改其他的 ...

有可能是药不对症
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
10#
发表于 2017-5-5 11:34:17 | 只看该作者
gongxd 发表于 2017-5-4 17:28
有一点是确定的 就是调用mmcsd驱动就会堆栈溢出
已经重新把原来8K的堆栈加到了128K,没什么效果
或者mmcsd ...

那也有可能任务本身访问有问题 不一定是驱动的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-11 00:05 , Processed in 0.043058 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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