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/TMS320C6748:SYS/BIOS 中的线程调度

Guru**** 2587365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/592539/rtos-tms320c6748-thread-schedule-in-sys-bios

器件型号:TMS320C6748

工具/软件:TI-RTOS

  CCS 版本:7.1.0.00016

  SYS/BIOS 版本: BIOS_6_50_01_12

  我有一个 Hwi 和两个任务、任务1和任务2。

  任务1的优先级高于任务2。 现在、我想实现以下功能:

  在 Hwi 后运行任务1、然后在任务1完成后运行任务2、然后转至空闲循环、在任务2完成后再次等待 Hwi。

  两个 Hwi 之间的时间为64ms、 如果是35ms、则为 Task1、而任务2大约为10ms。

  

  我可以做些什么来实现该功能?

  

  我尝试在 Hwi 中布置一个事件来运行任务1、并在任务1末尾布置一个信号量来运行任务2。 但它没有达到我的预期效果。

  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需使用两个不同的信标。 这是伪代码

    Hwi
    工作
    Semaphore_post (driverSem);


    任务1.
    while (1){
    Semaphore_pend (driverSem、BIOS_wait_forever);
    工作
    Semaphore_post (fooSem);


    任务1.
    while (1){
    Semaphore_pend (fooSem、BIOS_wait_forever);
    工作
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

     

      感谢您的回答。

      我使用两个不同的信标来执行此操作 、同时使用 Execution Graph 来具有一个监视器。

     一开始、一切看起来都还可以、就像这样

     

     

    绿色线程是 Task1、蓝色线程是 task2、 红色线程为空闲。

    但是、大约30分钟后、Execution Graph 变成了这样的:

    它显示只有 Task1和 Idle 线程。 我感到非常奇怪、不知道任务2线程在哪里。

    我使用两个 LED 分别显示任务2和空闲状态的运行、 LED1 为空闲状态、 LED2为任务2 、但是只有 LED1仍在运行、LED2停止。

     

     

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

    大家好、 ToddMullanix

    这次我得到了误差点、  

    BIOS Schduler 似乎是错误的。

    附录是从 Live Session 导出的数据。

    e2e.ti.com/.../5861.aa.xlsx

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 ROV 中查看任务2的调用栈。 它位于 ROV->Tasks->Callstack 中(或类似的东西...我现在无法访问 CCS)。 它在干什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    出现错误时、ROV 显示如下:

    但是、信号量表明信号量2的数量为1。 如何阻止任务2、sem2为1?

     

    我想附上.cfg 文件、因为我真的不知道如何解决 now.e2e.ti.com/.../2625.app.cfg 问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    任务2看起来在第二个信标上挂起、或者有一些损坏正在发生。 您能否验证堆栈是否未熔断(ROV->Tasks->Detailed)? 我的目标是查看以下内容(感谢 xls!!!)。

    正常流量(按时间顺序)
    空闲
    Hwi (我正在假设)
    Semaphore_post (0xc006f438)、使任务1就绪
    Hwi 结束
    任务1运行
    (笑声)
    Semaphore_post (0xc006f450)、使任务2就绪
    (笑声)
    Semaphore_pend (0xc006f438、BIOS_WAIT_FOREVER)阻止的变量

    任务2运行
    (笑声)
    Semaphore_pend (0xc006f450、BIOS_wait_forever)、该块被阻断

    但是、我在 xls 文件中的第1175行看到了这一点。
    LM_PEND:SEM:0xbe665947、计数:0、超时:-1

    在上面看到、我看到任务2是使用0xbe665947而不是0xc006f450的 Semaphore_handle 的任务2。 这就是为什么信标上的计数为1 (任务1发布了该计数)。 0xbe665947看起来像一个假地址。 因此、我想堆栈溢出或缓冲区过写入或破坏任务2中使用的 Semaphore_handle 的东西。

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

    Todd、感谢您的持续帮助。

    现在、我想我理解为什么任务2 消失了。 它被错误的信标挂起、而不是信标2、

    因此、它将被错误信标永久阻止。 我是对的吗?

    那么、问题是什么导致了错误的信标...

    我不认为堆栈溢出的原因、请看这张图片:  

     

    您的意思是缓冲器过写入器?

    此外、我还在考虑另一种解决问题的方法。  

    如果我使用  Semaphore_pend (sem、64)而不是  Semaphore_pend (sem、BIOS_wait_forever)、该怎么办

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Regardinf 缓冲区溢出、以这个局部变量示例为例

    char foo[10];
    Semaphore_handle semHandle;

    如果您执行 memcpy 之类的操作来 foo、但使用11个字节、则会破坏 semHandle。 在 sem2句柄变量之前有什么?

    我99%确定您正在破坏 Semaphore_handle。 我不记得 C67是否支持 CCS 中的硬件观察点。 如果是、则在创建后在 sem2句柄上创建观察点。 如果对该地址进行了另一次写入、则中断。 如果发生损坏、您将看到它的发生位置。 如果不支持观察点、请在某些位置备份句柄。 然后、在使用 sem2之前、将其与备份进行比较。 它将证明腐败正在发生、并使您更接近。

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

    这是我的映射文件的屏幕截图:

     

    我使用观察点和硬件断点来监视 sem2的值是否已更改、但当出错时没有发生任何情况、因此我认为 C6748不支持硬件观察点。

     

    我同意你的观点、 即第2个问题 已经被破坏了。

    接下来、我将更仔细地检查任务2、以查看是否 使用了未校正的数组。 当我发现误差时、我将给出反馈。

    再次感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Todd、
    此函数导致错误:dSPF_sp_mat_mul。
    我使用 DSPF_sp_mat_mul 来乘以两个实数矩阵、A 是6*3、B 是3*20。 使用此函数时加载额外的行和头牛。