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.

[参考译文] RTOS/TMS320F28069:RTOS/TMS320F28069:

Guru**** 2342600 points
Other Parts Discussed in Thread: TMS320F28069, SYSBIOS
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/587443/rtos-tms320f28069-rtos-tms320f28069

器件型号:TMS320F28069
Thread 中讨论的其他器件: SYSBIOS

工具/软件:TI-RTOS

您好!

我正在使用系统 BIOS 6.45.1.29和 Code Composer Studio、版本:7.0.0.00043 (在 TMS320F28069上)。  

我正在使用以下.cfg 文件。

我想增加堆栈大小和堆大小。 我有足够的存储器、例如、我仅使用25%的 RAM、如存储器分配中所示。 但是、如果我将堆栈大小从256增加到512、堆栈溢出的情况会很奇怪。

我应该检查什么。 如果有任何指示、链接等、我将不胜感激  

谢谢  

Jawwad

----------------------------------------

VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
VAR 诊断= xdc.useModule('xdc.runtime.Diags');
VAR 错误= xdc.useModule('xdc.runtime.Error');
VAR 日志= xdc.useModule('xdc.runtime.Log');
VAR LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');
VAR Main = xdc.useModule('xdc.runtime.Main');
VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
VAR 系统= xdc.useModule('xdc.runtime.System');
var text = xdc.useModule('xdc.runtime.Text');

VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');

VAR Hwi = xdc.useModule('ti.sysbios.family.c28.Hwi');
VAR Boot = xdc.useModule('ti.catalog.c2800.init.Boot');

/*
*取消注释此行以全局禁用断言。
*所有模块继承'库'模块的默认值。 您
*可以使用 Module.common$按模块覆盖这些默认值。
*禁用断言将节省代码空间并提高运行时性能。
Defaults.common$.diags_ASSERT = Diags.always_off;
*

/*
*取消注释此行以防止模块名称加载到目标上。
*模块名称字符串放置在.const 段中。 设置此值
*将参数设置为 false 将节省.const 段中的空间。 误差和
*断言消息将包含"未知模块"前缀
实际模块名称的*。
Defaults.common$.namedModule = false;
*

/*
*最小化系统中的 EXIT 处理程序数组。 系统模块包括
*向 System_atexit()注册的函数数数组
*由 System_exit()调用。
*
System.maxAtexitHandlers = 4;

/*
*取消注释此行以禁用错误打印功能。
*禁用此功能时,我们会丢失错误信息,因为错误是这样
*未打印。 如果禁用 raiseHook、则会节省一些代码空间
*由于 Error_print()函数,您的应用程序未使用 System_printf()
*调用 System_printf()。
error.raiseHook =空;
*

/*
*取消注释此行以防止 Error、Assert 和 Log 字符串成为字符串
*加载到目标上。 这些字符串放置在.const 段中。
*将此参数设置为 false 将节省.const 段中的空间。
*错误、断言和日志消息将打印原始 ID 和 args 而不是
*格式化的邮件。
text.isLoaded = false;
*

/*
*取消注释此行以禁用 SysMin 的字符输出
*程序退出时。 SysMin 向循环缓冲区写入字符。
*可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
SysMin。flushAtExit = false;
*

/*
* BIOS 模块将为系统创建默认堆。
*指定此默认堆的大小。
*
BIOS.heapSize = 0x400;

/*
*从源构建自定义 SYS/BIOS 库。
*
BIOS.libType = BIOS.LibType_Custom;

/*系统堆栈大小(由 ISR 和 Swi 使用)*/
program.stack = 0x400;

System_printf()的/*循环缓冲区大小*/
SysMin。bufSize = 0x400;

/*
*为整个系统创建并安装记录器
*
var logerBufParams = new LoggerBuf.Params();
LoggerBufParams.numEntry = 32;
var logger0 = LoggerBuf.create (logerBufParams);
Defaults.common$.logger = logger0;
Main.common$.diags_INFO = Diags.always_on;

System.SupportProxy = SysMin;

Task.defaultStackSize = 256;
boot.bootFromFlash = true;
boot.configurePll = false;
bios.cpufreq.lo = 90000000;
hwi.doarterAutoNestingSupport = false;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否正在使用 Tools->ROV 来查看堆栈溢出? 您是否可以将堆栈提升到真正的大容量(例如2048或4096)并再次运行该应用程序? 然后查看 ROV (请注意、您必须停止目标才能使 ROV 正常工作)。 什么是峰值(ROV->Tasks->Detailed)? Hwi 堆栈(ROV->Hwi->Module)会怎么样? 注意:您需要启用堆栈初始化才能获得此功能。 但默认情况下是开启的、因此根据您粘贴的.cfg、它是开启的。

    您是否为任务提供了堆栈? 如果是这样、堆可能太小。

    注意:Task.defaultStackSize = 256;仅在未在 Task_create 的 Task_Params 中指定大小时使用。 您能否粘贴用于创建任务的代码?

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    非常感谢您的详细答复。 非常感谢。  

    目前我使用3个任务。 这个数字将变为大约十几个。 我选择在运行期间创建这些任务、而不是使用 CCS 的.cfg 编辑器进行静态创建。

    我连续检查 ROV 和存储器使用情况。 任何任务使用的最大堆栈大约为188个字节。 现在 、我没有过流堆栈。 软件运行正常。 但是、如果我在  cfg 文件中将 Task.defaultStackSize = 256增大到 Task.defaultStackSize = 512、则堆栈溢出错误开始发生。

    我将通过执行一些递归调用来测试任务中的堆栈溢出。 但我也不清楚如何在任务中分配堆栈。 它是否来自堆区域。 等等 我能否控制它的最大限制。 我能不能对每个任务堆栈设定最大限制等。这些是我想到的一些问题。

    非常感谢您的帮助

    此致

    ------------------------------------------------------------------

    //任务创建  

    HVACSem = Semaphore_create (1、NULL、NULL);
    sem1 = Semaphore_create (1、NULL、NULL);
    ConsoleSemi = Semaphore_create (1、NULL、NULL);

    //任务由计时器触发

    Clock_Params_init (clkParams);
    clkParams.period = 40;//每4个时钟节拍
    clkParams.startFlag = true;//立即开始
    clock_create (clk0Fxn、2、&clkParams、NULL);

    Task_Params_init (&taskParams);
    taskParams.priority = 1;
    tsk1 = Task_create (Task1、&taskParams、NULL);

    Task_Params_init (&taskParams);
    taskParams.priority = 2;
    HVACTaskH = Task_create (HVACTask、&taskParams、NULL);

    Task_Params_init (&taskParams);
    taskParams.priority = 3;
    CTaskH = Task_create (任务、&taskParams、NULL);

    BIOS_start();/*不返回*/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您没有在 taskParams 变量中设置两个参数
    taskParams.stack
    taskParams.STACKSIZE

    由于您未设置 STACKSIZE 参数、它将获得默认值(即 Task.defaultStackSize 值)。 由于您未设置 stack 参数、因此任务模块将为您分配一个堆栈。 它来自默认系统堆(除非您设置 Task.defaultStackHeap)。 然后、它将从该堆中分配)。

    听起来、如果增加堆栈大小、就会获得内存分配 error...not a 堆栈溢出。 对于内存分配错误、您需要增加 BIOS.heapSize 或减少您正在进行的分配数量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    非常感谢。 现在它非常清楚。 默认的堆栈和堆关系非常清晰。  我将 设置 taskParams.stack 和 taskParams.STACKSIZE 以隐式设置堆栈、在 ROV 中查找堆栈溢出、然后调整相应任务的堆栈。 听起来非常强大。

    让我在周末尝试一下。

    此致

    Jawwad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的
    ToddMullanix
    都经过测试、工作正常。

    非常感谢您提供的准确答案。 感谢您、TI 是我们产品中值得信赖的合作伙伴。

    此致
    Jawwad