F28035使用时出现以下问题:芯片使用仿真器调试时可以正常运行,实际运行时出现程序进入非法中断;
最终定位到原因为使用的ucos操作系统任务SCI任务堆栈分配问题;
但在对操作系统堆栈和CMD文件修改时遇到如下问题:
1. CMD文件相同,操作系统任务堆栈在0x50~0xD0程序正常,但堆栈在0xE0~0x100时反而不正常;
2.操作系统堆栈同样都是0x100,但单独分配成一块RAM时不正常,分配到一大块RAM时正常;
3. 操作系统任务少时正常(但出问题的SCI任务堆栈大小一样);
具体描述如下:
(1) KERNELSTK : origin = 0x008000, length = 0x000400 /× CMD文件中给操作系统分配了0x400空间×/
操作系统有5个任务,SCI任务分配0x80大小;使用ucos的堆栈使用函数测试任务使用堆栈大小,最大在0x50以下;
但是如果将SCI任务堆栈分配0x50~0xD0大小是,程序正常,不会跑飞(进illegal中断),如果SCI任务堆栈分配0xE0~0x100或更大,程序跑飞;
问题:实际SCI使用堆栈未超过0x100,但是如果堆栈分配在0x100,程序跑飞;分配在0x50~0xD0反而可以正常运行???
是否是由于RAM分配不按顺序导致?
(2)如果ucos操作系统中SCI任务大小不修改,仍使用0x100,把CMD文件中KERNELSTK的声明到更大RAM中,程序也可以正常运行;
情况1:操作系统中任务堆栈大小不变,将操作系统任务堆栈单独分配一块RAM区,程序跑飞
F28035 部分RAM资源映射如下:


相关部分CMD如下:
MEMORY
{
PAGE 1 : RAMM0 : origin = 0x000000, length = 0x000100 KERNELSTK : origin = 0x008000, length = 0x000400
RAMM1 : origin = 0x000100, length = 0x000700
RAML : origin = 0x008400, length = 0x001000
}
SECTIONS
{
.stack : > RAMM0 PAGE = 1 .ebss : > RAML PAGE = 1 .esysmem : > RAMM1 PAGE = 1 kernelStack : > KERNELSTK PAGE = 1
}
情况2:操作系统中任务堆栈大小不变,将操作系统任务堆栈与ebss同使用RAML,程序正常运行;
MEMORY
{
PAGE 1 :
RAMM0 : origin = 0x000000, length = 0x000100
RAMM1 : origin = 0x000100, length = 0x000700
RAML : origin = 0x008000, length = 0x001400
}
SECTIONS
{
.stack : > RAMM0 PAGE = 1
.ebss : > RAML PAGE = 1
.esysmem : > RAMM1 PAGE = 1
kernelStack : > RAML PAGE = 1
}
请专家帮忙解释,谢谢!
Linda:
您好!
建议将程序中堆栈空间加大一些试一下。
F28035使用时出现以下问题:芯片使用仿真器调试时可以正常运行,实际运行时出现程序进入非法中断;
最终定位到原因为使用的ucos操作系统任务SCI任务堆栈分配问题;
但在对操作系统堆栈和CMD文件修改时遇到如下问题:
1. CMD文件相同,操作系统任务堆栈在0x50~0xD0程序正常,但堆栈在0xE0~0x100时反而不正常;
2.操作系统堆栈同样都是0x100,但单独分配成一块RAM时不正常,分配到一大块RAM时正常;
3. 操作系统任务少时正常(但出问题的SCI任务堆栈大小一样);
具体描述如下:
(1) KERNELSTK : origin = 0x008000, length = 0x000400 /× CMD文件中给操作系统分配了0x400空间×/
操作系统有5个任务,SCI任务分配0x80大小;使用ucos的堆栈使用函数测试任务使用堆栈大小,最大在0x50以下;
但是如果将SCI任务堆栈分配0x50~0xD0大小是,程序正常,不会跑飞(进illegal中断),如果SCI任务堆栈分配0xE0~0x100或更大,程序跑飞;
问题:实际SCI使用堆栈未超过0x100,但是如果堆栈分配在0x100,程序跑飞;分配在0x50~0xD0反而可以正常运行???
是否是由于RAM分配不按顺序导致?
(2)如果ucos操作系统中SCI任务大小不修改,仍使用0x100,把CMD文件中KERNELSTK的声明到更大RAM中,程序也可以正常运行;
情况1:操作系统中任务堆栈大小不变,将操作系统任务堆栈单独分配一块RAM区,程序跑飞
F28035 部分RAM资源映射如下:


相关部分CMD如下:
MEMORY
{
PAGE 1 : RAMM0 : origin = 0x000000, length = 0x000100 KERNELSTK : origin = 0x008000, length = 0x000400
RAMM1 : origin = 0x000100, length = 0x000700
RAML : origin = 0x008400, length = 0x001000
}
SECTIONS
{
.stack : > RAMM0 PAGE = 1 .ebss : > RAML PAGE = 1 .esysmem : > RAMM1 PAGE = 1 kernelStack : > KERNELSTK PAGE = 1
}
情况2:操作系统中任务堆栈大小不变,将操作系统任务堆栈与ebss同使用RAML,程序正常运行;
MEMORY
{
PAGE 1 :
RAMM0 : origin = 0x000000, length = 0x000100
RAMM1 : origin = 0x000100, length = 0x000700
RAML : origin = 0x008000, length = 0x001400
}
SECTIONS
{
.stack : > RAMM0 PAGE = 1
.ebss : > RAML PAGE = 1
.esysmem : > RAMM1 PAGE = 1
kernelStack : > RAML PAGE = 1
}
请专家帮忙解释,谢谢!
user1498041:
回复 Linda:
你好,将SCI任务改大为程序正常,之前问题主要是下面几个:(当前解决方案是,删除不重要任务,同时将SCI任务堆栈改大,问题解决),
但仍有以下疑问???希望了解
(1)CMD文件相同,修改SCI任务堆栈在0x50~0xD0程序正常,但堆栈在0xE0~0x100时反而不正常;
说明:(用Ucos自带堆栈测试,测试最大使用<0x50,配置小于0x50程序必跑飞)
(2)修改CMD文件,SCI任务堆栈大小不变,仍为0x100,如果将操作系统堆栈单独分配成一块RAM时不正常,
与其他一起分配到一大块RAM时正常,这时SCI任务堆栈在0x50~0x100都正常;
(3)CMD文件不修改,SCI任务堆栈大小不变,将ucos中一个不重要任务删除,程序也正常;
之前看TI的帖子,有TI工程师说DSP RAM分配是不按顺序分配,一般会分配更大留有一定裕量,但现在问题是好像有点似懂非懂说不清感觉,
TI有没有RAM资源使用说明,谢谢!!!
TI中文支持网




