“线程”中讨论的其他部件:SysBIOS,, EK-TM4C1294XL, TM4C123
工具/软件:Code Composer Studio
您好,
我们开始构建一种使用SPI从外部设备读取数据的设计。 数据从TM4C129 UC写入板载SRAM。 这种做法毫无瑕疵。
同时,在该论坛的帮助下,获得了此设计的修订版本,该版本将SPI替换为QSSI (并暂时删除将数据发送到外部主机的单独任务)。 来自外部数据源的QSSI数据传输到UINT32_t类型(称为rcv_data)。 在调试模式下运行,通过包含QSSI读取命令(参见下面的代码)的while (1)循环,并观察rcv_data变量,始终返回正确的数据,一切正常。 但是,当我删除该循环中的断点并让其运行时,设计会崩溃。 此时 ,数据不会传输到任何位置。 最后一个值被下一个值覆盖(如上所述,将此数据发送到主机的任务已被删除,以简化调试)。
我一直在阅读以下文档,诊断Stellaris微处理器中的软件故障(AN0.1286万–2012年5月),并根据PC,LR,PSR,NVIC reg等的内容查看各种ROV,拆卸和内存视图
每次运行时,崩溃似乎发生在同一位置。
每次运行时,崩溃似乎都发生在相同的位置。
调试会话的过程如下所示:
逐步执行启动/初始化序列,最后进入switchFromBootStack__E 如果我不介入,设计就会开始运行。 进入,到达HWI_SWITCHFromBootStack(),然后,
/*通过enter()*/启动第一个任务
Task_SupportProxy_swap((PTR)&prepTask->Context,
(PTR)&Task_module->curTask->context);
进入后,您将看到以下内容:
/* swap__E */
xdc_void ti_SysBIOS_KNL_Task_SupportProxy_swap__E (XDC_PTR *oldtskContext,XDC_PTR *newtskContext)
{
TI_SysBIOS_family_arm_m3/TaskSupport_swap (oldtskContext,newtskContext);
}
从那里跳转到CmdH中的while (1)循环,位于线路SSIDataPut。
崩溃前,在几个xfers上,ROV任务–详细视图:
和ROV任务–呼叫堆栈:
和HWI–详细信息:
现在让它去吧。
请注意,当完成QSSI xfers时,while (1)循环在两个连续的调用之间有一个wait()。 没有这种等待,崩溃几乎是立即发生的。 等待时,在调试环境中,但在空闲运行时,崩溃需要~10分钟。
控制台中的崩溃报告:
[Cortex_M4_0]波特率: 9.8968万 返回:0 TI.SysBIOS.family.arm.m3.Hwi:行1095:e_hardFault:Forced TI.SysBIOS.family.arm.m3.Hwi:line 1172:e_busFault:PRECISERR:Immediate Bus Fault,Exact addr Known,address:1ad05c95 在PC = 0x0.0058万dc的后台线程中出现异常。 核心0:ThreadType_Task中出现异常。 任务名称:{unknown-instance-name},句柄:0x20.0003万a8。 任务堆栈库:0x20.0003万f8。 任务堆栈大小:0x200。 R0 = 0x2.0001万fb8 R8 = 0x0.0001万 R1 = 0x0000fdc4 R9 = 0x0.0064万 R2 = 0x0.002万 R10 = 0x0万 R3 = 0x1ad0.03万 R11 = 0x0.002万 R4 = 0x0000ad00 R12 = 0x1b26.02万 R5 = 0x0.5995万 SP (R13)= 0x2000.0548万 R6 = 0x2000.302万 LR (R14)= 0x0.0082万e3 R7 = 0x0万 PC (R15)= 0x0.0058万dc PSR = 0x8100.18万 ICSR = 0x42.3803万 MMFSR = 0x00 BFSR = 0x82 UFSR = 0x0000 HFSR = 0x4000万 DFSR = 0x0.0001万 MMAR = 0x1ad05c95 BFAR = 0x1ad05c95 AFSR = 0x0万 正在终止执行... |
崩溃时调用的最后一个函数,在exit.c中,第54行:
静态void loader_exit (void)
查看ROV任务–详细信息:
ROV任务–调用栈:
HWI详细信息:
崩溃返回的PC:
崩溃在拆卸中返回LR:
显示NVIC第一部分的内存视图(内存视图中为0xE100_E100)。
故障统计值为0x0.82万–位(15:8)=总线故障= 1000_0010。0010。
可能有趣的位细分:
位15=1–有效的故障地址
位12 = 0–堆栈时未出现异常条目的故障。
位11 = 0–从异常返回的卸垛过程中未发生故障
位9–1 -发生数据总线错误,为异常堆栈的PC值返回到导致故障的指令。
诊断文档(如上所述)的第7页说明了此故障值,总线故障地址寄存器包含触发总线故障的地址的确切值。 查看该地址0xE000.ED38,
故障地址我假设是上述输出中的前32位,0x1AD05C95(?)。 这应该是导致硬总线故障的指令的地址;它与故障转储消息中报告的地址相匹配。
在“拆装”视图中查看该地址:
参考内存模型映射(第 109)在UC UG中,0x300_0000至0x1FFF_FFFF范围内的任何地址都是保留的。
所以,我在这一点上有点迷失。 我根本不是把这里的点连在一起。 希望有人可以看看这个问题,看看我需要在旁边打个招呼,以找出代码失败的地方。
谢谢你。