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.

[参考译文] CCS/CC1352R:在 Error_PolicySpin 中结束的代码

Guru**** 2524460 points
Other Parts Discussed in Thread: CC1352R, SYSBIOS, CC2640R2F, CC2650

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/882218/ccs-cc1352r-code-ending-up-in-the-error_policyspin

器件型号:CC1352R
Thread 中讨论的其他器件: SYSBIOSCC2640R2FCC2650

工具/软件:Code Composer Studio

您好!

我有一些(我认为是内存)错误、根据我创建内核对象的方式、它的表现方式会有所不同。 在我的当前代码中、我很快就会进入自旋循环、这是一个进步;在我陷入某些随机的"装配体"文件之前。

现在、我不知道如何从这一点取得进展。 我想了解导致此行为的原因。 那么、我该如何处理呢? Stack-track 不提供任何(对我而言)有用信息:

非常感谢您提供有关如何调试问题的任何建议。 代码对于4个以上的任务来说非常复杂、因此有点难粘贴。

请注意、ROM 中没有代码、出于某种原因、HeapTrack 不会显示在 ROV 中。 我在.cfg 文件中将其 eneded、我真的想查看这是否可以提供任何线索、但出于某种原因未显示?

谢谢、

Robert

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

    您好、Robert、  

    为了帮助您解决问题、我需要一些更多信息。 您使用的是哪个版本的 SDK? 您使用的是哪个项目、您进行了哪些修改? 您使用的是 LaunchPad 还是定制板?

    谢谢、  
    ELIN

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

    您好、Elin、

    感谢您的回复。 我在具有 SDK 版本3.40.0和 XDCTools 3.60.1.27的 LaunchPad 上使用 CC1352R。 实际上、代码现在在以前没有的地方失败、我发现它是 System_printf 崩溃。 以下代码崩溃:

    main.c:

    #define TASKSTACKSIZE 512

    Task_handle testHandle;
    静态 uint8_t testStack[TASKSTACKSIZE];

    静态空 testFxn (UARg arg0、UARg arg1){
    int x = 10;
    int y = x+4;
    System_printf ("测试测试...\n");//此行失败。

    int main(){
    Board_init();
    Task_Params taskParams;
    Task_Params_init (&taskParams);

    ERROR_Block EB;
    ERROR_INIT (&EB);

    Task_Params_init (&taskParams);
    ERROR_INIT (&EB);
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =&testStack;
    taskParams.priority = 2;
    Task_construct(&testStruct, testFxn,&taskParams,&EB);

    BIOS_start();/*不返回*/
    返回(0);

    hello.cfg:

    /*
    *版权所有(c) 2015-2017、德州仪器(TI)公司
    *保留所有权利。
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    **源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    **二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随分发提供的文档和/或其他材料。
    *
    **德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *以及任何明示或暗示的保证、包括但不限于:
    *特定适销性和适用性的隐含保证
    *不承认目的。 在任何情况下、版权所有者不得或
    *派遣国应对任何直接、间接、偶然、特殊、
    *典型或必然的损害(包括但不限于
    *采购替代货物或服务;丧失使用、数据或利润;
    *或业务中断)、无论原因是什么以及任何责任理论、
    *无论是合同、严格责任还是侵权行为(包括疏忽或)
    *否则)因使用本软件而以任何方式产生、
    *即使被告知可能会发生此类损坏。
    *

    /*========================= 引导配置=================== *
    VAR Boot = xdc.useModule('ti.sysbios.family.arm.cc26xx.Boot');
    /*
    *此模块包含特定于系列的引导 API 和配置设置。
    *有关更多信息、请参阅 SYS/BIOS API 指南。
    *

    /*========================= 时钟配置======================== *
    VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
    VAR 计时器= xdc.useModule('ti.sysbios.hal.Timer');
    VAR 事件= xdc.useModule('ti.sysbios.knl.Event');
    VAR 邮箱= xdc.useModule('ti.sysbios.knl.Mailbox');
    /*
    *当使用 Power 和 calibrateRCOSC 设置为 true 时、应将其设置为10。
    *时钟模块使用的计时器支持 TickMode_dynamic。 这使我们能够做到
    *将节拍周期设置为10us、而不产生额外的开销
    *中断。
    *
    *注意:calibrateRCOSC 参数在电源配置中设置
    *"Board.c"文件中的结构。
    *
    clock.tickPeriod = 10;

    /*========================= 默认值(模块)配置=================== *
    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    /*
    *允许在目标上加载模块名称的标志。 模块名称
    出于调试目的、*字符串放置在.const 段中。
    *
    *选择一项:
    *- true (默认值)
    *将此参数设置为 true 将在.const 中包含名称字符串
    *部分、以便更轻松地调试错误和断言。
    *-错
    *将此参数设置为 false 将减小.const 中的占用空间
    *部分。 因此、错误和断言消息将包含
    *"未知模块"前缀、而不是实际的模块名称。
    *
    *在 ROM 中使用 BIOS 时:
    *此选项必须设置为 false。
    *
    //Defaults.common$.namedModule = true;
    Defaults.common$.namedModule = false;

    /*========================= 错误配置=================== *
    VAR 错误= xdc.useModule('xdc.runtime.Error');
    /*
    *调用此函数是为了处理所有产生的错误,但与不同
    * Error.raiseHook、此函数负责完全处理
    带有适当初始化的 Error_Block 的*错误。
    *
    *选择一项:
    *- Error.policyDefault (默认值)
    *使用已初始化的 Error_Block 结构和日志调用 Error.raiseHook
    *使用模块的记录器时出错。
    *- Error.PolicySpin
    *在 while (1)循环中捕获以最小化目标的简单替代方案
    *占用空间。
    *使用 Error.PolicySpin 时,将不会调用 Error.raiseHook。
    *
    //Error.policyFxn = Error.policyDefault;
    error.policyFxn =错误。policySpin;

    /*
    *如果 Error.policyFxn 设置为 Error.policyDefault,则调用此函数
    *每当错误模块引起错误时。
    *
    *选择一项:
    *- Error.print (默认值)
    *为方便,错误通过 System_printf()进行格式化和输出
    *调试。
    *-空
    *错误未格式化或记录。 此选项减少了代码占用空间。
    *-非空函数
    *错误调用自定义用户函数。 请参阅错误模块文档
    *以了解更多详细信息。
    *
    //Error.raiseHook = Error.print;
    error.raiseHook =空;
    //Error.raiseHook ="&myErrorFxn";

    /*
    *如果 Error.policyFxn 设置为 Error.policyDefault,则此选项适用于
    * Error.raiseHook 函数可递归的最大次数
    *已调用。 此选项限制无限递归的可能性
    *可能导致堆栈溢出。
    *默认值为16。
    *
    error.maxDepth = 2;

    /*========================= Hwi 配置=================== *
    var halHwi = xdc.useModule('ti.sysbios.hal.Hwi');
    var m3Hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
    /*
    *在空闲循环中检查 Hwi (系统)堆栈溢出。
    *
    *选择一项:
    *- true (默认值)
    *检查系统堆栈在空闲循环期间溢出的顶字和
    *如果检测到一个错误,则会发出一个错误。
    *-错
    *禁用运行时检查可提高运行时性能并得到
    *减小了闪存尺寸。
    *
    //halHwi.checkStackFlag = true;
    halHwi.checkStackFlag = true;

    /*
    *以下选项会在发生硬件异常时改变系统的行为
    检测到*。
    *
    *选择一项:
    *- Hwi.enableException = true
    *此选项会使默认的 m3Hwi.excHandlerFunc 函数完全启用
    *解码异常并将寄存器转储到系统控制台。
    *此选项会在错误模块中引发错误并显示
    * ROV 中出现异常。
    *- Hwi.enableException = false
    *此选项通过不解码或打印来减少代码占用空间
    *系统控制台异常。
    但是、它仍会在错误模块中引发错误并显示
    * ROV 中出现异常。
    *- Hwi.exHandlerFunc =空
    *这是节省代码空间的最积极的选择;但它是最有效的选择
    *很难调试异常。 它将闪存占用空间减小了
    *发生异常时插入默认 while (1)陷阱。 此选项
    *不会引起错误模块的错误。
    *
    m3Hwi.enableException = true;
    //m3Hwi.enableException = false;
    //m3Hwi.exHandlerFunc = exceptionHandle;

    /*
    *在除以0时启用硬件异常生成。
    *
    *选择一项:
    *- 0 (默认值)
    *在除以0时禁用硬件异常
    *- 1.
    *除以0时启用硬件异常
    *
    m3Hwi.nvicCCR.DIV_0_TRP = 0;
    //m3Hwi.nvicCCR.DIV_0_TRP = 1;

    /*
    *为无效数据对齐启用硬件异常生成。
    *
    *选择一项:
    *- 0 (默认值)
    *禁用数据对齐的硬件异常
    *- 1.
    *为数据对齐启用硬件异常
    *
    m3Hwi.nvicCCR.UNALIGN_TRP = 1;
    //m3Hwi.nvicCCR.UNALIGN_TRP = 1;

    /*
    *为复位矢量分配一个地址。
    *
    *默认为0x0、这是闪存的开始。 此设置通常应
    *不可更改。
    *
    m3Hwi.resetVectorAddress = 0x0;

    /*
    *为 RAM 中的矢量表分配一个地址。
    *
    *默认为 RAM 的启动。 该表放置在 RAM 中、因此是中断
    *可以在运行时添加。
    *
    *注意:要更改、请验证器件特定数据表中的地址'
    *内存映射。
    *
    m3Hwi.vectorTableAddress = 0x20000000;

    /*========================= 空闲配置========================= *
    VAR 空闲= xdc.useModule('ti.sysbios.knl.Idle');
    /*
    *空闲模块用于指定在无时要调用的函数列表
    *系统中正在运行其他任务。
    *
    *此处添加的函数将在空闲任务内连续运行。
    *
    *函数签名:
    * void func (void);
    *
    //idleFunc ("&myIdleFunc");

    idle.addFunc ('&Power_idleFunc');//添加电源模块的 IDLE 函数*/

    /*========================= 内核(SYS/BIOS)配置=================== *
    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    /*
    *在 BIOS 库中启用断言。
    *
    *选择一项:
    *- true (默认值)
    *启用断言以进行调试。
    *-错
    *禁用断言以减小代码占用空间并提高性能。
    *
    *在 ROM 中使用 BIOS 时:
    *此选项必须设置为 false。
    *
    //BIOS.assertsEnabled = true;
    BIOS.sertsEnabled = false;

    /*
    *指定默认 CPU 频率。
    *
    bios.cpufreq.lo = 48000000;

    /*
    *用于确定 xdc.runtime 源是否包含在自定义中的标志
    *构建的 BIOS 库。
    *
    *选择一项:
    *- false (默认值)
    *预构建的 xdc.runtime 库由相应的目标提供
    *用于构建应用程序。
    *-正确
    * xdc.runtime 库源代码将包含在自定义 BIOS 中
    *库。 此选项在两个代码中生成最高效的库
    *占用空间和运行时性能。
    *
    //BIOS.includeXdcRuntime = false;
    BIOS.includeXdcRuntime = true;

    /*
    * SYS/BIOS 运行时以链接的库的形式提供
    *与应用程序一起使用。 随提供了该库的几种形式
    * SYS/BIOS 产品。
    *
    *选择一项:
    *- BIOS.LibType_Custom
    *针对代码大小和进行了高度优化的定制构建库
    *运行时性能。
    *- BIOS.LibType_Debug
    *可用于的非优化自定义构建库
    *使用调试器单步执行 API。
    *
    *
    BIOS.libType = BIOS.LibType_Debug;
    //BIOS.libType = BIOS.LibType_Debug;

    /*
    *运行时实例创建使能标志。
    *
    *选择一项:
    *- true (默认值)
    *允许在运行时调用 Mod_create()和 Mod_delete ()
    *需要一个默认堆用于动态内存分配。
    *-错
    *通过禁止 Modo_create()和 Mod_delete ()来减少代码占用空间
    *在运行时调用。 对象实例是通过构建的
    * Mod_construct()并通过 Mod_析 构函数()析构。
    *
    *在 ROM 中使用 BIOS 时:
    *此选项必须设置为 true。
    *
    BIOS.runtimeCreatesEnabled = true;
    //BIOS.runtimeCreatesEnabled = false;

    /*
    *在 BIOS 库中启用日志。
    *
    *选择一项:
    *- true (默认值)
    *启用日志以进行调试。
    *-错
    *禁用日志记录以减少代码占用空间并改善运行时间
    性能。
    *
    *在 ROM 中使用 BIOS 时:
    *此选项必须设置为 false。
    *
    //BIOS.logsEnabled = true;
    BIOS.logsEnabled = false;

    /*========================= 内存配置=================== *
    VAR 内存= xdc.useModule('xdc.runtime.Memory');
    /*
    *内存模块本身只为任何一个提供一个通用接口
    *各种系统和应用特定的内存管理策略
    *由 IHeap 模块实现(例如、 HeapMem、HeapBuf)。
    *

    /*
    *使用 HeapMem 主堆实例使用由链接器定义的存储器区域
    *
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    HeapMem.primaryHeapBaseAddr ="&_primary_heap_start___";
    HeapMem.primaryHeapEndAddr ="&_primary_heap_end___";

    var heapMemParams = new HeapMem.Params();
    heapMemParams.usePrimaryHeap = true;
    program.global.heap0 = HeapMem.create (heapMemParams);

    Memory.defaultHeapInstance = Program.global.heap0;

    /*========================= 程序配置=================== *
    /*
    *必须将 Program.stack 设置为0才能进行设置
    要在示例中确定的系统堆栈大小*
    *链接器命令文件。
    *
    program.stack = 512;


    /*
    *取消注释以启用将 GNU 目标打印到 CCS 控制台的半主机功能。
    *请阅读以下 TIRTOS Wiki 页面以了解有关半主机的更多信息:
    * processors.wiki.ti.com/.../TI-RTOS_Examples_SemiHosting
    *

    if (Program.build.target.$name.match (/GNU/)){
    //var SemiHost = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');

    /*========================= ROM 配置======================== *
    /*
    *要在闪存中使用 BIOS,请注释掉下面的代码块。
    *
    /*var ROM = xdc.useModule('ti.sysbios.rom.ROM');
    if (Program.cpu.deviceName.match(/CC2640R2F/)){
    rom.romName = ROM.CC2640R2F;

    否则(Program.cpu.deviceName.match(/CC26.2/)){
    rom.romName = ROM.CC26X2V2;

    否则(Program.cpu.deviceName.match(/CC13.2/)){
    rom.romName = ROM.CC13X2V2;

    否则(Program.cpu.deviceName.match(/CC26/)){
    rom.romName = ROM.CC2650;

    否则(Program.cpu.deviceName.match(/CC13/)){
    rom.romName = rom.no_ROM;

    *


    /*========================= 信标配置=================== *
    VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
    /*
    *启用对任务优先级挂起队列的全局支持。
    *
    *选择一项:
    *- true (默认值)
    *这允许根据任务优先级为待处理的任务提供服务。
    *-错
    *待处理任务是基于先入先出的服务。
    *
    *在 ROM 中使用 BIOS 时:
    *此选项必须设置为 false。
    *
    //semaphore.supportsPriority = true;
    Semaphore.supportsPriority = false;

    /*
    *允许通过信标隐式布置事件、
    *禁用以保存其他代码。
    *
    *选择一项:
    *-正确
    *这允许信标模块发布信标和事件
    *同步。
    *- false (默认值)
    *必须显式发布事件以解除阻止任务。
    *
    *在 ROM 中使用 BIOS 时:
    *此选项必须设置为 false。
    *
    //semaphore.supportsEvents = true;
    Semaphore.supportsEvents = false;

    /*========================= Swi 配置=================== *
    VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
    /*
    *软件中断是封装函数的对象
    *已执行且具有优先级。 软件中断被优先化、优先于任务
    和被硬件中断服务例程抢先。
    *
    *包括此模块是为了允许在用户的应用程序中使用 Swi。
    *

    /*
    *将 swi 优先级的数量从缺省值16减少。
    *减少 swi 优先级的数量可节省内存。
    *
    SWI.numPriorities = 6;

    /*========================= 系统配置=================== *
    VAR 系统= xdc.useModule('xdc.runtime.System');
    /*
    *当系统异常退出时调用中止处理程序。
    *
    *选择一项:
    *- System.AbortStd (默认)
    *调用 ANSI C 标准'abort()'来终止应用程序。
    *- System.abortSpin
    *在 while (1)陷阱中无限循环的轻量级中止函数
    *函数。
    *-自定义中止处理程序
    *用户定义的函数。 请参阅的系统模块说明文件
    *详细信息。
    *
    //System.ABortFxn = System.ABortStd;
    System.ABortFxn = System.ABortSpin;
    //System.AbortFxn ="&myAbortSystem";

    /*
    *系统正常退出时调用 Exit 处理程序。
    *
    *选择一项:
    *- System.exitStd (默认)
    *调用 ANSI C 标准'exit()'以终止应用程序。
    *- System.exitSpin
    *在 while (1)陷阱中无限循环的轻量级退出函数
    *函数。
    *-自定义退出函数
    *用户定义的函数。 请参阅的系统模块说明文件
    *详细信息。
    *
    //System.exitFxn = System.exitStd;
    System.exitFxn = System.exitSpin;
    //System.exitFxn ="&myExitSystem";

    /*
    *最小化系统模块中的退出处理程序数组。 系统模块包括
    *向 System_atexit()注册的函数数数组,即
    *由 System_exit()调用。 默认值为8。
    *
    System.maxAtexitHandlers = 2;

    /*
    * System.SupportProxy 定义了 System 的低级实现
    *诸如 System_printf()、System_flush()等函数
    *
    *选择一对:
    *- SysMin
    *此模块维护一个内部可配置的循环缓冲器
    *存储输出,直到调用 System_flush()。
    *循环缓冲区的大小通过 SysMin .bufSize 设置。
    *- SysCallback
    * SysCallback 允许系统 API 的用户定义实现。
    * SysCallback 支持代理的代码占用空间更小,可以是
    *用于提供定制 System_printf 服务。
    *默认的 SysCallback 函数指向存根函数。 请参阅
    * SysCallback 模块的文档。
    *
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    SysMin。bufSize = 512;
    System.SupportProxy = SysMin;
    //var SysCallback = xdc.useModule('xdc.runtime.SysCallback');
    //System.SupportProxy = SysCallback;
    //SysCallback.abortFxn ="&myUserAbort";
    //SysCallback.exitFxn ="&myUserExit";
    //SysCallback.flushFxn ="&myUserFlush";
    //SysCallback.putchFxn ="&myUserPutch";
    //SysCallback.readyFxn ="&myUserReady";

    /*========================= 任务配置=================== *
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    /*
    *检查任务堆栈是否有溢出情况。
    *
    *选择一项:
    *- true (默认值)
    *在期间启用任务堆栈溢出情况的运行时检查
    *上下文切换("从"和"到")
    *-错
    *禁用任务堆栈溢出情况的运行时检查。
    *
    *在 ROM 中使用 BIOS 时:
    *此选项必须设置为 false。
    *
    //Task.checkStackFlag = true;
    Task.checkStackFlag = true;

    /*
    *设置创建任务时的默认任务堆栈大小。
    *
    *默认值取决于所使用的器件。 减少默认堆栈
    *大小可节省更多内存。
    *
    Task.defaultStackSize = 512;

    /*
    *启用空闲任务。
    *
    *选择一项:
    *- true (默认值)
    *创建优先级为0的任务,调用空闲挂钩函数。 这种情况
    必须将*选项设置为 true 才能通过 Power 实现节能
    *模块。
    *-错
    *未创建空闲任务。 此选项占用的内存较少、因为没有
    *需要附加的默认任务堆栈。
    *要在没有空闲任务的情况下通过电源模块实现节能、
    *将 Idle.run 添加为 Task.allBlockedFunc。
    *
    task.enableIdleTask = true;
    //Task.enableIdleTask = false;
    //Task.allBlockedFunc = Idle.run;

    /*
    *如果 Task.enableIdleTask 设置为 true,则此选项设置空闲任务
    *堆栈大小。
    *
    *减小空闲堆栈大小可节省更多内存。
    *
    task.idleTaskStackSize = 512;

    /*
    *减少任务优先级的数量。
    *默认值为16。
    *减少任务优先级的数量可节省内存。
    *
    Task.numPriorities = 10;

    /*========================= 文本配置=================== *
    var text = xdc.useModule('xdc.runtime.Text');
    /*
    *这些字符串放置在.const 段中。 将此参数设置为
    * false 将在.const 段中节省空间。 错误、断言和记录消息
    *将打印原始 ID 和 args、而不是格式化的消息。
    *
    *选择一项:
    *- true (默认值)
    *此选项将测试字符串加载到.const 中以方便调试。
    *-错
    *此选项可减小.const 占用空间。
    *
    //text.isLoaded = true;
    text.isLoaded = false;

    /*========================= 类型配置=================== *
    VAR 类型= xdc.useModule('xdc.runtime.Types');
    /*
    *此模块定义了在中使用的基本常量和类型
    * xdc.runtime 软件包。
    *


    /*========================= 应用程序特定实例========================= *
    var ti_sysbios_hal_ds = xdc.useModule('ti.sysbios.hal.Seconds');
    Memory.defaultHeapSize = 8192;
    BIOS.heapTrackEnabled = true;

    bios.customCCOpts ="-endian=little -mv7M4 --abi=eabi --float_support=fpv4spd16 -q -ms --opt_for_speed=0 --program_level_compile -g";

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

    我找到了其中一个拼图、最后进入旋转循环取决于我在中的 BIOS 运行时选项卡下选择的 SYS/BIOS 库类型。 选择"未检测"会使软件运行、但选择任何调试选项会使我在旋转循环中结束。

    此外,ROV 告诉我错误是一个例外,它在调用 System_printf()时发生。 函数不会返回、但会引发异常:

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

    我发现了该错误、还有另一个主题在这里讨论了相同的内容:

    我仍然不知道为什么要改变这条线

    m3Hwi.nvicCCR.UNALIGN_TRP = 0;

    如果设为等于1、则会导致该问题、TI 对此没有任何解释、但至少现在我没有得到例外。