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/CC2650MODA:应用程序在闪存 ROM 时运行良好、但在从 OADTarget 运行时出现硬件故障

Guru**** 2563960 points
Other Parts Discussed in Thread: CC2640, SYSBIOS, CC2650, CC1350

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/586473/rtos-cc2650moda-application-runs-fine-when-flashrom-but-gets-hard-faults-when-running-from-oadtarget

器件型号:CC2650MODA
Thread 中讨论的其他器件:CC2640SYSBIOSCC2650CC1350

工具/软件:TI-RTOS

您好!

我遇到了一种奇怪的情况、即我的应用在使用"FlashROM"进行编译时运行良好、但在随机时间发生硬故障、通常在使用"OAD 目标"进行编译时介于15-30分钟之间。

使用 CCS 7.0配置 NO_ROM=1、OAD_IMG_E=1。 我正在使用 BIM_extflash 作为引导加载程序。 TIRTOS 2.20.1.08和 ble_sdk_2_02_01_18

应用程序使用 GPIO 中断测量方波信号的周期。 奇怪,但是如果我增加频率信号(500Hz),我通常会更快地得到硬故障...

从"FlashROM"运行时、我没有任何硬故障和问题。

cc2640.cfg 文件中是否缺少任何内容? 我不熟悉 TIRTOS、但从调用堆栈中可以看到"KNL_Queue"和"KNL_Task"的故障会指示堆或堆栈错误缺失了什么? 我尝试增加值(Program.stack 和 heapMinParams.size)但没有成功。 我不知道我还需要从 FlashROM 配置中引入什么来使其正常工作。

提前感谢。

解码的异常、
已解码、硬故障:强制:BUSFAULT:PRECISERR.Data Access 错误。 地址= 0x41000000
异常上下文、
$addr、N/A
$type、ti.sysbios.family.arm.m3/hwi.ExcelContext
线程类型、任务
threadHandle、0x20000b64
threadStack、b0f9
threadStackSize、45305
R0、0x41000000
R1、0x41000000
r2、0x20001830
R3、0x20001750
R4、0x3
r5、0x20000b64
R6、0x2
r7、0x41000000
R8、0x0
R9、0xc700
r10、0x20001968
r11、0x1
r12、0x2
SP、0x20000c80
LR、0xa20f
PC、bbc5c
PSR、0x21000000
ICSR、0x410803
MMFSR、0x0
BFSR、0x82
UFSR、0x0
HFSR、0x40000000
DFSR、0x0
MMAR、0x41000000
BFAR、0x41000000
AFSR、0x0
异常调用栈、
0   ti_SysBIOS_KNL_Queue_empty_E (struct ti_SysBIOS_KNL_Queue_Object *) at Queue.c:72、PC = 0x00005C BCFP = 0x20000C80
1   ti_SysBIOS_KNL_Task_blocki__E (struct ti_SysBIOS_KNL_Task_Object *) at Task.c:1213、PC = 0x0000A20E FP = 0x20000C80

这是 CFG 文件

/*********

 @文件 cc2640.cfg

 @CC26xx 的 TI RTOS 配置文件简介

       导入的符号
       注意:这些符号是在--cfgArgs 选项之后定义的。
       在 IAR 中、这是在预编译步骤的末尾完成的。  在 CCS 中、这是
       在 Properties->Build->XDCtools-Advanced options->Configuration 中完成
       脚本参数。  可以使用多个符号将它们分隔为
       逗号("、")。

       默认情况下、TI RTOS 在 ROM 中以 RTOS 构建、中断向量启动
       地址0x0处、并且仅使用 ROM 内核模块。

       NO_ROM:    当设置为非零值时、RTOS 会在闪存中生成
                   ROM
       OAD_IMG_A: 设置为非零值时、中断向量设置为
                   其片上 OAD 映像 A 的预期位置
       OAD_IMG_B: 设置为非零值时、中断向量设置为
                   其片上 OAD 映像 B 的预期位置
       OAD_IMG_E: 设置为非零值时、中断向量设置为
                   外部闪存 OAD 的预期位置。
       USE_Events:生成 RTOS 内核事件模块。

 组:WCS、BTS
 目标器件:CC2650、CC2640、CC1350

 秘书长的报告
 
 版权所有(c) 2013-2016、德州仪器(TI)公司
 保留所有权利。

 以源代码和二进制形式重新分发和使用、有无
 允许进行修改、前提是满足以下条件
 符合:

 * 源代码的重新分发必须保留上述版权
   声明、此条件列表和以下免责声明。

 * 二进制形式的再发行必须复制上述版权
   注意、本条件列表和中的以下免责声明
   分发时提供的文档和/或其他材料。

 * 德州仪器公司的名称和名称均不相同
   其贡献者可用于认可或推广衍生产品
   未经特定的事先书面许可。

 本软件由版权所有者和贡献者"按原样"提供
 以及任何明示或暗示的保证、包括但不限于
 对特定适销性和适用性的隐含保证
 不承认目的。 在任何情况下、版权所有者不得或
 任何直接、间接、偶然、特殊、
 惩罚性或后果性损害(包括但不限于
 采购替代货物或服务;丧失使用、数据或利润;
 或业务中断)、无论原因是什么以及任何责任理论、
 无论是合同、严格责任还是侵权行为(包括疏忽或)
 否则)因使用本软件而以任何方式产生、
 即使被告知可能会发生此类损坏。

 秘书长的报告
 版本名称:BLE_SDK_2_02_01_18
 发布日期:2016年10月26日15:20:04
 (小部分 /


/*========================= ROM 配置======================== *
/*
 *要在闪存中使用 BIOS,请注释掉下面的代码块。
 *
if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))

 VAR ROM = xdc.useModule('ti.sysbios.rom.ROM');
 if (Program.cpu.deviceName.match(/CC26/)){
     rom.romName = ROM.CC2650;
 }
 否则(Program.cpu.deviceName.match(/CC13/)){
     rom.romName = ROM.CC1350;
 }




/*========================= 引导配置=================== *
if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))

 VAR Boot = xdc.useModule('ti.sysbios.family.arm.cc26xx.Boot');

/*
 *此模块包含特定于系列的引导 API 和配置设置。
 *有关更多信息、请参阅 SYS/BIOS API 指南。
 *
if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))

 boot.driverlibVersion = 2;
 boot.customerConfig = false;



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


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



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

/*编译所有断言的*/
//Defaults.common$.diags_ASSERT = Diags.always_off;

/*允许 Mod_create()和 Mod_construct(),但不允许删除()或析构()*/
Defaults.common$.memoryPolicy = types.create_policy;



/*========================= 错误配置=================== *
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()进行格式化和输出
 *     调试。
 *- 空
 *     错误由 while (1)存根函数捕获。 该选项会减小
 *     代码占用量。
 * -非空函数
 *     错误调用自定义用户函数。 请参阅错误模块文档
 *     以了解更多详细信息。
 *
//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 = false;

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

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

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

/*将复位矢量置于闪存的开头*/
if (类型 OAD_IMG_A!='未定义'&& OAD_IMG_A = 1)

 m3Hwi.resetVectorAddress = 0x0610;

否则(类型 OAD_IMG_B!='未定义'&& OAD_IMG_B = 1)

 m3Hwi.resetVectorAddress = 0x6010;

否则(类型 OAD_IMG_E!='未定义'&& OAD_IMG_E = 1)

 m3Hwi.resetVectorAddress = 0x1010;

其他

 m3Hwi.resetVectorAddress = 0x0;


/*将中断矢量置于 RAM 的开头、以便在运行时配置中断*/
m3Hwi.vectorTableAddress = 0x20000000;

/* CC2650具有50个中断*/
m3Hwi.NUM_INTERRUPTS = 50;



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



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

/*
 *为 BIOS 指定默认堆大小。
 *
if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))

 BIOS.heapSize = 1668;


/*
 *用于确定 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_Custom;
//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;

BIOS.swiEnabled = true;



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

 VAR HeapMin = xdc.useModule('xdc.runtime.HeapMin');
 var heapMinParams = new HeapMin.Params;
 heapMinParams.size = 1668;
 var myHeapMin = HeapMin.create (heapMinParams);
 Memory.defaultHeapInstance = myHeapMin;



/*========================= 程序配置=================== *
/*
 * IAR 会忽略 Program.stack。 使用中的项目选项
 * IAR Embedded Workbench 以更改系统堆栈大小。
 *
if (typeof no_rom =='undefined'||(typeof no_rom!='undefined'&& no_ROM = 0))

 program.stack = 1024;
 program.argSize = 0;

其他

 program.stack = 1024;//512;gaboh:尝试增大此值




/*========================= 信标配置=================== *
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;




/*========================= 事件配置=================== *
if (typeof use_events!='未定义'&& use_events!= 0)

 VAR 事件= xdc.useModule('ti.sysbios.knl.Event');




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

/*
 * 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 = 128;
//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 = false;

/*
 *设置创建任务时的默认任务堆栈大小。
 *
 *默认值取决于所使用的器件。 减少默认堆栈
 *大小可节省更多内存。
 *
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 = 6;



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



/*========================= TI-RTOS 中间件配置================= *
var mwConfig = xdc.useModule('ti.mw.Config');
/*
 *包括 TI-RTOS 中间件库
 *



/*========================= TI-RTOS 驱动程序的配置==== *
VAR driversConfig = xdc.useModule('ti.drivers.Config');
/*
 *包含 TI-RTOS 驱动程序
 *
 *选择一项:
 * - driversConfig.LibType_NonInstrumented (默认)
 *     使用针对封装和性能进行优化的 TI-RTOS 驱动程序库
 *     无断言或日志。
 * - driversConfig.LibType_Instrumented
 *     使用 TI-RTOS 驱动程序库在启用断言和日志的情况下进行调试。
 *
driversConfig.libType = driversConfig.LibType_NonInstrumented;
//driversConfig.libType = driversConfig.LibType_Instrumented;



//剩余模块
VAR 诊断= xdc.useModule('xdc.runtime.Diags');
VAR Main = xdc.useModule('xdc.runtime.Main');
VAR Reset = xdc.useModule('xdc.runtime.Reset');





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

    您能否在 RTOS 对象视图(ROV)中检查 RTOS 任务堆栈是否存在错误、例如堆栈溢出?

    此外、一项测试是将 RTOS 在 ROM +闪存中运行的 FlashROM 编译转换为仅在闪存中运行 RTOS。 您可以在.cfg 文件或工程属性、XDCtools、Advanced Options、"Configuration script arguments"中定义 NO_ROM=1。

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

    您好、JXS、感谢您的回复。

    关于 RTOS 任务堆栈状态、我认为这是可以的。 这就是我拥有的:

    从"详细"选项卡复制并粘贴:

    、0x200016b8、ti.sysbios.KNL.Task.IdleTask、0、就绪、ti_sysbios_KNL_idle_loop_E、0x0、0x0、232、512、0x200020e0、n/a、n/a、
    、0x20000634、、3、blocked、gapRole_taskFxn、0x0、0x0、436、896、0x20000688、n/a、n/a、信标:0x20001eb4
    、0x20001a60、5、blocked、iCall_taskEntry、0xf001、0x20001858、664、952、0x20001ab0、n/a、n/a、未知


    从"module"选项卡复制并粘贴:

    、0x20001750、锁定、0x3、false、4、0x20000b64、444、1024、0x20003f48

    当然、我将尝试在闪存 ROM 构建配置中设置 NO_ROM=1。

    此致、

    Gaboh

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

    我使用 NO_ROM=1设置测试了 FlashRom 构建、并且未发现任何硬件故障问题。 感谢您的这一想法、随着我继续向 FlashROM 编译中添加 OADTarget 中的定义、当我在'ARM compiler"设置下的'Predefined symbols'中添加 feature_OAD 时、我的项目开始崩溃。

    我将在定义 FITY_OAD 时调试代码、并搜索导致这些问题的真正原因。

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

    如果我注释/抑制所有"memcpy"调用、或将其替换为在"oad_target_external_flash.c"文件中复制缓冲区的替代方法、且不会遇到硬故障。

    此外、使用"1-局部优化"设置 OAD_TARGET_EXTERNAL_FLASH.c 文件可以修复此问题、并且我不再遇到硬故障。 项目的其余部分设置为"4"优化级别。

    我决定采纳最新的建议。

    谢谢、
    Gaboh