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/CC1310:使用 runCMD()时出现 CC1310异常错误

Guru**** 2539500 points
Other Parts Discussed in Thread: CC1310, SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/569865/rtos-cc1310-cc1310-exception-error-occurs-by-using-runcmd

器件型号:CC1310
Thread 中讨论的其他器件: SYSBIOS

工具/软件:TI-RTOS

我们使用 CC1310 + TI-RTOS SDK 的应用程序出现异常错误并停止
工作
持续执行期间。

TI-RTOS SDK 版本:v2.20.0.06
编译器:v15.12.1 LTS
CCS:v6.1.3.00034

通过一些研究,我们发现这个问题发生在的 Semaphore_post()上
rf_runCmd 命令。
为了更加精确、在 Semaphore_post()函数内
elem->tpElem.clock 的地址变为
对已排成队的"elem"变量不确定/非法、进而导致这些变量
目标位置
Clock_stop (elem->tpElem.clock)的地址不确定并导致异常。

SYSBIOS/KNL/Semaphore.c
----------------------
  /*从信标队列中删除 tsk */
   Elem=(Semaphore_PendElemm *) Queue_dequeue (pendQ);

  /*将信标标记为已发布*/
   elem->pendState = Semaphore_PendState_布置;

  /*禁用时钟对象*/
  if (BIOS_clockEnabled &&(elem->tpElem.clock!= NULL)){

  clock_stop (elem->tpElem.clock);}
--------------------

我们对 TI-RTOS 源代码有一些疑问...

查看 Semaphore.c 源代码 Semaphore_pend()函数
表现
"排队"我们发现、包含"tpelem.clock"的"elem"被声明为
局部变量"Semaphore_PendElem"、如下所示。

源代码行161..
--------------
bool semaphore_pend (Semaphore_Object * sem、uint32超时)

 UINT hwiKey、tskKey;
 Semaphore_PendElem;
 queue_handle pendQ;
 Clock_StructclockStruct;
--------------

它按如下所示排队(源代码行242/246)

----------------
Queue_insert ((Queue_elm *) tmpElem、(Queue_Elem *)(&E));

其他

/*将任务置于待决问题的末尾*/
Queue_enqueue (pendQ、(Queue_Elem *)&elem);

--------------

问题:

1.我们想知道是否排队被宣布的 elem 变量
局部变量
  函数内的函数是否正常? 这是中的一个错误
TI-RTOS?

2.我们想了解更多有关信标和队列的详细信息
功能、
  执行它的顺序以及存储器管理。
  请告诉我们是否有任何有关此内容的参考资料。

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

    您好、Skai、

    [引用 user="skai"]

    1.我们想知道是否排队被宣布的 elem 变量
    局部变量
      函数内的函数是否正常? 这是中的一个错误
    TI-RTOS?

    [/报价]

    是的、可以对局部 elem 变量进行排队。  如您所知、此变量是在任务栈上创建的(只要任务存在、就会保留此变量);由于任务在 Semaphore_pend() API 中停止、因此 elem 仍然存在。  当信标被布置(来自另一个任务、Hwi 或 Swi)时、任务恢复并完成 Semaphore_pend()函数。  在任务恢复执行并从上述 Semaphore_pend()调用返回之前,Semaphore_pen () API 中的局部变量不会停止存在。

    [引用 user="skai"]

    2.我们想了解更多有关信标和队列的详细信息
    功能、
      执行它的顺序以及存储器管理。
      请告诉我们是否有任何有关此内容的参考资料。

    [/报价]

    除了 create() API 之外,信标和队列不会分配堆中的内存。  create() API 需要静态分配的结构作为参数。 信标和队列 API 依靠堆栈和对象存储器运行。  如需更多信息、请参阅 SYS/BIOS 用户指南 和 API 文档

    关于您上面提到的问题、我认为您所面临的问题可能是以下情况之一造成的:

    1. 任务堆栈溢出。  在编写代码时、我们分配越来越多的局部变量、增加堆栈使用量、直到它超过指定的空间并覆盖另一个任务的堆栈空间、这是很常见的。  在这种情况下,系统中的另一个任务可能已经开始用 Semaphore_pend()覆盖任务的堆栈,从而破坏局部变量。  您能否打开 ROV 并检查堆栈大小?  为您看到的任何任务增加任务堆栈、哪些任务的使用可能接近限制。
    2. 在任务调度被禁用时调用 semaphore_pend()/post()。  值得一提的是、在禁用任务调度时不支持 Semaphore_pend()/post()。  禁用任务时调用 pend()将导致挂起立即返回,而不会阻止任务,也不会将当前任务置于就绪状态(这是由 post()完成的)。  这将使您的操作系统处于不一致的状态。  不用说,这将导致本地变量(如 elem)被丢弃,如果返回到调用 post()的代码,则内存可能已损坏,从而导致故障。

    希望这对您有所帮助、

    伊曼纽尔

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

    您好、Emmanuel、

    感谢你的答复。

    关于 elem 局部变量、
    根据您的评论、我们了解到"任务不会受到另一项任务的干扰
    任务"。
    但是、我们认为问题是该堆栈用于其他进程
    运行时的时间。
    此堆栈的值可由内部的另一个进程重新写入
    此任务。
    那么、是否会有一个例外、因为值(如 elem)
    访问时损坏
    还是使用原始流程?

    此致

    Skai

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

    即使我正在研究这个问题、我们也需要您的帮助来解决这个问题。

    根据您的建议、我们还尝试增加任务堆栈和
    在没有代码优化的情况下进行了尝试、应用程序始终会停止(异常)
    运行很长时间。

    异常总是在 Semaphore_post()的 elem->tpElem.clock 处发生。

    根据您的评论、我们了解到"任务不会受到另一项任务的干扰
    任务"、我们想知道是否存在可能或情况
    该堆栈(elem)的值可能在任务本身内部被重写或损坏?

    此致
    库米
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请告知我们您的意见、如果有其他需要搜索的内容、以找出此问题的根本原因。