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/TM4C129ENCZAD:尝试调试运行QSSI和TIRTOS的设计崩溃

Guru**** 1831610 points
Other Parts Discussed in Thread: EK-TM4C1294XL, SYSBIOS, TM4C129ENCZAD
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/589919/ccs-tm4c129enczad-trying-to-debug-design-crash-running-qssi-and-tirtos

部件号:TM4C129ENCZAD
“线程”中讨论的其他部件:SysBIOS,, EK-TM4C1294XL, TM4C123

工具/软件:Code Composer Studio

您好,

我们开始构建一种使用SPI从外部设备读取数据的设计。 数据从TM4C129 UC写入板载SRAM。 这种做法毫无瑕疵。

同时,在该论坛的帮助下,获得了此设计的修订版本,该版本将SPI替换为QSSI (并暂时删除将数据发送到外部主机的单独任务)。  来自外部数据源的QSSI数据传输到UINT32_t类型(称为rcv_data)。 在调试模式下运行,通过包含QSSI读取命令(参见下面的代码)的while (1)循环,并观察rcv_data变量,始终返回正确的数据,一切正常。 但是,当我删除该循环中的断点并让其运行时,设计会崩溃。 此时 ,数据不会传输到任何位置。 最后一个值被下一个值覆盖(如上所述,将此数据发送到主机的任务已被删除,以简化调试)。

我一直在阅读以下文档,诊断StellarisRegistered微处理器中的软件故障(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范围内的任何地址都是保留的。

所以,我在这一点上有点迷失。 我根本不是把这里的点连在一起。 希望有人可以看看这个问题,看看我需要在旁边打个招呼,以找出代码失败的地方。

谢谢你。

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

    Fault Address我假定是上述输出中的前32位,0x1AD05C95(?)。 这假定是导致硬总线故障的指令的地址;它与故障转储消息中报告的地址匹配。

    故障地址是尝试访问时生成总线故障的地址。

    导致总线故障的指令地址由PC在控制台报告的异常跟踪中列出,在您的情况下,该异常跟踪是 PC(R15)=0x0.0058万dc。

    此外,如果您在“Hwi -> exception”(Hwi ->异常)下的ROV视图中查看,您应该会看到异常调用栈,该调用栈显示导致生成异常的指令的调用栈。

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

    您好,

    感谢您的快速回复。 已查看PC地址的以下内容:

    拆卸视图:

    如果我的解释正确,Hwi_restore(key)函数调用是什么?

    HWI调用栈:

    那么,崩溃是否会擦除 Hwi异常信息?

     "不能对非对象使用'In (输入)'意味着什么(Google搜索未对此消息执行任何操作)?

    HWI_Restore (key)参数'key'似乎是由HWI_Disable调用生成的。 '钥匙'的杆可能是假的吗?

    再次感谢您的帮助。

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

    如果我的解释正确,Hwi_RESTORE(key)函数调用是什么?[/QUETE]CCS拆卸视图在构成语句的指令之前显示相应的源语句。 这意味着地址0x58dc的指令实际上是用于GPIOTiva_config.callbacks[index]= callback;语句。

    so appears the crash wi exception info wi?(是否显示崩溃已擦除HWI异常信息?)

     "不能在非对象上使用'N'意味着什么(Google搜索未在该消息上显示任何内容)?[/QUOT]我认为 "不能在非对象上使用'N'是用于传递异常信息的ROV软件中的一个内部错误,我也找不到该错误的含义。 论坛搜索发现多个“从ROV服务器收到异常:”的情况,但不清楚这是否是由于目标内存损坏造成的。

    出现异常后,您可以使用 “CCS寄存器”视图尝试异常转储解码 ,通过将异常转储中的PC,SP和LR值粘贴到核心寄存器,使“CCS调试”视图显示异常时的调用栈。

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

    Crash returned PC:

    崩溃在拆卸中返回LR:

    报告的PC和LR例外寄存器值不一致。 PC处于 GPIO_setCallback()函数中,LR处于XDC_runtime_Timestamp_SupportProxy_Get_64__E()函数中。 其中 ,XDC_runtime_Timestamp_SupportProxy_Get_64__E()函数不会调用  GPIO_setCallback()函数。

    因此,堆栈可能已损坏。 发生异常后,ROV任务->详细视图是否报告是否发生堆栈溢出?

    此外,ROV BIOS ->扫描错误视图显示什么错误?

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

    使用异常转储解码使用CCS寄存器视图在异常时重新创建堆栈,以下屏幕捕获显示了结果:


    不确定这是否成功-报告未定义符号-这只是调试器的一个项目还是尝试告诉我存在代码问题?

    侧注:我在qssi读取的无限while循环中进行了更改。 删除了一条Wait语句(插入该语句是为了减缓循环),然后添加了一个Systemprintf以报告每1000个读取值(从qssi读取返回)。  可能是为什么崩溃转储与我之前发布的那个不同(?)。

    仍然看不到源代码出现故障的位置的连接。

    关于 ROV任务-详细,这是碰撞后的内容:

    还有其他建议吗?

    再次感谢您的所有帮助。 至少我正在进一步了解如何解释调试输出(比我想象的要困难得多)

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

    MAIN中有一个剩余的SDRAM_MAIN () init函数调用,它不需要处于活动状态,因为在我测试的这个版本中,已删除SDRAM。 注释掉SDRAM_MAIN ()后,应用程序将以全速运行~5或6分钟(no wait()),以上引用的计数器已被删除;在调试视图中,只需告诉它去。 当它最终崩溃时,我看到的就是这种情况;

    控制台中的崩溃转储:

    [Cortex_M4_0]波特率:  9.8968万

    返回:fffffffff7

    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:f6dd045d.

    在PC = 0x0.0608万a的后台线程中发生异常。

    核心0:ThreadType_Task中出现异常。

    任务名称:{unknown-instance-name},句柄:0x2000.071万。

    任务堆栈库:0x2000.076万。

    任务堆栈大小:0x400。

    r0 = 0xf6dd045d     R8 = 0xffffffff

    R1 = 0x200.0529万c       R9 = 0xffffffff

    R2 = 0x0万       R10 = 0xffffffff

    R3 = 0x0万    R11 = 0xffffffff

    R4 = 0x2000.455万    R12 = 0x1a23.03万

    R5 = 0x0万    SP (R13)= 0x2.0003万e90

    r6 = 0x0万f8     LR (R14)= 0x0.4453万

    R7 = 0xffffffff                 PC (R15)= 0x0.0608万a

    PSR = 0x8100万

    ICSR = 0x42.3803万

    MMFSR = 0x00

    BFSR = 0x82

    UFSR = 0x0000

    HFSR = 0x4000万

    DFSR = 0x0.0001万

    MMAR = 0xf6dd045d

    BFAR = 0xf6dd045d

    AFSR = 0x0万

    正在终止执行...

    ROV任务-详细:

    ROV任务-堆栈:

    符号不可用?

    ROV BIOS -扫描错误:

    无法从空读取已启用的属性?

    拆卸–在PC上:

    向上滚动上面的窗口几行,我看到以下行:

      TI_SysBIOS_KNL_Swi_restoreHWi__E():

        0.6048万:  B570              推送      {R4,R5,R6,LR}

        0.0604万a:  BB78              cbnz      r0,#0x60ac

     还不知道这是在哪里或什么。

    拆卸- SP:

    所有这些F看起来都不好?

    拆卸LR:

    希望这里有一些有用的线索-早上再看一下。 任何建议都值得赞赏。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从上面看,它似乎是在处理任务切换(?)的代码中发生的崩溃。
    目前有两个任务,一个是心跳(优先级10),另一个是QSSI_Test (优先级1)。

    我完成了心跳任务。 qssi测试以全速运行,没有崩溃-运行~40分钟(哇)。

    尚不清楚在这方面应寻找什么。 操作系统不能完成这项切换任务吗? 为了使任务切换不成问题,用户应用程序必须执行什么操作(甚至不确定我是否在这里提出智能问题...)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    re。使用异常转储解码使用CCS寄存器视图在异常情况下重新创建堆栈,以下屏幕截图显示了结果:

    不确定这是否成功-我看到了对HWI_Object的引用。 这是我应该期待的吗?  下一行报告未定义任何符号-这只是调试器的一个项目还是尝试告诉我存在代码问题?从查看屏幕截图,仅将PC的值从异常转储复制到核心寄存器。 要完成调试视图中的回溯,还需要将SP和LR的值从异常转储复制到Core寄存器。

    “No symbols are defined”(未定义符号)用于RAM的地址0x20.0003万a8,可能是未从异常转储复制到核心寄存器的SP和LR寄存器值的副作用;因为SP和LR寄存器值需要遵循回溯。

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

    [报价用户="Erik skullerude]Disassembly - SP:

    所有这些F看起来都不好? RAM中的SP指向堆栈,堆栈用于本地变量,而不是可执行代码。 因此,拆卸堆栈时应显示无效的指令。

    堆栈上的所有F并不一定表示存在问题;这取决于这些地址的用途。

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

    [QUETE USER="Erik skullerude]\n尚不确定在这方面要寻找什么。 操作系统不能完成这项切换任务吗? 用户应用程序必须执行哪些操作才能使任务切换不成问题(甚至不确定我是否在这里提出智能问题...)?[/QUOT]是的,任务切换由操作系统完成。

    考虑到间歇性崩溃,您不能确定是否有应用程序错误覆盖了一些内存,是否在TI-RTOS中发现了错误,或者是否有硬件问题。

    有关您的环境的一些问题:

    1)您使用的是TI EVM还是定制电路板?

    [提到 TM4C129ENCZAD时,我假设使用了定制板]

    2)使用的是TI-RTOS的哪个版本?

    3)正在使用哪个编译器?

    4)使用的CCS是什么版本?

    5)是否有多块主板要尝试,如果有,所有主板是否都显示崩溃?

    6)您是否能够发布显示问题的项目?

    一些建议:

    7)在"SYS/BIOS -计时选项"下的.cfg文件中,您可以检查是否已正确设置时钟配置以匹配您的硬件。

    例如,如果SYS/BIOS时钟配置中指定的Crystal值与硬件上的实际Crystal值不匹 配,则设备可能会超频,从而导致间歇性操作。

    8)调试器屏幕截图显示正在使用支持SWO跟踪的XDS200仿真器。 如果启用 统计功能分析配置或 中断分析配置,则可能会在崩溃之前突出显示应用程序执行中的异常。 请参阅 跟踪分析器用户指南

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    屏幕截图,我发布了错误的屏幕截图。 我刚刚编辑了原来的帖子,其中的预期屏幕显示了PC,SP,LR寄存器设置为崩溃转储中的值。 结果调试窗口仅显示PC地址的“No symbols are defined”(未定义符号)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,

    对上述问题的答复:
    1)自定义板。
    2) TI RTOS版本- tirtos_tivac_2_16_01_14
    3)编译器版本 TI v 16.9 .1.LTS [TI 16.9 v.0.LTS](来自“项目属性”中的“常规-主菜单”)。
    4)版本:7.0 .0.0.0043万
    5)我们有两个版本的定制板。 两者表现出相同的行为。
    6)将在今天晚些时候发布。
    7)现在,使用板载晶体。 请参阅时钟配置下面的屏幕截图。
    8)今晚将尝试SWO跟踪。

    时钟配置:

    为什么当用于设置QSSI频率的值为100MHz时计算的CPU频率为120MHz???

    在main.c中,有以下序列可设置qssi计时:

      SysctlClockFreqSet(sysctl_OSC INT,sysctl_SYSDIV_1 | sysctl_use_PLL );
      Clock = SysClockGatet();
      BAUD_RATE =时钟>> 4U;
      system_printf (“bau_rate:  %x\n”,bau_rate);

    参数 'BAUD_RATE' 报告625万,即100MHz/16。  这与上面报告的120MHz CPU频率冲突,不是吗?

    再次感谢。

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

    [QUETE USER="Erik skullerude]I刚刚编辑了原始帖子,其目标屏幕显示了PC,SP,LR寄存器设置为崩溃转储中的值。 结果调试窗口仅显示PC地址的"未定义符号"。[/QUOT]确定,更新屏幕截图显示报告的PC值在SRAM中。 我认为这意味着异常转储中报告的PC值无效;由于值0000的"MOV r0,r0"指令数,显示的反汇编看起来不像有效代码。

    [可以将代码复制到SRAM中以执行,但如果发生这种情况,CCS调试器应该能够获取符号地址,代码看起来应该合理]

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

    我发布了对上述问题的答案,但在发布时出错了。 我删除了这一回复,并做了第二次回复。 提交时收到一条消息,回复必须在发布前审核。 所以我不知道回复的状态是什么。 我可以重新发布-请提供建议。

    同时,下面是代码。

    谢谢你。

    //以下代码来自main.c

    内部主(无效)

    void Board_initQSSI(UINT32_t, UINT32_t,布尔);

    易失性UINT32_t时钟;

    UINT32_t波特率;//= QSSI_BAUDRATE;

    SDRAM_MAIN ();

    InitGPIO ();

    //InitSpi();

    InitUART();

    SysctlClockFreqSet(sysctl_OSC INT,sysctl_SYSDIV_1 | sysctl_use_PLL );

    Clock = SysClockGatet();

    BAUD_RATE =时钟>> 4U;

    system_printf (“bau_rate:%x\n”,bau_rate);

    Board_initQSSI (chock, baud RATE, 0);//设置qssi接口

    GPIOPinWrite (RED_LED_OFF);

    GPIOPinWrite (green_LED_off);

    等待(100);

    InitHeartbeatTask();

    InitQssiTestTask();

    BIOS_START();

    返回0;

    }

    void InitHeartbeatTask()

    task_handle taskHandle;

    task_Params taskParams;

    错误块EB;

    ERROR_INIT(&E);

    task_params_init(&taskParams);

    taskParams.STACKSIZE = 512;

    taskParams.priority =10;

    taskHandle = Task_create((Task_FuncPTR) HeartbeatTask,&taskParams,&EB);

    IF (taskHandle ==空)

    }

    }

    void HeartbeatTask (UArg arg0,UArg arg1)

    对于(;;)

    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_1,GPIO PIN_1);

    TASK_SLEEP (100);

    GPIOPinWrite (GPIO _PORTF_BASE,GPIO PIN_1,0);

    TASK_SLEEP (500);

    }

    }

    void InitQssiTestTask()

    task_handle taskHandle;

    task_Params taskParams;

    错误块EB;

    ERROR_INIT(&E);

    task_params_init(&taskParams);

    taskParams.STACKSIZE = 1024;

    taskParams.priority =1;

    taskHandle = Task_create((Task_FuncPTR) Qssitest,&taskParams,&EB);

    IF (taskHandle ==空)

    }

    }

    void InitUART (void)

    SysCtlPeripheralEnable(sysctl_Periph_GPIOA);

    SysCtlPeripheralEnable(sysctl_Periph_UART0);

    GPIOPinConfigure(GPIO_PA0_U0RX);

    GPIOPinConfigure(GPIO_PA1_U0TX);

    GPIOPinTypeUART (GPIO _Porta_base,GPIO PIN_0 | GPIO PIN_1);

    UARTClockSourceSet(UART_BASE,UART_CLARK_PIOSC);

    UARTStdioConfig (11.52万,1600万);

    }

    void InitGPIO ()

    SysCtlPeripheralEnable(sysctl_Periph_GPIOT);//HSYNC = PT0

    SysCtlPeripheralEnable(sysctl_Periph_GPIOF);

    GPIOPinTypeGPIOOutput (GPIO _PORTF_BASE,GPIO _RED_LED);

    GPIOPinTypeGPIOOutput (GPIO _PORTF_BASE,GPIO绿色_LED);

    //^LED

    GPIO初始化();

    }

    void InitHeartbeatTask()

    task_handle taskHandle;

    task_Params taskParams;

    错误块EB;

    ERROR_INIT(&E);

    task_params_init(&taskParams);

    taskParams.STACKSIZE = 512;

    taskParams.priority =10;

    taskHandle = Task_create((Task_FuncPTR) HeartbeatTask,&taskParams,&EB);

    IF (taskHandle ==空)

    }

    }

    //以下代码来自qssi_test.c

    return_code SendCommand (const Command_t命令,const size_t expectedResponseLength)

    静态UINT8响应缓冲器[3];

    int i=0;

    UARTCharPut(UART_base, command);

    Memset (respondseBuffer,0,3);

    对于(i=0;i<预期响应长度;i++)

    responseBuffer[i]=(unsigned char)UART字符集(UART_base);

    }

    IF (responseBuffer[0]!= command_ACK)

    返回COMM_ERROR;

    }

    对于(i=0;i<3.2768万;i++){}

    返回成功;

    }

    void Qssitest (UArg arg0,UArg arg1)

    uINT32_t rcv_data;

    return_code RetVal;

    RetVal = SendCommandToDataSource(set_mode_test_pattern, 2);数据源的//UART命令

    IF (RetVal!= CMD_SUCCESS)

    //句柄错误

    }

    RetVal = SendCommandToDataSource(start_data,2);

    IF (RetVal!= CMD_SUCCESS)

    //句柄错误

    }

    system_printf ("返回:%x\n",RetVal);

    Wait();

    SSIAdvModeSet (SSI1_BASE,SSI_ADV_MODE_QUAD_READ);

    同时(1)

    SSIDataPut(SSI1_base, 0U);//dummy write to master以生成时钟

    SSIDataGet (SSI1_BASE,&rcv_data);

    Wait();

    SSIDataPut(SSI1_base, 0U);//dummy write to master以生成时钟

    SSIDataGet (SSI1_BASE,&rcv_data);

    }

    //以下代码来自board_init.c

    void Board_initQSSI(UINT32_t SYSCLK_Freq, UINT32_t BAUD_RATE,布尔从属)

    //启用QSSI外设

    如果(slaver==0){//使用QSSI1上的端口B,D,E

    MAP_SysCtlPeripheralEnable(sysctl_Periph_SSI1);

    MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOB);

    MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOD);

    MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOE);

    }

    否则{//使用QSSI3上的端口P,Q

    MAP_SysCtlPeripheralEnable(sysctl_Periph_SSI3);

    MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOP);

    MAP_SysCtlPeripheralEnable(sysctl_Periph_GPIOQ);

    }

    //通过多路复用设置的固定功能。 此宏被映射到ROM_MAP.h中的GPIOPinConfigure

    // GPIOPinConfigure在gPIO.c中定义

    如果(slaver==0){//使用QSSI1上的端口B,D,E

    MAP_GPIOPinConfigure(GPIO_PB5_SSI1CLK);

    MAP_GPIOPinConfigure(GPIO_PB4_SSI1FSS);

    MAP_GPIOPinConfigure(GPIO_PE4_SSI1XDAT0);

    MAP_GPIOPinConfigure(GPIO_PE5_SSI1XDAT1);

    MAP_GPIOPinConfigure(GPIO_PD4_SSI1XDAT2);

    MAP_GPIOPinConfigure(GPIO_PD5_SSI1XDAT3);

    }

    否则{//使用QSSI3上的端口P,Q

    MAP_GPIOPinConfigure(GPIO_PQ0_SSI3CLK);

    MAP_GPIOPinConfigure(GPIO_PQ1_SSI3FSS);

    MAP_GPIOPinConfigure(GPIO_PQ2_SSI3XDAT0);

    MAP_GPIOPinConfigure(GPIO_PQ3_SSI3XDAT1);

    MAP_GPIOPinConfigure(GPIO_PP0_SSI3XDAT2);

    MAP_GPIOPinConfigure(GPIO_Pp1_SSI3XDAT3);

    }

    //锁定操作设置。 此宏被映射到ROM_map.h中的GPIOPinTypeSSI

    // GPIOPinTypeSSI在gPIO.c中定义

    如果(slaver==0){//使用QSSI1上的端口B,D,E

    //MAP_GPIOPinTypeSSI (GPIO_PORTB_AHB_BASE,GPIO PIN_5 | GPIO PIN_4);//按双SSI示例更改

    MAP_GPIOPinTypeSSI (GPIO _PORTB_AHB_BASE,GPIO PIN_4 | GPIO PIN_5);

    MAP_GPIOPinTypeSSI (GPIO _PORTD_AHB_BASE,GPIO PIN_4 | GPIO PIN_5);

    MAP_GPIOPinTypeSSI (GPIO _PORT_AHB_BASE,GPIO PIN_4 | GPIO PIN_5);

    }

    否则{//使用QSSI3上的端口P,Q

    MAP_GPIOPinTypeSSI (GPIO _PORTP_BASE,GPIO PIN_0 | GPIO PIN_1);

    MAP_GPIOPinTypeSSI (GPIO _PORTQ_BASE,GPIO PIN_0 | GPIO PIN_1 | GPIO PIN_2 | GPIO PIN_3);

    }

    //为QSSI (高级)模式设置SPI模式0;设置主模式

    如果(slaver==0){

    MAP_SSIConfigSetExpClk (SSI1_BASE,SYSCLK_Freq,SSI_FRF_MOTO_MOTO_MODE_0,SSI_MODE_MASTER,BAUD_RATE, 8);

    //SSIAdvModeSet (SSI1_BASE,SSI_ADV_MODE_QUAD_WRITE);

    SSIAdvModeSet (SSI1_BASE,SSI_ADV_MODE_QUAD_READ);

    }

    否则{

    SSIConfigSetExpClk (SSI3_BASE,SYSCLK_Freq,SSI_FRF_MOTO_MOTO_MODE_0,SSI_MODE_SLAVE,BAUD_RATE, 8);

    SSIAdvModeSet (SSI3_BASE,SSI_ADV_MODE_QUAD_READ);

    SSIDataPut(SSI3_base, 0x4000);//dummy write使时钟运行到配置从属设备

    }

    //启用QSSI

    如果(slaver==0){

    MAP_SSIEnable(SSI1_base);

    }

    否则{

    MAP_SSIEnable(SSI3_base);

    }

    }

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

    [QUEY USER="Erik skullerude"]我删除了该回复,并进行了第二次回复。 提交时收到一条消息,回复必须在发布前审核。 所以我不知道回复的状态是什么。 我可以重新发布-请提供建议。[/QUOT]已审核的回复尚不可见,因此最好重新发布。

    [我收到了一封包含第一次回复的电子邮件,但缺少有关时钟设置的信息]

    [quote user="Erik skullerude">SysClockFreqSet(sysctl_OSC INT,sysctl_SYSDIV_1 | sysctl_use_PLL );

    Clock = SysClockGatet();

    BAUD_RATE = clock >> 4U;在该代码片段中,第二个参数SysClockFreqSet()看起来不正确。 第二个参数应该是所需的时钟频率(以Hz为单位),但已 使用表达式sysctl_SYSDIV_1 | sysctl_use_PLL。  sysctl_SYSDIV_1和sysctl_use_PLL位掩码选项,应在 SysClockClockFreqSet()的第一个参数中使用。

    表达式 sysctl_SYSDIV_1 | sysctl_use_PLL计算为1.2582912亿 Hz,即4 % 比允许的最大TM4C129时钟频率120 MHz高。

    使用TI-RTOS时,在启动期间根据XGCONF编辑器的“SYS/BIOS -计时选项”屏幕上的设置设置设置时钟配置。 我建议确保 根据所需的时钟配置设置“SYS/BIOS -时钟选项”,并 从main中删除SysClockFreqSet(),以便时钟只设置一次。 这可能意味着 main函数中的baud Rate计算需要更改。

    我将尝试在TM4C129启动板上运行发布的代码,以查看是否可以重新创建故障,并在 main中删除可疑的SysClockFreqSet()调用,然后解决问题。  

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

    按照您列出的顺序重新回复您之前的问题:

    1)自定义板。

    2) TI RTOS版本- tirtos_tivac_2_16_01_14

    3)编译器版本 TI v 16.9 .1.LTS [TI 16.9 v.0.LTS](来自CCS常规-项目属性中的主菜单)

    4)版本:7.0 .0.0.0043万

    5)我们有两个版本的定制板。 两者表现出相同的行为。

    6)将在今天晚些时候发布(现在已绑定...)

    7)现在,使用板载晶体。 请参阅时钟配置下面的屏幕截图。

    8)今晚将尝试SWO跟踪。

    时钟配置:

    为什么CPU时钟显示 为120MHz而实际上显示为100MHz?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我未在上述列表中包含标题文件:
    我必须制作新的头文件,因为我使用的文件非常广泛,大多数内容都不适用。 我会在早上回来的时候做这项工作。
    添加到.h文件的下列行可能会使您继续:

    空等待(int);
    void HeartbeatTask (UArg arg0,UArg arg1);
    void InitQssiTestTask();

    #define gPIO_GREG_LED (GPIO_PIN_2)
    #define gPIO_RED_LED (GPIO PIN_1)

    #define green_LED_ON gPIO_PORTF_BASE,gPIO_GREG_LED,gPIO_GREG_LED
    #define green_LED_off gPIO_PORTF_BASE,gPIO_GREG_LED,0

    #define red_LED_ON GPIO_PORTF_BASE,GPIO红色LED,GPIO红色LED
    #define red_LED_off gPIO_PORTF_BASE,gPIO_RED_LED,0

    #define SDRAM_START_ADDRESS 0x0万
    #define SDRAM_END_ADDRESS 0x01FF

    // SDRAM中要使用的字节数
    #define NUM_RAM_Bytes 1.6384万


    #define UART_BASE UART0_BASE
    #define command_ACK 0x55
    #define command_nack 0xAA
    #define COMM_ERROR =-9
    #define success = 0
    #define CMD_SUCCESS = 0
    #define set_mode_test_pattern = 7
    #define start_data = 5

    typedef枚举

    开始= 5,
    set_mode_test_pattern = 7,
    停止= 8,
    tne_LEDs_on = 0xA,
    turn _LEDs_off = 0xB,
    }命令_t;


    注:UART命令需要得到响应。 也许您可以为此建立环回?

    这也是我睡前时间的问题--我可能没有一个完整或有意义的清单,但我认为它已经结束了。

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

    "Can't use 'in on a non-object' mean?(Google搜索在此消息上未显示任何内容)

    我开始尝试重复您的问题,方法是从TIVA C TIVA 2.16 .01.14 的TI-RTOS中导入EK-TM4C1294XL的TI驱动程序示例空项目,然后添加您的代码。 程序在设置为运行时出现异常。

    ROV Hwi异常视图报告了相同  的“不能对非对象使用'in”错误:

    CIO控制台中有一些损坏的字符,而不是异常转储:

    ROV Hwi模块视图显示大小为768字节的Hwi堆栈溢出:

    因此,我认为Hwi堆栈溢出会导致异常转储报告ROV视图错误/具有可疑PC值。

    在我的.cfg文件中,我通过更改以下内容增加了Hwi堆栈大小:

    program.stack = 768; 

    至:

    program.stack = 4096; 

    随着Hwi堆栈大小增加到4096字节,Hwi异常视图随后显示了一个合理的调用堆栈:

    并且Hwi模块视图不再显示Hwi堆栈溢出:

    在我的案例中,由于我将您的代码合并到空示例中的方式,在GPIO初始化过程中,在main中发生了异常。

    但是,它显示Hwi堆栈溢出可能导致不报告异常。例如,建议您将Program.stack的值设置为至少4096字节,以尝试获取正确的异常视图。

    此外,值得在执行几秒钟后停止程序,并查看“ROV Hwi模块视图”,检查是否报告了堆栈溢出,因为堆栈溢出可能导致更模糊的故障。

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

    您好,

    在文本编辑模式下查看.cfg文件,以下是现在的内容:

    VAR Boot = xdc.useModule('ti.catalog.arm.cortexm4.tiva.ce.Boot');

    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');

    VAR配置= xdc.useModule('ti.drivers.Config');

    VAR登录设置= xdc.useModule('ti.uia.sysbios.LoggingSetup');

    VAR信号= xdc.useModule('ti.sysbios.knl.Semaphore');

    boot.oscSrc = Boot.OSCSRC_INT;

    config.libType = Config.LibType_Instrumented;

    BIOS.libType = BIOS.LibType_Instrumented;

    bios.assertsEnabled =真;

    bios.logsEnabled =真;

    boot.configureClock =假;

    VAR系统= xdc.useModule('xdc.runtime.System');

    VAR SysStd = xdc.useModule('xdc.runtime.SysStd');

    System.SupportProxy = SysStd;

    在CCS GUI中,RTOS运行时视图显示堆栈大小的以下信息:

    在.cfg GUI页面中的其他视图周围进行寻呼时,未看到HWI堆栈大小的特定设置。 我是否应该将  'Program.stack = 4096' 行添加到.cfg文件(通过文本编辑器)?

    再次感谢。

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

    [quote user="Erik skullerude">在.cfg GUI页面中的其他视图中,看不到HWI堆栈大小的特定设置。 我是否应该将  'Program.stack = 4096' 行添加到.cfg文件(通过文本编辑器)?我发现以下所有行都跟踪相同的值:

    TI-RTOS ->产品> SysBIOS -> BIOS -基本运行时选项GUI页面上显示“System (Hwi and Swi) stack size”(系统(Hwi和Swi)堆栈大小)

    TI-RTOS -> Products -> SysBIOS -> System -> Program - Runtime Sizes GUI页面上显示的"Stack Size"(堆栈大小)

    - .cfg文件脚本文本中Program.stack的值。

    它看起来默认值为4096,因为如果我从 .cfg脚本文本中删除Program.stack行,GUI页面上显示的栈值将更改为4096。

    因此,认为您已经将HWI堆栈大小设置为4096。 建议您通过运行程序几秒钟来检查,然后暂停并查看ROV Hwi -> Module View (ROV Hwi ->模块视图)。 检查hwiStackPeak与hwiStackSize的重要内容是查看系统仍正常运行时有多少可用空间。

    此外,我尝试根据您的代码片段运行一个程序,但没有发现任何故障。 但是 ,wait()和 SendCommandToDataSource()函数的代码没有显示,所以我将它们删除了。 为避免混淆,您是否能够压缩并发布显示故障的完整项目?

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

    [quote user="Erik skullerude">SysClockFreqSet(sysctl_OSC INT,sysctl_SYSDIV_1 | sysctl_use_PLL );

    Clock = SysClockGatet();

    BAUD_RATE =时钟>> 4U;

    system_printf (“bau_rate:%x\n”,bau_rate);

    Board_initQSSi(Cock, bot_rate_0);//设置qssi接口我对时钟设置有了另一个了解。 我从TI-RTOS的“引导-时钟选项”中看到“自动配置时钟”选项已被取消选择,这意味着SYS/BIOS不配置时钟,即只有 main中的SysClockFreqSet()调用设置时钟。

    除了前面有关 SysClockFreqSet()的第二个参数(选项标志 sysctl_SYSDIV_1 | sysctl_use_PLL而不是实际频率 )的注释之外,该代码还调用了SysClockSet()以获取已设置的实际时钟频率。

     SysClockSet()函数仅用于TM4C123设备,对于TM4C129设备,使用的实际时钟频率为SysClockFreqSet()函数返回的时钟频率。

    我修改了main()函数,用以下代码报告与时钟频率相关的值(我还更改了波特率,将其报告为十进制而不是十六进制,以便于理解):

    uINT32_t实际时钟;
    uINT32_t已用时钟;
    UINT32_t波特率;//= QSSI_BAUDRATE;
    
    actual_clock = SysctlClockFreqSet(sysctl_OSC INT,sysctl_SYSDIV_1 | sysctl_use_PLL );
    USed_clock = SysCTlClockGatet();
    波特率=已用时钟>> 4U;
    system_printf ("actual_clock :%u\n",actual_clock);
    system_printf ("used时钟:%u\n",used时钟);
    system_printf ("bau_rate:%u\n",bau_rate); 

    其结果是:

    [报价]实际时钟:1.06666666亿
    USed_clock:1000万
    BAUD_RATE : 62.5万这表示 SysClockClockFreqSet()函数已将实际时钟频率设置为1.06666666亿 Hz,但对 SysClockClockSet()的错误调用返回的时钟频率为1000万 Hz。 这意味着设备的实际时钟频率是用于计算QSSI波特率的时钟频率的10.666 倍。

    应用程序所需的实际时钟频率和QSSI波特率是多少?

    设置时钟频率的这些差异并不一定解释崩溃,但这可能意味着QSSI波特率高于您的预期。

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

    哇,我真的在左边的区域设置时钟。 最终,我们希望QSSI以30Mbits/秒的速度运行 QSSI时钟(来自主中继器)必须至少是比特率的2倍- 60MHz。 要获得该时钟频率,需要处理器以全120MHz运行。 对于初始测试,我不太关心比特率;只是想让它发挥作用。 您在过去几天提供了大量信息。 我将在接下来的24小时内对此进行整理,并让您了解情况。 如果仍无法正常工作,我可以在此时上传项目。

    我有一个问题,我花了一点时间在TM4C129 UG和TR RTOS UG中搜索有关设置任务优先级的信息。 我认为我没有找到正确的文档,但该文档清楚地详细说明了哪些优先级设置是较高优先级还是较低优先级。 在TM4C129 UG中,我在Register 61部分中找到: 系统处理程序优先级1,它指出0是最高优先级,7是最低优先级(在我搜索的这一阶段,我只是尝试跟踪有关优先级的信息,并不真正了解硬件级别和RTOS级别之间的差异)。

    然后,在TIRTOS SysBIOS 6.4 6 UG第52页上,它说明了线程优先级(我认为这是我们在这里处理的...),0是最低的,数字上较高的增加优先级。 我现在已经设置了它,心跳优先级为10,QSSI任务优先级为1。 这可能与它应该的样子有反向。 我想知道,如果qssi ssidataGet命令被优先级更高的心跳任务抢占,它是否会导致崩溃?

    谢谢你。

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

    [引用user="Erik skullerude"]我只是试图跟踪有关优先级的信息,但并不真正了解硬件级别和RTOS级别之间的差异关于系统处理程序优先级的TM4C129部分是关于由硬件管理的中断(例外)的优先级。

    由SYS/BIOS (TI-RTOS)软件调度程序管理的任务优先级。

    因此,这两种类型的优先级具有不同的含义;SYS/BIOS (TI-RTOS) 调度程序在中断优先级特定于设备系列的不同设备系列上运行。

    I不知道如果qssi ssidataGet命令被优先级更高的心跳任务抢占,它是否会导致崩溃?

    查看 SSIDataGET()函数的来源,它只等待并从SSI fifo读取条目。 因此,它应该能够被心跳任务抢占而不会导致崩溃。

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

    由于间歇性崩溃,您不确定是否有应用程序错误覆盖了一些内存,因此在 TI-RTOS中发现了一个错误, 或者有硬件问题。[/QUOT]如果它帮助我创建了一个简单的"自检"程序,让它继续运行以尝试确定硬件是否是间歇性的。

    程序将时钟频率设置为最大值120 MHz,然后通过以下方法在闪存和SRAM上重复执行测试:

    A)将测试模式写入SRAM的90 % ,每次迭代都会更改。

    b)使用链接器插入的CRC检验闪存的内容,其中CRC硬件模块用于计算实际CRC,并将其与链接器创建的预期CRC进行比较。

    c)检查闪存90 % 中的测试图案。

    d)检查写入SRAM的测试模式。

    所需的唯一外部硬件资源是一个GPIO,切换为1Hz以指示程序仍在运行;内部16 MHz PIOSC用于时钟源,以避免需要外部晶体。 由于另一种检查程序的方法仍在运行,因此每分钟都会向CCS CIO控制台报告到目前为止的测试迭代总数。 该程序是使用TivaWare的裸机示例,因此没有任务或中断。

    测试失败将通过以下任一方式报告:

    -如果程序遇到硬故障,LED将停止闪烁。

    -如果在SRAM或闪存中检测到测试模式中的错误后程序中止,则CCS CIO控制台中会显示一条错误消息,假设该错误允许程序运行足够长的时间来报告错误,而不是出现硬故障。

    我已经在启动板上运行了程序,在运行长达80分钟时没有发现错误。 CIO控制台中的最终输出示例:

    77分钟后执行3.5086万次测试迭代
    78分钟后执行3.5544万测试迭代
    79分钟后执行3.6001万测试迭代
    80分钟后执行3.6457万测试迭代 

    该程序应能在任何具有256 KB SRAM和1 MB闪存的TM4C129系列设备上运行。     TM4C129_self_test.c中的PROGRESS_LED_Peripheral,PROGRESS_LED_PORT和PROGRES_LED_PIN宏需要更改以选择切换哪个GPIO引脚以指示测试仍在运行。

    建议您让此测试程序在自定义硬件上运行。 如果测试程序失败,则表明您遇到了硬件问题。 如果测试程序没有失败,则表明您遇到了软件问题。

    CCS项目见附件 e2e.ti.com/.../TM4C129_5F00_selftest.zip

    该项目包含调试和发布配置。 建议使用“发行”配置,因为它以更快的速度执行测试。 该项目设置为使用安装在 C:2.1 的4.178。 如果您已将TivaWare安装在其他位置,请编辑 TIVAWARE_ROOT路径变量: