工具/软件:TI-RTOS
我的应用的目标是通过 SPI 从 IC 获取测量数据、对其进行滤波并通过 CAN 将其发送到另一个 MCU。 代码列表运行正常,直到调用248-252个测量(包括通过 SPI 的通信)之后为止,loader_exit()。 应用程序不会以任何方式专门处理测量值的数量。
使用 SPI 总线的唯一任务是测量任务、这是一个带有1个 Semaphore_pend 函数的 while 循环、该循环每10ms 由一个时钟函数的 HWI 发布一次。 使用了 TI-RTOS SPI API" SPI.h"。
我尝试通过几种方法来解决问题、但线索指出了几个方面:
-(1)为测量任务使用较大的周期不能解决问题、根据时间戳、测量任务需要的时间少于10ms。
-(2)退出之前所需的测量次数取决于为时钟模块选择的计时器(计时器0-5)、但对于相同的计时器、测量值相同、始终约为250、但始终小于255 (没有任何 uint8_t 溢出的指示)。
-(3)测量次数与测量任务的周期无关、增加测量周期会增加直至呈线性退出的时间。 例如、将周期设置为100ms 会使退出的时间比将其设置为10ms 时高10倍。
-(4)在 IC 未以 SPI 从器件的形式物理连接到 TM4C 时进行测量时、测量值不会增加测量值、直到退出。 这意味着该应用程序稳定运行了许多分钟、尝试进行数千次测量(当然、通过 SPI 什么也没有)、但仅在再次连接 IC 后、它才会进行248-252测量、直至退出。
-(5)当单步执行代码时,在 调用 TI_RTOS Task_sleep()函数时,退出似乎会发生。 在退出之前、对该函数进行了大约3000次调用(再次稍微取决于为时钟模块选择的计时器)。
-(6)当让应用程序运行时,退出总是在相同数量的测量之后发生。 当在退出之前停止并且单步执行每行代码时、退出不会发生。 为了使其发生、需要在一次运行中执行几行代码、其中调用 Task_sleep()函数、然后再停止 MCU。
-(7)在 ROV 中、任务- SWI -或 HWI -堆栈或堆不发生溢出
-(8)在 ROV 中进行209-212次测量后(再次稍微依赖于为时钟模块选择的定时器)错误"在 View init 代码中捕获到异常:"c:/ti/tirex-content/xdc tools_3_32_00_06_core/packages/XDC/ROV/StructureDecoder.xs"、行518:java.lang.exception:目标存储器在地址0x9994a8、长度为0x994a8 根据应用的段映射、第24个被读取在一个无效地址上。 应用程序可能未初始化或已损坏。" 发生在 HWI 模块的上下文中、并一直保持到退出。 同样、如(6)所示、单步执行代码不会导致错误发生。
大多数线索似乎表明存在时序问题、但线索(4)似乎表明存在 SPI 问题。 时钟模块或"spi.h"中是否有任何可能发生溢出的计数器?
我尝试了以下方法、但没有任何效果:
(a)更改时钟模块设置(周期、中断/不在每个周期中断)
(b)从 RTOS SPI 函数切换到非 RTOS SPI 函数(使用 SSIPutDataNonBlocking ()..)
(c)使用其他板
(D)使用其他 XDCTools 版本
(e)禁用其他任务
使用以下软件版本:
CCS:7.1.0.0016、用于 TivaC 的 TI-RTOS:2.16.0.08、Tiva C 系列 ARM CPU:2.1.15071、编译器:v16.9.2.LTS、XDCTools:3.32.0.06_CORE、OS:Windows 10 Home
此处是用于测量任务和 SPI 连接的*。cfg 和*。c、以防它们帮助您了解问题:
e2e.ti.com/.../7026.AMS2017.cfg
e2e.ti.com/.../6013._5F00_TASK_5F00_Measure.c
e2e.ti.com/.../8360.Peripherals_5F00_SPI_5F00_Transfer.c
不幸的是、我不知道如何解决遗留的问题、因为线索和背景非常混乱。
如果您对调试方向有任何疑问、接下来就可以找出问题所在、那将是非常好的选择。