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/CC3220:如何使用 TI-RTOS 的 POSIX API 创建优先级感知信标

Guru**** 2540720 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/761146/rtos-cc3220-how-to-create-a-priority-aware-semaphore-using-the-posix-api-of-ti-rtos

器件型号:CC3220

工具/软件:TI-RTOS

我将使用适用于 TI-RTOS 的 POSIX 接口。 当我使用 SEM_INIT()创建信号量时,会创建一个简单的(FIFO)信号量。 但我需要一个优先级感知信标。 我如何才能做到这一点?

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

    "优先级感知"是什么意思? 您的意思是、如果一个较低优先级的任务拥有信标、而一个较高优先级的任务试图获得信标、那么较低优先级的任务被提升到与较高优先级任务相同的水平(以避免优先级反转)。

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

    您好 Todd、

    不、我指的是 TI-RTOS 内核用户指南 http://www.ti.com/lit/ug/spruex3u/spruex3u.pdf 的第4.1段。 其状态为:"可选、您可以创建"优先级"信标、在第一个优先级较低的任务之前将待处理任务插入等待列表。 因此、优先级相等的任务按照 FIFO 顺序挂起、但优先级较高的任务在优先级较低的任务之前被读取。"

    我知道如何使用 SYS/BIOS 配置文件(semParams.mode = semaphore_Mode_Counting_priority;)来执行此操作。 但是,如何使用 POSIX API 调用 SEM_init()来创建这样一个信号量呢?

    哈里

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

    感谢您的澄清。 我认为 POSIX 信标接口不支持该功能。 我确信 TI-RTOS POSIX Shim 层不支持它。

    请注意、如果您需要此功能、可以使用本机 TI-RTOS 调用。

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

    您好 Todd、

    感谢您的回答。 但是、实时操作系统的行为是否应该有所不同? 在信标上等待的任务现在以 FIFO 顺序释放。 在我看来,应该按优先次序予以释放。 我知道这种行为是本机 TI-RTOS 中的一种选项。 但是、当我使用 POSIX 匀场层时、我会期望得到实时感知信标。 SEM_POST 的 POSIX 文档(https://pubs.opengroup.org/onlinepubs/9699919799/functions/sem_post.html)指出、对于实时系统:"应解除阻止最高优先级的等待线程、如果阻止了多个最高优先级的线程等待信标、则应解除阻止等待最长优先级的最高优先级线程"。

     SYS/BIOS POSIX 线程(pthread)支持页面(http://processors.wiki.ti.com/index.php/SYS/BIOS_POSIX_Thread_(pthread)_Support)指出:" SYS/BIOS 只有一个基于优先级的调度策略"。 这也表明线程是按优先级顺序安排的。

    无论如何、我编写了我自己的 SEM_INIT 版本、称为 SEM_PRIORY_INIT、它将创建一个具有优先级感知行为的 POSIX 信标。

    //执行 SEM_INIT,它使用基于优先级的等待队列
    int SEM_Priority_init (SEM_t *信号量、int pseed、unsigned value)
    {
    typedef 结构{
    Semaphore_Structem;
    } SEM_OBJ;
    sem_obj * obj =(sem_obj*)(semaphore->SYSBIOS);
    
    /*对象大小验证*/
    assert_isTrue (sizeof (SEM_obj)<= sizeof (SEM_t)、NULL);
    
    如果(值> 65535){
    errno = EINVAL;
    返回-1;
    }
    
    /*信标模式为 Semaphore_Mode_Counting_Priority */
    Semaphore_Params SEM_pars;
    Semaphore_Params_init (&SEM_pars);
    SEM_pars.mode = Semaphore_Mode_Counting_priority;
    Semaphore_construction (&(obj->sem)、(int) value、&sem_pars);
    返回0;
    } 

    请不要在 .cfg 文件中设置选项 supportsPriority 才能使其正常工作:

    Semaphore.supportsPriority = true; 

    请告诉我您对此有何看法。

    哈里

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

    TI-RTOS 内核的解决方案看起来不错。 我将与开发团队讨论您与当前实施的问题。

    Todd