完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
[tr]现在用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.sy***ios.knl.Task"); var BIOS = xdc.useModule("ti.sy***ios.BIOS"); var ECM = xdc.useModule("ti.sy***ios.family.c64p.EventCombiner"); var System = xdc.useModule("xdc.runtime.System"); var Cache = xdc.useModule("ti.sy***ios.hal.Cache"); var Semaphore = xdc.useModule("ti.sy***ios.knl.Semaphore"); var Hwi = xdc.useModule("ti.sy***ios.hal.Hwi"); var Queue = xdc.useModule("ti.sy***ios.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.sy***ios.family.c64p.Hwi"); var Timer = xdc.useModule('ti.sy***ios.timers.timer64.Timer'); var Load = xdc.useModule('ti.sy***ios.utils.Load'); var ti_sy***ios_io_GIO = xdc.useModule('ti.sy***ios.io.GIO'); var ti_sy***ios_io_GIO0 = xdc.useModule('ti.sy***ios.io.GIO'); var ti_sy***ios_io_GIO1 = xdc.useModule('ti.sy***ios.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.sy***ios.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.sy***ios.interfaces.ITimer").StartMode_USER; timer0Params.gpioDatDir.gpio_diro12 = 1; timer0Params.controlInit.cp = 1; timer0Params.period = 1500; timer0Params.periodType = xdc.module("ti.sy***ios.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_sy***ios_io_GIO.addDeviceMeta("/i2c1", iomFxns, initFxn, deviceId, deviceParams); var iomFxnsu0 = "Uart_IOMFXNS"; var initFxnu0 = "user_uart_init0"; var deviceParamsu0 = "uartParams0"; var deviceIdu0 = 0; ti_sy***ios_io_GIO1.addDeviceMeta("/uart0", iomFxnsu0, initFxnu0, deviceIdu0, deviceParamsu0); var iomFxnsu1 = "Uart_IOMFXNS"; var initFxnu1 = "user_uart_init1"; var deviceParamsu1 = "uartParams1"; var deviceIdu1 = 1; ti_sy***ios_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年了,希望这次能解决,非常感谢 [/tr] |
|
相关推荐
13个回答
|
|
|
|
|
|
那个所谓的溢出任务 根本就不是一个任务,是内存里面其他的野指针,图中圈出来的 增加堆栈这些最常见的招式都用过了 现在的现象是启用 idle任务就堆栈溢出,禁用就没问题,这个问题不是堆栈设置导致的,现在堆栈最小的是32K,最大的6M 看内存地址挺正常的不过具体要看你的 CMD 文件和 MAP 文件 |
|
|
|
有时候 加上 BIOS.libType = BIOS.LibType_Custom; 这句重新生成bios就可以解决问题,有时候有需要改其他的地方
总之是不知道哪个地方就会出问题,非常头大 有可能是药不对症 |
|
|
|
有一点是确定的 就是调用mmcsd驱动就会堆栈溢出 已经重新把原来8K的堆栈加到了128K,没什么效果 或者mmcsd驱动有bug? 那也有可能任务本身访问有问题 不一定是驱动的 |
|
|
|
请问任务栈和系统栈的总和是一定的吗? 不啊 可以自己分配啊系统栈在 Program.stack 配置但是任务栈是在系统堆上分配的 由 bios.heapSize 或者 memory.heapSize 来配置 |
|
|
|
|
|
|
|
看内存地址挺正常的 不过具体要看你的 CMD 文件和 MAP 文件 |
|
|
|
|
|
|
|
|
|
|
|
dposadksapdsakd 发表于 2020-5-12 20:18 .pcb{margin-right:0} 不啊 可以自己分配啊 系统栈在 Program.stack 配置 但是任务栈是在系统堆上分配的 由 bios.heapSize 或者 memory.heapSize 来配置r |
|
|
|
这个问题的触发方式比较奇怪,如果任务有问题应该是一直有问题,不知道您碰到过这种问题么,谢谢 r 我遇到的一般都是真的堆栈设置的小了 |
|
|
|
|
|
|
|
你好,请问此问题你找到根源了吗?
|
|
|
|
只有小组成员才能发言,加入小组>>
基于RK3588J的6路MIPI CSI视频采集案例分享,多路视频系统必看!
1211 浏览 0 评论
589 浏览 0 评论
【创龙科技TL570x-EVM开发板试用体验】 GStreamer 功能测评
8560 浏览 8 评论
【创龙科技TL570x-EVM开发板试用体验】创龙TL5708-EVM开发板入手使用体验评测
6575 浏览 0 评论
【创龙TLZ7x-EasyEVM评估板试用连载】+3.环境搭建vmware+ubuntu详细教程(二)
1397 浏览 0 评论
831浏览 0评论
【创龙科技AM64x开发板试用体验】创龙科技AM64x开发板及核心板介绍
827浏览 0评论
【创龙科技AM64x开发板试用体验】创龙科技AM64x开发板--板卡调试软件安装
845浏览 0评论
【创龙科技AM64x开发板试用体验】AM64x开发板开箱测评
835浏览 0评论
求助! 关于使用自制底板插入创龙IMX8MM 核心板无法启动问题
489浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 17:03 , Processed in 0.775953 second(s), Total 71, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号