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/EK-TM4C129EXL:在中断服务例程之后 e_spOutOfBounds

Guru**** 2481465 points
Other Parts Discussed in Thread: EK-TM4C129EXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/701219/rtos-ek-tm4c129exl-e_spoutofbounds-after-interrupt-service-routine

器件型号:EK-TM4C129EXL

工具/软件:TI-RTOS

您好!

我正在使用 EK-TM4C129EXL、我正在使用 TI-RTOS 2.16.0.08和 NDK 2.25.00.09。

为您提供一些背景。 我的应用程序应对20个 ADC 通道进行采样并通过 TCP 将其发送到计算机。 ADC 通道由2个使用2个序列发生器的 ADC 采样。 然后、DMA 以乒乓传输的方式复制样本。 ping 传输完成后、应通过 TCP 传输 ping、同时 PONG 应填充新样本。

ADC 序列发生器的 ISR 调用 SWI 来重新启用(uDMAChannelTransferSet) DMA 传输。 SWI 正在发布一个事件、以指示相应的存储器(ping 或 pong)已满。 任务在相应事件上挂起、以指示应通过 TCP 传输哪个内存的另一个任务。

以下是一个示例 ISR 和 SWI:

void SWI_Adc0Sequencer0 (void)
{

if (!uDMAChannelIsEnabled (UDMA_CHANGE_ADC0))
{
uDMAChannelEnable (UDMA_CHANGE_ADC0);
uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、VJADC0SS0FIFOADDRESS、P_U16_ADC0_S0_UDMA_A、VJDMATRANSFERSIZE_SS0);
ADC0Sequencer0SWI++;
}
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、VJADC0SS0FIFOADDRESS、P_U16_ADC0_S0_UDMA_A、VJDMATRANSFERSIZE_SS0);
ADC0Sequencer0SWI_A++;
EVENT_POST (EventHandle_ABufferReady、Event_ID_00);
}
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_ALT_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、VJADC0SS0FIFOADDRESS、P_U16_ADC0_S0_UDMA_B、VJDMATRANSFERSIZE_SS0);
ADC0Sequencer0SWI_B++;
EVENT_POST (EventHandle_BBufferReady、Event_ID_00);
}
}

void ISR_Adc1Sequencer1 (void)
{
if ((ADCSequenceOverflow (ADC1_base、1)&& ADCSequenceUnderflow (ADC1_base、1))=0)
{
/*
*没有发生溢出、中断标志被简单地清除
*
ADCIntClear (ADC1_BASE、1);
ADCIntClearEx (ADC1_base、ADC_INT_DMA_SS1);
}
其他
{
/*
*发生了溢出
*中断标志被清除、否则程序将不再正常运行
*要指示用户发生错误,请打开 Led0并增加计数器
*
ADCIntClear (ADC1_BASE、1);
ADCIntClearEx (ADC1_BASE、ADC_INT_DMA_SS1);
ADCSequenceOverflowClear (ADC1_base、1);
Swi_post (Led0On);
溢出错误 Adc1SS1++;
}
Swi_post (Adc1Sequencer1);
ADC1SEQUENCER1++;
} 

我所面临的误差如下所示。 在执行与 ADC1Sequencer1相对应的 ISR 之后、空闲任务会产生异常、我认为它是堆栈溢出。 在下面的屏幕截图中、显示错误消息和 ROV、以查看导致问题的任务是 IdleTask。

您可以看到、我已经尝试提升所有任务的 STACKSIZE、如果我解释 ROV 正确、则堆栈大小应该足够大。 我非常感谢您提出了如何解决问题的每一个想法。 在下面、我还附加了我的.cfg 文件、这可能是错误的。

/*
版权所有(c) 2015-2016、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//



/*========================= 时钟配置======================== */
var Clock = xdc.useModule('ti.sysbios.knl.Clock');
var LoggingSetup = xdc.useModule('ti.uia.sysbios.LoggingSetup');
var Global = xdc.useModule('ti.ndk.config.Global');
var TCP = xdc.useModule('ti.ndk.config.Tcp');
var IP = xdc.useModule('ti.ndk.config.Ip');
var Event = xdc.useModule('ti.sysbios.knl.Event');
var EMAC = xdc.useModule('ti.ndk.config.Emac');
//
*默认值取决于系列。 例如、Linux 系统通常仅
*支持最短时间为10000us、是10000 us 的倍数。
* TI 平台的默认值为1000us。
*/
Clock.tickPeriod = 1000;



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



/*====== 错误配置=================== //
var Error = 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 = Error.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 (默认值)
* 检查系统堆栈在空闲循环期间溢出的顶字和
* 如果检测到错误、则会引发错误。
*- false
* 禁用运行时检查可提高运行时性能并产生
* 减小了闪存尺寸。
//
//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.excHandlerFunc =空;

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

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



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



/*=================== 内核(SYS/BIOS)配置=================== */
var BIOS = xdc.useModule('ti.sysbios.BIOS');
/*
启用 BIOS 库中的断言。
*
*选择一个:
*- true (默认值)
* 启用断言以进行调试。
*- false
* 禁用断言以减小代码占用空间并提高性能。
//
//BIOS.assertsEnabled = true;
BIOS.assertsEnabled = true;

//
*指定 BIOS 的默认堆大小。
//
BIOS.heapSize = 52768;

//
*一个标志,用于确定 xdc.runtime 源是否包含在自定义
*构建的 BIOS 库中。
*
*选择一个:
*- false (默认值)
* 预构建的 xdc.runtime 库由相应的目标
*提供 用于构建应用。
*- true
* 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 (),*
需要一个用于动态内存分配的默认堆。
*- false
* 通过禁止 Mod_create()和 Mod_delete ()来减少代码占用空间
* 调用的函数。 对象实例通过
*构造 mod_construct()并通过 Mod_析 构函数()析构。
*/
BIOS.runtimeCreatesEnabled = true;
//BIOS.runtimeCreatesEnabled = false;

/*
启用 BIOS 库中的日志。
*
*选择一个:
*- true (默认值)
* 启用日志以进行调试。
*- false
* 禁用日志记录以减少代码占用空间并改善运行时间
* 性能。
*/
//BIOS.logsEnabled = true;
BIOS.logsEnabled = true;



/*=========== 内存配置=================== //
var 内存= xdc.useModule('xdc.runtime.Memory');
//
*内存模块本身只为 IHeap

模块(例如、 HeapMem、HeapBuf)。
//



/*========================= 程序配置=================== IAR

忽略*//* Program.stack。 使用
* IAR Embedded Workbench 中的项目选项来改变系统堆栈大小。
//
if (!Program.build.target.$name.match (/IAR/)){
/*
*减小系统堆栈大小(由 ISR 和 Swi 使用)以减小
* RAM 使用情况。
*/
Program.stack = 2048;
}



//
*为 GNU 目标启用半主机以打印到 CCS 控制台
*/
if (Program.build.target.$name.match (/GNU/)){
VAR SemiHost = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
}/*
========================= 信标配置=================== //
var semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
//
*启用对任务优先级挂起队列的全局支持。
*
*选择一个:
*- true (默认值)
* 这允许根据任务优先级为待处理的任务提供服务。
*- false
* 待处理任务是基于先入先出的服务。
*
*在 ROM 中使用 BIOS 时:
* 此选项必须设置为 false。
//
//semaphore.supportsPriority = true;
semaphore.supportsPriority = false;

//
*允许通过信号量隐式布置事件,
*禁用以保存其他代码。
*
*选择一个:
*- true
* 这允许信标模块发布信标和事件
* 同步。
*- false (默认值)
* 必须显式发布事件以解除任务阻止。
*
///semaphore.supportsEvents
= true;
semaphore.supportsEvents = false;



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



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

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

//
*最小化系统模块中的退出处理程序数组。 System 模块包括
*一个在 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 = 1024;
System.SupportProxy = SysMin;
//var SysCallback = xdc.useModule('xdc.runtime.SysCallback');
// System.SupportProxy = SysCallback;
//SysCallback.abortFxn =[&myAbort];
//SysCallback.exitFxn ="&myUserExit";/myUserFlushFlush
=";/myUserCallback.UserFlushn =
//SysCallback.putchFxn ="&myUserPutch";
//SysCallback.readyFxn ="&myUserReady";




/*=========== 任务配置=================== //
var Task = xdc.useModule('ti.sysbios.knl.Task');
//
*检查任务堆栈是否存在溢出情况。
*
*选择一个:
*- true (默认值)
* 在
*期间启用任务堆栈溢出情况的运行时检查 上下文切换("从"和"到")
*- false
* 禁用任务堆栈溢出条件的运行时检查。
//
//Task.checkStackFlag = true;
Task.checkStackFlag = true;

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

/*
启用空闲任务。
*
*选择一个:
*- true (默认值)
* 创建优先级为0的任务、该任务调用空闲挂钩函数。 此
* 选项必须设置为 true 才能获得 Power
*提供的节能效果 模块。
*- false
* 未创建空闲任务。 此选项占用的内存较少、为 no
* 需要额外的默认任务堆栈。
* 若要在没有空闲任务的情况下通过电源模块实现节能
、请执行* 将 Idle.run 添加为 Task.allBllockedFunc。
//
//Task.enableIdleTask = true;
Task.enableIdleTask = true;
//Task.allBlockedFunc = Idle.run;

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

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



//
* Idle 函数列表。
*
*此处添加的函数将在空闲任务内连续运行。
*
*函数签名:
* void func (void);
*/
///idle.addFunc ("&myIdleFunc");



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



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



/*========================= 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_noniced;
//driversConfig.libType = driversConfig.LibType_instrumented;



/*=========== 应用程序特定实例========================= //
var m3Hwi0Params = new m3Hwi.Params ();
m3Hwi0Params.instance.name ="HwiHandle_Timer2";
m3Hwi0Params.priority = 0;
Program.global.HwiHandle_Timer2 = m3Hwi.create (39、"&ISR_Timer2"、 m3Hwi0Params);
LoggingSetup.sysbiosLogging = true;
LoggingSetup.sysbiosHwiLogging = true;
var m3Hwi1Params = new m3Hwi.Params ();
m3Hwi1Params.instance.name ="HwiHandle_AdSequencer0";
m3Hwi1Parwi.1优先级= 1;Program_c030_AdwiSequencer0"
(Global、c030_AdwiSequencer0") m3Hwi1Params);
var m3Hwi2Params = new m3Hwi.Params ();
m3Hwi2Params.instance.name ="HwiHandle_Adc0Sequencer1";
m3Hwi2Params.priority = 1;
Program.global.HwiHandle_Adc0Sequencer1 = m3Hwi.create (31、"&1、"Adc0Sequencer1" m3Hwi2Params);
var m3Hwi3Params = new m3Hwi.Params ();
m3Hwi3Params.instance.name ="HwiHandle_Adc1Sequencer0";
m3Hwi3Params.priority = 1;
Program.global.HwiHandle_Adc1Sequencer0 = m3Hwi.create ("Adc0&isr"、Adc0)、"AdcSequencer0" m3Hwi3Params);
var m3Hwi4Params = new m3Hwi.Params ();
m3Hwi4Params.instance.name ="HwiHandle_Adc1Sequencer1";
m3Hwi4Params.priority = 1;
Program.global.HwiHandle_Adc1Sequencer1 = m3Hwi.create (63、Sequencer1) m3Hwi4Params);
m3Hwi.diterAutoNestingSupport = false;
var swi0Params = new Swi.Params ();
swi0Params.instance.name ="Adc0Sequencer0";
swi0Params.priority = 0;
Program.global.Adc0Sequencer0 = Swi.create ("&SWI_Adc0Sequencer0";sw0Parencer0)
var swi1Params = new swi.Params ();
swi1Params.instance.name ="Adc0Sequencer1";
swi1Params.priority = 0;
Program.global.Adc0Sequencer1 = Swi.create ("&SWI_Adc0Sequencer1"、swi1Params);
LoggingSetup.loadTaskLogging = true;
LoggingSetup.loadSwiLogging = true;
LoggingSetup.loadHwiLogging = true;
LoggingSetup.enableTaskProfiler = true;
LoggingSetup.loadLoggerSize = 15000;
LoggingSetup.mainLoggerSize = 1024;
var swi2Params = new Swi.Params ();
swi2Params.instance.name ="Adc1Sequencer0";
swi2Params.priority = 0;
Program.global.Adc1Sequencer0 = Swi.create ("&SWI_Adc1Sequencer0"、swi2Params);
var swi3Params = new swi.Params ();
swi3Params.instance.name ="Adc1Sequencer1";
swi3Params.priority = 0;
Program.global.Adc1Sequencer1 = Swi.create ("&SWI_Adc1Sequencer1"、swi3Params);
var swi4Params = new swi.Params ();
swi4Params.instance.name ="Led0On";
swi4Params.priority = 2;
Program.global.Led0On = Swi.create ("&SWI_LED0On"、swi4Params);
Ip.autoIp = false;
ip.address ="192.168.1.2";
Global.networkOpenHook ="&netOpen";
Global. memRawPageCount = 6;
Global. pktNumFrameBufs = 10;
global.ndkThreadStackSize = 5120;
Global. lowTaskStackSize = 5120;
Global.normTaskStackSize = 5120;
Global. highTaskStackSize = 5120;
Memory.defaultHeapSize = 20480;
Taskevent0Params = new Event.Params ();
event0Params.instance.name





event2Params.instance.name

Global.netSchedulerPri = EventEventHandle_tcp";Program.global.EventHandle_TCP = Event.create (event0Params);var event1Params = new Event.Params ();event1Params.instance.name

event3Params.instance.name ="EventHandle_AfBufferReady";Program.global.EventHandle_AParams = New Event.Params (event2Params = New Event.Params
);event2EventParams = New EventParams = New EventParams.event2Params = New Event Setup.Params (Global);EventParams = Event BufferReady);EventParams.event2Params = EventParams = New EventParams = EventParams.event2Params.event_Params.eventParams.eventParams.eventParams.event2Params = New Event BufferReady;EventParams = EventParams.eventParams.eventParams.event2 Params.
var event4Params = new Event.Params ();
event4Params.instance.name ="EventHandle_Error";
Program.global.EventHandle_Error = Event.create (event4Params);
LoggingSetup.sysbiosSemaphoreLogging = true;
tcp.transmitBufSize = 2048;
ip.socketBufMinTxSize = 512;
tcp.maxNumReasmPkts = 32;
LoggingSetup.sysbiosLoggerSize = 15000;
LoggingSetup.logerType = LoggingSetup.LoggerType_STOPMODE;

提前感谢、致以诚挚的问候、

Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    我不是 TI-RTOS 专家、可能需要向我们的 RTOS 专家寻求指导。 但是、查看您的错误、我怀疑您的空闲任务存在堆栈问题。 您已经为空闲任务预留了10240字节的堆栈、在我看来、这是很重要的。 相反、我会尝试将默认任务堆栈大小增加到2048、而不是您当前拥有的1024、并将空闲堆栈大小从10240恢复到2048、看看这是否会产生差异。

    还需要确保一次只能在一个事件对象上挂起一个任务。 同一个事件对象上不能有多个待处理任务。 例如、您是否有多个任务将基于 EventHandle_ABufferReady 解除阻止? 也许您没有此类问题、只是想确保。

    我还有一个问题是、如果您首先将应用程序限制为仅使用 ADC0而不使用 ADC1、它是否能够正常工作? 在添加增量功能之前、从较小的器件开始并确保其正常工作会更容易。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢您的播放。

    [引用用户="Charles Tsaa"]
    您已经为空闲任务预留了10240字节的堆栈、在我看来、这是很重要的。 相反、我会尝试将默认任务堆栈大小增加到2048、而不是您当前拥有的1024、并将空闲堆栈大小从10240恢复到2048、看看这是否会产生差异。

    [/报价]

    我只增加了空闲堆栈大小、以排除这可能导致任何问题。 我将其切换回并增加了建议的默认堆栈大小、但错误仍然存在。

    [引用用户="Charles Tsaa"]

    还需要确保一次只能在一个事件对象上挂起一个任务。 同一个事件对象上不能有多个待处理任务。 例如、您是否有多个任务将基于 EventHandle_ABufferReady 解除阻止? 也许您没有此类问题、只是想确保。

    [/报价]

    只有一个任务、即 EventHandle_ABufferReady 的 VJ_TaskABufferFull 和 EventHandle_BBufferReady 的 VJ_TaskBBufferFull 在事件上处于暂挂状态。 只有 SWI 才会发布给他们、我希望这不是问题。 但我在文档中查看了它、它不应该是这样。

    [引用用户="Charles Tsaa"]
    我还有一个问题是、如果您首先将应用程序限制为仅使用 ADC0而不使用 ADC1、它是否能够正常工作? 在添加增量功能之前、从较小的器件开始并确保其正常工作会更容易。

    [/报价]

    我检查过、如果只有一个 ADC ADC0正在运行、该误差也会出现。 唯一的区别是、然后错误发生在 ISR_Adc0Sequencer1之后。 以下是调试会话的屏幕截图:

    我再次使用我所做的更改发布.cfg 文件、只是为了说明、我按照您的建议执行了所有操作。

    /*
    版权所有(c) 2015-2016、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    //
    
    
    
    /*========================= 时钟配置======================== */
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    var LoggingSetup = xdc.useModule('ti.uia.sysbios.LoggingSetup');
    var Global = xdc.useModule('ti.ndk.config.Global');
    var TCP = xdc.useModule('ti.ndk.config.Tcp');
    var IP = xdc.useModule('ti.ndk.config.Ip');
    var Event = xdc.useModule('ti.sysbios.knl.Event');
    var EMAC = xdc.useModule('ti.ndk.config.Emac');
    //
    *默认值取决于系列。 例如、Linux 系统通常仅
    *支持最短时间为10000us、是10000 us 的倍数。
    * TI 平台的默认值为1000us。
    */
    Clock.tickPeriod = 1000;
    
    
    
    /*=================== 默认值(模块)配置=================== //
    var Defaults = xdc.useModule('xdc.runtime.Defaults');
    //
    *允许在目标上加载模块名称的标志。 模块名称
    *字符串放置在.const 段中以用于调试。
    *
    *选择一个:
    *- true (默认值)
    * 将此参数设置为 true 将在.const
    *中包含名称字符串 部分、以便更容易调试错误和断言。
    *- false
    * 将此参数设置为 false 将减小.const
    *中的占用空间 部分。 因此、错误和断言消息将包含
    * "未知模块"前缀、而不是实际的模块名称。
    */
    Defaults.common$.namedModule = true;
    //Defaults.common$.namedModule = false;
    
    
    
    /*====== 错误配置=================== //
    var Error = 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 = Error.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 (默认值)
    * 检查系统堆栈在空闲循环期间溢出的顶字和
    * 如果检测到错误、则会引发错误。
    *- false
    * 禁用运行时检查可提高运行时性能并产生
    * 减小了闪存尺寸。
    //
    //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.excHandlerFunc =空;
    
    //
    *在除以零时启用硬件异常生成。
    *
    *选择一个:
    *- 0 (默认值)
    * 在除以0
    *- 1
    *时禁用硬件异常 在除以零时启用硬件异常
    */
    m3Hwi.nvicCCR.DIV_0_TRP = 0;
    //m3Hwi.nvicCCR.DIV_0_TRP = 1;
    
    //
    *为无效的数据对齐启用硬件异常生成。
    *
    *选择一个:
    *- 0 (默认值)
    * 禁用数据对齐的硬件异常
    *- 1
    * 启用数据对齐的硬件异常
    */
    m3Hwi.nvicCCR.UNALIGN_TRP = 0;
    //m3Hwi.nvicCCR.UNALIGN_TRP = 1;
    
    
    
    /*=========== 空闲配置========================= //
    var Idle = xdc.useModule('ti.sysbios.knl.Idle');
    //
    *空闲模块用于指定
    在系统中没有*其他任务正在运行时要调用的函数列表。
    *
    *此处添加的函数将在空闲任务内连续运行。
    *
    *函数签名:
    * void func (void);
    */
    ///idle.addFunc ("&myIdleFunc");
    
    
    
    /*=================== 内核(SYS/BIOS)配置=================== */
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    /*
    启用 BIOS 库中的断言。
    *
    *选择一个:
    *- true (默认值)
    * 启用断言以进行调试。
    *- false
    * 禁用断言以减小代码占用空间并提高性能。
    //
    //BIOS.assertsEnabled = true;
    BIOS.assertsEnabled = true;
    
    //
    *指定 BIOS 的默认堆大小。
    //
    BIOS.heapSize = 52768;
    
    //
    *一个标志,用于确定 xdc.runtime 源是否包含在自定义
    *构建的 BIOS 库中。
    *
    *选择一个:
    *- false (默认值)
    * 预构建的 xdc.runtime 库由相应的目标
    *提供 用于构建应用。
    *- true
    * 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 (),*
    需要一个用于动态内存分配的默认堆。
    *- false
    * 通过禁止 Mod_create()和 Mod_delete ()来减少代码占用空间
    * 调用的函数。 对象实例通过
    *构造 mod_construct()并通过 Mod_析 构函数()析构。
    */
    BIOS.runtimeCreatesEnabled = true;
    //BIOS.runtimeCreatesEnabled = false;
    
    /*
    启用 BIOS 库中的日志。
    *
    *选择一个:
    *- true (默认值)
    * 启用日志以进行调试。
    *- false
    * 禁用日志记录以减少代码占用空间并改善运行时间
    * 性能。
    */
    //BIOS.logsEnabled = true;
    BIOS.logsEnabled = true;
    
    
    
    /*=========== 内存配置=================== //
    var 内存= xdc.useModule('xdc.runtime.Memory');
    //
    *内存模块本身只为 IHeap
    
    模块(例如、 HeapMem、HeapBuf)。
    //
    
    
    
    /*========================= 程序配置=================== IAR
    
    忽略*//* Program.stack。 使用
    * IAR Embedded Workbench 中的项目选项来改变系统堆栈大小。
    //
    if (!Program.build.target.$name.match (/IAR/)){
    /*
    *减小系统堆栈大小(由 ISR 和 Swi 使用)以减小
    * RAM 使用情况。
    */
    Program.stack = 10240;
    }
    
    
    
    //
    *为 GNU 目标启用半主机功能以打印到 CCS 控制台
    */
    if (Program.build.target.$name.match (/GNU/)){
    VAR SemiHost = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
    }/*
    ========================= 信标配置=================== //
    var semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
    //
    *启用对任务优先级挂起队列的全局支持。
    *
    *选择一个:
    *- true (默认值)
    * 这允许根据任务优先级为待处理的任务提供服务。
    *- false
    * 待处理任务是基于先入先出的服务。
    *
    *在 ROM 中使用 BIOS 时:
    * 此选项必须设置为 false。
    //
    //semaphore.supportsPriority = true;
    semaphore.supportsPriority = false;
    
    //
    *允许通过信号量隐式布置事件,
    *禁用以保存其他代码。
    *
    *选择一个:
    *- true
    * 这允许信标模块发布信标和事件
    * 同步。
    *- false (默认值)
    * 必须显式发布事件以解除任务阻止。
    *
    ///semaphore.supportsEvents
    = true;
    semaphore.supportsEvents = false;
    
    
    
    /*=================== Swi 配置=================== //
    var Swi = xdc.useModule('ti.sysbios.knl.Swi');
    //
    *软件中断是一个包含
    要*执行的函数和优先级的对象。 软件中断被优先化、优先任务
    *并被硬件中断服务例程抢先。
    *
    *包括此模块是为了允许在用户的应用程序中使用 Swi。
    //
    
    
    
    /*========================= 系统配置=================== //
    var System = xdc.useModule('xdc.runtime.System');
    //
    *当系统异常退出时调用中止处理程序。
    *
    *选择一个:
    *- System.AbortStd (默认)
    * 调用 ANSI C 标准'abort()'来终止应用程序。
    *- System.AbortSpin
    * 在 while (1) trap
    *中无限循环的轻量级中止函数 功能。
    *-自定义中止处理程序
    * 用户定义的函数。 请参阅*的系统模块说明文件
    详细信息。
    */
    System.ABortFxn = System.ABortStd;
    //System.ABortFxn = System.ABortSpin;
    //System.ABortFxn ="&myAbortSystem";
    
    /*
    当系统正常退出时,将调用退出处理程序。
    *
    *选择一个:
    *- System.exitStd (默认)
    * 调用 ANSI C 标准'exit()'来终止应用程序。
    *- System.exitSpin
    * 在 while (1) trap
    *中无限循环的轻量级退出函数 功能。
    *-自定义退出函数
    * 用户定义的函数。 请参阅*的系统模块说明文件
    详细信息。
    //
    System.exitFxn = System.exitStd;
    //System.exitFxn = System.exitSpin;
    //System.exitFxn =“&myExitSystem”;
    
    //
    *最小化系统模块中的退出处理程序数组。 System 模块包括
    *一个在 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 = 1024;
    System.SupportProxy = SysMin;
    //var SysCallback = xdc.useModule('xdc.runtime.SysCallback');
    // System.SupportProxy = SysCallback;
    //SysCallback.abortFxn =[&myAbort];
    //SysCallback.exitFxn ="&myUserExit";/myUserFlushFlush
    =";/myUserCallback.UserFlushn =
    //SysCallback.putchFxn ="&myUserPutch";
    //SysCallback.readyFxn ="&myUserReady";
    
    
    
    
    /*=========== 任务配置=================== //
    var Task = xdc.useModule('ti.sysbios.knl.Task');
    //
    *检查任务堆栈是否存在溢出情况。
    *
    *选择一个:
    *- true (默认值)
    * 在
    *期间启用任务堆栈溢出情况的运行时检查 上下文切换("从"和"到")
    *- false
    * 禁用任务堆栈溢出条件的运行时检查。
    //
    //Task.checkStackFlag = true;
    Task.checkStackFlag = true;
    
    //
    *设置创建任务时的默认任务堆栈大小。
    *
    *默认值取决于所使用的器件。 减小默认堆栈
    *大小可节省更多内存。
    */
    Task.defaultStackSize = 10240;
    
    /*
    启用空闲任务。
    *
    *选择一个:
    *- true (默认值)
    * 创建优先级为0的任务、该任务调用空闲挂钩函数。 此
    * 选项必须设置为 true 才能获得 Power
    *提供的节能效果 模块。
    *- false
    * 未创建空闲任务。 此选项占用的内存较少、为 no
    * 需要额外的默认任务堆栈。
    * 若要在没有空闲任务的情况下通过电源模块实现节能
    、请执行* 将 Idle.run 添加为 Task.allBllockedFunc。
    //
    //Task.enableIdleTask = true;
    Task.enableIdleTask = true;
    //Task.allBlockedFunc = Idle.run;
    
    //
    *如果 Task.enableIdleTask 设置为 true,则该选项设置空闲任务
    的*堆栈大小。
    *
    *减小空闲堆栈大小可节省更多内存。
    //
    Task.idleTaskStackSize = 1024;
    
    //
    *减少任务优先级的数量。
    *默认值为16。
    *减少任务优先级的数量可节省内存。
    //
    Task.numPriorities = 16;
    
    
    
    //
    * Idle 函数列表。
    *
    *此处添加的函数将在空闲任务内连续运行。
    *
    *函数签名:
    * void func (void);
    */
    ///idle.addFunc ("&myIdleFunc");
    
    
    
    /*=================== 文本配置=================== //
    var text = xdc.useModule('xdc.runtime.Text');
    //
    *这些字符串放置在.const 段中。 将此参数设置为
    * false 将节省.const 段中的空间。 错误、断言和日志消息
    *将打印原始 ID 和 args、而不是格式化的消息。
    *
    *选择一个:
    *- true (默认值)
    * 此选项将测试字符串加载到.const 中、以便于调试。
    *- false
    * 此选项可减小.const 占用空间。
    */
    text.isLoaded = true;
    //text.isLoaded = false;
    
    
    
    /*=========== 类型配置=================== */
    var types = xdc.useModule('xdc.runtime.Types');
    /*
    此模块定义了在
    * xdc.runtime 软件包中使用的基本常量和类型。
    //
    
    
    
    /*========================= 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_noniced;
    //driversConfig.libType = driversConfig.LibType_instrumented;
    
    
    
    /*=========== 应用程序特定实例========================= //
    var m3Hwi0Params = new m3Hwi.Params ();
    m3Hwi0Params.instance.name ="HwiHandle_Timer2";
    m3Hwi0Params.priority = 0;
    Program.global.HwiHandle_Timer2 = m3Hwi.create (39、"&ISR_Timer2"、 m3Hwi0Params);
    LoggingSetup.sysbiosLogging = true;
    LoggingSetup.sysbiosHwiLogging = true;
    var m3Hwi1Params = new m3Hwi.Params ();
    m3Hwi1Params.instance.name ="HwiHandle_AdSequencer0";
    m3Hwi1Parwi.1优先级= 1;Program_c030_AdwiSequencer0"
    (Global、c030_AdwiSequencer0") m3Hwi1Params);
    var m3Hwi2Params = new m3Hwi.Params ();
    m3Hwi2Params.instance.name ="HwiHandle_Adc0Sequencer1";
    m3Hwi2Params.priority = 1;
    Program.global.HwiHandle_Adc0Sequencer1 = m3Hwi.create (31、"&1、"Adc0Sequencer1" m3Hwi2Params);
    var m3Hwi3Params = new m3Hwi.Params ();
    m3Hwi3Params.instance.name ="HwiHandle_Adc1Sequencer0";
    m3Hwi3Params.priority = 1;
    Program.global.HwiHandle_Adc1Sequencer0 = m3Hwi.create ("Adc0&isr"、Adc0)、"AdcSequencer0" m3Hwi3Params);
    var m3Hwi4Params = new m3Hwi.Params ();
    m3Hwi4Params.instance.name ="HwiHandle_Adc1Sequencer1";
    m3Hwi4Params.priority = 1;
    Program.global.HwiHandle_Adc1Sequencer1 = m3Hwi.create (63、Sequencer1) m3Hwi4Params);
    m3Hwi.diterAutoNestingSupport = false;
    var swi0Params = new Swi.Params ();
    swi0Params.instance.name ="Adc0Sequencer0";
    swi0Params.priority = 0;
    Program.global.Adc0Sequencer0 = Swi.create ("&SWI_Adc0Sequencer0";sw0Parencer0)
    var swi1Params = new swi.Params ();
    swi1Params.instance.name ="Adc0Sequencer1";
    swi1Params.priority = 0;
    Program.global.Adc0Sequencer1 = Swi.create ("&SWI_Adc0Sequencer1"、swi1Params);
    LoggingSetup.loadTaskLogging = true;
    LoggingSetup.loadSwiLogging = true;
    LoggingSetup.loadHwiLogging = true;
    LoggingSetup.enableTaskProfiler = true;
    LoggingSetup.loadLoggerSize = 15000;
    LoggingSetup.mainLoggerSize = 1024;
    var swi2Params = new Swi.Params ();
    swi2Params.instance.name ="Adc1Sequencer0";
    swi2Params.priority = 0;
    Program.global.Adc1Sequencer0 = Swi.create ("&SWI_Adc1Sequencer0"、swi2Params);
    var swi3Params = new swi.Params ();
    swi3Params.instance.name ="Adc1Sequencer1";
    swi3Params.priority = 0;
    Program.global.Adc1Sequencer1 = Swi.create ("&SWI_Adc1Sequencer1"、swi3Params);
    var swi4Params = new swi.Params ();
    swi4Params.instance.name ="Led0On";
    swi4Params.priority = 2;
    Program.global.Led0On = Swi.create ("&SWI_LED0On"、swi4Params);
    Ip.autoIp = false;
    ip.address ="192.168.1.2";
    Global.networkOpenHook ="&netOpen";
    Global. memRawPageCount = 6;
    Global. pktNumFrameBufs = 10;
    global.ndkThreadStackSize = 5120;
    Global. lowTaskStackSize = 5120;
    Global.normTaskStackSize = 5120;
    Global. highTaskStackSize = 5120;
    Memory.defaultHeapSize = 20480;
    Taskevent0Params = new Event.Params ();
    event0Params.instance.name
    
    
    
    
    
    event2Params.instance.name
    
    Global.netSchedulerPri = EventEventHandle_tcp";Program.global.EventHandle_TCP = Event.create (event0Params);var event1Params = new Event.Params ();event1Params.instance.name
    
    event3Params.instance.name ="EventHandle_AfBufferReady";Program.global.EventHandle_AParams = New Event.Params (event2Params = New Event.Params
    );event2EventParams = New EventParams = New EventParams.event2Params = New Event Setup.Params (Global);EventParams = Event BufferReady);EventParams.event2Params = EventParams = New EventParams = EventParams.event2Params.event_Params.eventParams.eventParams.eventParams.event2Params = New Event BufferReady;EventParams = EventParams.eventParams.eventParams.event2 Params.
    var event4Params = new Event.Params ();
    event4Params.instance.name ="EventHandle_Error";
    Program.global.EventHandle_Error = Event.create (event4Params);
    LoggingSetup.sysbiosSemaphoreLogging = true;
    tcp.transmitBufSize = 2048;
    ip.socketBufMinTxSize = 512;
    tcp.maxNumReasmPkts = 32;
    LoggingSetup.sysbiosLoggerSize = 15000;
    LoggingSetup.logerType = LoggingSetup.LoggerType_STOPMODE;
    BIOS.heapTrackEnabled = true;
    

    此致、

    Richard

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

    您好!

    我有一些"新"结果。 我切换了 HWI 的优先级、以便让它们受 RTOS 的控制、它们的类型现在是"已发送"、而不再是"零延迟"。 这有助于消除之前帖子中描述的奇怪异常行为。  但这有助于延迟问题的发生。 在大约40到50次 TCP 传输后、这意味着 ADC 和 DMA 传输正在正常运行、与 Adc0Sequencer0相对应的 HWI 会导致问题。 似乎永远不会清除中断或始终保持活动状态、操作系统就没有机会执行相应的 ISR 时执行任何其他操作。 我可以告诉您、原因计数变量在 ISR 中递增。 不执行其他 ISR、也不执行任务和 Swi。 因此、在我看来、它仍然像是一个 OS/Stack/MemoryLeak 问题、但我没有什么想法。 在下面的 ROV 屏幕截图和.cfg 文件的副本中、您可以看到我的更改。

    这里是我的.cfg 文件:

    /*
    版权所有(c) 2015-2016、德州仪器(TI)公司
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    //
    
    
    
    /*========================= 时钟配置======================== */
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    var LoggingSetup = xdc.useModule('ti.uia.sysbios.LoggingSetup');
    var Global = xdc.useModule('ti.ndk.config.Global');
    var TCP = xdc.useModule('ti.ndk.config.Tcp');
    var IP = xdc.useModule('ti.ndk.config.Ip');
    var Event = xdc.useModule('ti.sysbios.knl.Event');
    var EMAC = xdc.useModule('ti.ndk.config.Emac');
    var Hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
    //
    *默认值取决于系列。 例如、Linux 系统通常仅
    *支持最短时间为10000us、是10000 us 的倍数。
    * TI 平台的默认值为1000us。
    */
    Clock.tickPeriod = 1000;
    
    
    
    /*=================== 默认值(模块)配置=================== //
    var Defaults = xdc.useModule('xdc.runtime.Defaults');
    //
    *允许在目标上加载模块名称的标志。 模块名称
    *字符串放置在.const 段中以用于调试。
    *
    *选择一个:
    *- true (默认值)
    * 将此参数设置为 true 将在.const
    *中包含名称字符串 部分、以便更容易调试错误和断言。
    *- false
    * 将此参数设置为 false 将减小.const
    *中的占用空间 部分。 因此、错误和断言消息将包含
    * "未知模块"前缀、而不是实际的模块名称。
    */
    Defaults.common$.namedModule = true;
    //Defaults.common$.namedModule = false;
    
    
    
    /*====== 错误配置=================== //
    var Error = 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 = Error.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');
    //
    *在空闲循环中检查 Hwi (系统)堆栈溢出。
    *
    *选择一个:
    *- true (默认值)
    * 检查系统堆栈在空闲循环期间溢出的顶字和
    * 如果检测到错误、则会引发错误。
    *- false
    * 禁用运行时检查可提高运行时性能并产生
    * 减小了闪存尺寸。
    //
    //halHwi.checkStackFlag = true;
    halHwi.checkStackFlag = true;
    //m3Hwi.nvicCCR.UNALIGN_TRP = 1;
    
    
    
    /*==== 空闲配置========================= //
    var Idle = xdc.useModule('ti.sysbios.knl.Idle');
    //
    *空闲模块用于指定
    在系统中没有*其他任务正在运行时要调用的函数列表。
    *
    *此处添加的函数将在空闲任务内连续运行。
    *
    *函数签名:
    * void func (void);
    */
    ///idle.addFunc ("&myIdleFunc");
    
    
    
    /*=================== 内核(SYS/BIOS)配置=================== */
    var BIOS = xdc.useModule('ti.sysbios.BIOS');
    /*
    启用 BIOS 库中的断言。
    *
    *选择一个:
    *- true (默认值)
    * 启用断言以进行调试。
    *- false
    * 禁用断言以减小代码占用空间并提高性能。
    //
    //BIOS.assertsEnabled = true;
    BIOS.assertsEnabled = true;
    
    //
    *指定 BIOS 的默认堆大小。
    //
    BIOS.heapSize = 42768;
    
    //
    *一个标志,用于确定 xdc.runtime 源是否包含在自定义
    *构建的 BIOS 库中。
    *
    *选择一个:
    *- false (默认值)
    * 预构建的 xdc.runtime 库由相应的目标
    *提供 用于构建应用。
    *- true
    * 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 (),*
    需要一个用于动态内存分配的默认堆。
    *- false
    * 通过禁止 Mod_create()和 Mod_delete ()来减少代码占用空间
    * 调用的函数。 对象实例通过
    *构造 mod_construct()并通过 Mod_析 构函数()析构。
    */
    BIOS.runtimeCreatesEnabled = true;
    //BIOS.runtimeCreatesEnabled = false;
    
    /*
    启用 BIOS 库中的日志。
    *
    *选择一个:
    *- true (默认值)
    * 启用日志以进行调试。
    *- false
    * 禁用日志记录以减少代码占用空间并改善运行时间
    * 性能。
    */
    //BIOS.logsEnabled = true;
    BIOS.logsEnabled = true;
    
    
    
    /*=========== 内存配置=================== //
    var 内存= xdc.useModule('xdc.runtime.Memory');
    //
    *内存模块本身只为 IHeap
    
    模块(例如、 HeapMem、HeapBuf)。
    //
    
    
    
    /*========================= 程序配置=================== IAR
    
    忽略*//* Program.stack。 使用
    * IAR Embedded Workbench 中的项目选项来改变系统堆栈大小。
    //
    if (!Program.build.target.$name.match (/IAR/)){
    /*
    *减小系统堆栈大小(由 ISR 和 Swi 使用)以减小
    * RAM 使用情况。
    */
    Program.stack = 10240;
    }
    
    
    
    //
    *为 GNU 目标启用半主机功能以打印到 CCS 控制台
    */
    if (Program.build.target.$name.match (/GNU/)){
    VAR SemiHost = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
    }/*
    ========================= 信标配置=================== //
    var semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
    //
    *启用对任务优先级挂起队列的全局支持。
    *
    *选择一个:
    *- true (默认值)
    * 这允许根据任务优先级为待处理的任务提供服务。
    *- false
    * 待处理任务是基于先入先出的服务。
    *
    *在 ROM 中使用 BIOS 时:
    * 此选项必须设置为 false。
    //
    //semaphore.supportsPriority = true;
    semaphore.supportsPriority = false;
    
    //
    *允许通过信号量隐式布置事件,
    *禁用以保存其他代码。
    *
    *选择一个:
    *- true
    * 这允许信标模块发布信标和事件
    * 同步。
    *- false (默认值)
    * 必须显式发布事件以解除任务阻止。
    *
    ///semaphore.supportsEvents
    = true;
    semaphore.supportsEvents = false;
    
    
    
    /*=================== Swi 配置=================== //
    var Swi = xdc.useModule('ti.sysbios.knl.Swi');
    //
    *软件中断是一个包含
    要*执行的函数和优先级的对象。 软件中断被优先化、优先任务
    *并被硬件中断服务例程抢先。
    *
    *包括此模块是为了允许在用户的应用程序中使用 Swi。
    //
    
    
    
    /*========================= 系统配置=================== //
    var System = xdc.useModule('xdc.runtime.System');
    //
    *当系统异常退出时调用中止处理程序。
    *
    *选择一个:
    *- System.AbortStd (默认)
    * 调用 ANSI C 标准'abort()'来终止应用程序。
    *- System.AbortSpin
    * 在 while (1) trap
    *中无限循环的轻量级中止函数 功能。
    *-自定义中止处理程序
    * 用户定义的函数。 请参阅*的系统模块说明文件
    详细信息。
    */
    System.ABortFxn = System.ABortStd;
    //System.ABortFxn = System.ABortSpin;
    //System.ABortFxn ="&myAbortSystem";
    
    /*
    当系统正常退出时,将调用退出处理程序。
    *
    *选择一个:
    *- System.exitStd (默认)
    * 调用 ANSI C 标准'exit()'来终止应用程序。
    *- System.exitSpin
    * 在 while (1) trap
    *中无限循环的轻量级退出函数 功能。
    *-自定义退出函数
    * 用户定义的函数。 请参阅*的系统模块说明文件
    详细信息。
    //
    System.exitFxn = System.exitStd;
    //System.exitFxn = System.exitSpin;
    //System.exitFxn =“&myExitSystem”;
    
    //
    *最小化系统模块中的退出处理程序数组。 System 模块包括
    *一个在 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 = 1024;
    System.SupportProxy = SysMin;
    //var SysCallback = xdc.useModule('xdc.runtime.SysCallback');
    // System.SupportProxy = SysCallback;
    //SysCallback.abortFxn =[&myAbort];
    //SysCallback.exitFxn ="&myUserExit";/myUserFlushFlush
    =";/myUserCallback.UserFlushn =
    //SysCallback.putchFxn ="&myUserPutch";
    //SysCallback.readyFxn ="&myUserReady";
    
    
    
    
    /*=========== 任务配置=================== //
    var Task = xdc.useModule('ti.sysbios.knl.Task');
    //
    *检查任务堆栈是否存在溢出情况。
    *
    *选择一个:
    *- true (默认值)
    * 在
    *期间启用任务堆栈溢出情况的运行时检查 上下文切换("从"和"到")
    *- false
    * 禁用任务堆栈溢出条件的运行时检查。
    //
    //Task.checkStackFlag = true;
    Task.checkStackFlag = true;
    
    //
    *设置创建任务时的默认任务堆栈大小。
    *
    *默认值取决于所使用的器件。 减小默认堆栈
    *大小可节省更多内存。
    */
    Task.defaultStackSize = 10240;
    
    /*
    启用空闲任务。
    *
    *选择一个:
    *- true (默认值)
    * 创建优先级为0的任务、该任务调用空闲挂钩函数。 此
    * 选项必须设置为 true 才能获得 Power
    *提供的节能效果 模块。
    *- false
    * 未创建空闲任务。 此选项占用的内存较少、为 no
    * 需要额外的默认任务堆栈。
    * 若要在没有空闲任务的情况下通过电源模块实现节能
    、请执行* 将 Idle.run 添加为 Task.allBllockedFunc。
    //
    //Task.enableIdleTask = true;
    Task.enableIdleTask = true;
    //Task.allBlockedFunc = Idle.run;
    
    //
    *如果 Task.enableIdleTask 设置为 true,则该选项设置空闲任务
    的*堆栈大小。
    *
    *减小空闲堆栈大小可节省更多内存。
    //
    Task.idleTaskStackSize = 1024;
    
    //
    *减少任务优先级的数量。
    *默认值为16。
    *减少任务优先级的数量可节省内存。
    //
    Task.numPriorities = 16;
    
    
    
    //
    * Idle 函数列表。
    *
    *此处添加的函数将在空闲任务内连续运行。
    *
    *函数签名:
    * void func (void);
    */
    ///idle.addFunc ("&myIdleFunc");
    
    
    
    /*=================== 文本配置=================== //
    var text = xdc.useModule('xdc.runtime.Text');
    //
    *这些字符串放置在.const 段中。 将此参数设置为
    * false 将节省.const 段中的空间。 错误、断言和日志消息
    *将打印原始 ID 和 args、而不是格式化的消息。
    *
    *选择一个:
    *- true (默认值)
    * 此选项将测试字符串加载到.const 中、以便于调试。
    *- false
    * 此选项可减小.const 占用空间。
    */
    text.isLoaded = true;
    //text.isLoaded = false;
    
    
    
    /*=========== 类型配置=================== */
    var types = xdc.useModule('xdc.runtime.Types');
    /*
    此模块定义了在
    * xdc.runtime 软件包中使用的基本常量和类型。
    //
    
    
    
    /*========================= 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_nonetieded;
    var sw0Params = new Swi.Params ();
    swi0Params.instance.name ="Adc0Sequencer0";
    sw0Params.priority = 15;
    Program.global.Adc0Sequencer0 = Swi.create ("&SWI_Adc0Sequencer0";sw0Params);
    var swi1Params = new swi.Params ();
    swi1Params.instance.name ="Adc0Sequencer1";
    swi1Params.priority = 1;
    Program.global.Adc0Sequencer1 = Swi.create ("&SWI_Adc0Sequencer1"、swi1Params);
    LoggingSetup.loadTaskLogging = true;
    LoggingSetup.loadSwiLogging = true;
    LoggingSetup.loadHwiLogging = true;
    LoggingSetup.enableTaskProfiler = true;
    LoggingSetup.loadLoggerSize = 15000;
    LoggingSetup.mainLoggerSize = 1024;
    var swi2Params = new Swi.Params ();
    swi2Params.instance.name ="Adc1Sequencer0";
    swi2Params.priority = 2;
    Program.global.Adc1Sequencer0 = Swi.create ("&SWI_Adc1Sequencer0"、swi2Params);
    var swi3Params = new swi.Params ();
    swi3Params.instance.name ="Adc1Sequencer1";
    swi3Params.priority = 3;
    Program.global.Adc1Sequencer1 = Swi.create ("&SWI_Adc1Sequencer1"、swi3Params);
    var swi4Params = new swi.Params ();
    swi4Params.instance.name ="Led0On";
    swi4Params.priority = 15;
    Program.global.Led0On = Swi.create ("&SWI_LED0On"、swi4Params);
    Ip.autoIp = false;
    ip.address ="192.168.1.2";
    Global.networkOpenHook ="&netOpen";
    Global. memRawPageCount = 6;
    Global. pktNumFrameBufs = 10;
    global.ndkThreadStackSize = 5120;
    Global. lowTaskStackSize = 5120;
    Global.normTaskStackSize
    
    
    
    
    
    
    
    
    event2Params.instance.name = 5120;Global. highTaskStackSize = 5120;var event0Params = new Event.Params ();event0Params.instance.name
    
    Global.netSchedulerPri ="EventHandle_tcp";Program.global.EventHandle_TCP = Event.Create (event0Params = New Event.Parle.Params);var Event BufferReady = New Event.Params = New Event.Params = event1Params.instance.name;Event.Params = Event BufferBatter.Params = New Event.Params = New Event.Parle.Params = New Event.Params = New Event.Params.event.Params;Event.Params = New Event.Params = New Event.Params = New Event.Params = New Event.Params = New Event.Params = New Event.Params.event.Params;Event.Param
    var event3Params = new Event.Params ();
    event3Params.instance.name ="EventHandle_TaskSetupReady";
    Program.global.EventHandle_TaskSetupReady = Event.create (event3Params);
    var event4Params = new Event.Params ();
    event4Params.instance.name ="EventHandle_Error";
    Program.global.EventHandle_Error = EventLogore.tcp
    
    = New EventBios4ParoreLogore.tcp = event42048;EventSembiosLoggLogging = Event Logg2048;EventShumingTCP = Event Loggon.event4488
    ip.socketBufMinTxSize = 512;
    tcp.maxNumReasmPkts = 32;
    LoggingSetup.sysbiosLoggerSize = 15000;
    LoggingSetup.logerType = LoggingSetup.LoggerType_STOPMODE;
    BIOS.heapTrackEnabled = true;
    var hwi0Params = new Hwi.Params ();
    hwi0Params.instance.name ="HwiHandle_Adc0Sequencer0";
    hwi0Params.priority = 255;
    hwi0Params.enableInt = true;
    Program.global.HwiHandle_Adc0Sequencer0 = Hwi.create (30、 "&ISR_Adc0Sequencer0"、hwi0Params);
    var hwi1Params = new Hwi.Params ();
    hwi1Params.instance.name ="HwiHandle_Adc0Sequencer1";
    hwi1Params.priority = 255;
    hwi1Params.enableInt = true;
    Program.global.HwiHandle_Adc031 (创建 Hwi31) "&ISR_Adc0Sequencer1"、hwi1Params);
    var hwi2Params = new Hwi.Params ();
    hwi2Params.instance.name ="HwiHandle_Adc1Sequencer0";
    hwi2Params.priority = 255;
    hwi2Params.enableInt = true;
    Program.global.HwiHandle_Adc62 = Hwi0 (创建地址1) "&ISR_Adc1Sequencer0"、hwi2Params);
    var hwi3Params = new Hwi.Params ();
    hwi3Params.instance.name ="HwiHandle_Adc1Sequencer1";
    hwi3Params.priority = 255;
    Program.global.hwiHandle_Adc1Sequencer1 = Hwi_Adc1Sequencer1 (&ISR、Adc1)、"&rencer1、"Adc63、Adc1、"&isr" hwi3Params);
    var hwi4Params = new Hwi.Params ();
    hwi4Params.instance.name ="HwiHandle_Timer2";
    hwi4Params.priority = 255;
    hwi4Params.enableInt = true;
    Program.global.HwiHandle_Timer2 = Hwi.create (39、 "&ISR_Timer2"、hwi4Params);
    

    提前感谢大家阅读这篇文章。

    此致、

    Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    您能否显示与 Adc0Sequencer0相对应的 ISR 代码? 我想看看如何清除 ADC 中断标志。 ADC0SEQUENCER 的 ISR 看起来会不断重新进入。 您能否在清除这些标志后还尝试读取中断标志(使用 ADCIntStatus)? 原因是 Cortex-M 处理器中有一个写入缓冲区、在实际清除标志之前可能需要一些周期。 如果清除标志并立即退出 ISR、则可能导致中断重新进入。 如果您在清除后尝试读取标志、则它可以保证在退出 ISR 之前实际清除标志。 请尝试一下。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢您的播放。

    [引用用户="Charles Tsaa"]
    您能否显示与 Adc0Sequencer0相对应的 ISR 代码?

    [/报价]

    我在原始帖子中展示了它。

    [引用用户="Charles Tsaa"]

    您能否在清除这些标志后还尝试读取中断标志(使用 ADCIntStatus)? 原因是 Cortex-M 处理器中有一个写入缓冲区、在实际清除标志之前可能需要一些周期。 如果清除标志并立即退出 ISR、则可能导致中断重新进入。 如果您在清除后尝试读取标志、则它可以保证在退出 ISR 之前实际清除标志。 请尝试一下。

    [/报价]

    我将在早上尝试第一件事。

    此致、

    Richard

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

    您好、Charles、

    很抱歉耽误你的回答!

    是的、问题已解决、但有完全不同的解决方案。

    我们使用了函数 EK_TM4C129EXL_initDMA、该函数写入 EK_TM4C129EXL.c 文件中 该文件包含在标准 RTOS 工程中、我们将根据该工程构建程序。 它为某些外设提供初始化功能、例如 WiFi。 在这些 init 函数内调用 EK_TM4C129EXL_initDMA。 EK_TM4C129EXL_initDMA 基本上只是打开 UDMA、为其提供一个控制结构并设置一个标志、这样需要使用 UDMA 的其他外设知道 DMA 已经被初始化、并且提供了一个控制结构。 但是、在 EK_TM4C129EXL.c 中、控制结构仅包含32个条目、但由于我们使用乒乓模式、我们需要64个条目、32个主传输条目和32个备用传输条目。 遗憾的是、DMA 控制结构被直接放置在某些包含 HWI 重要数据的存储器区域附近。 因此、每次我们设置备用 DMA 传输时、我们都会在该区域写入一些数据。 无论如何、我们将 DMA 控制结构的大小从32更改为64、不再有任何问题。

    此致、

    Richard