器件型号:CC3220
工具/软件:TI-RTOS
我将使用适用于 TI-RTOS 的 POSIX 接口。 当我使用 SEM_INIT()创建信号量时,会创建一个简单的(FIFO)信号量。 但我需要一个优先级感知信标。 我如何才能做到这一点?
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.
器件型号:CC3220
工具/软件:TI-RTOS
我将使用适用于 TI-RTOS 的 POSIX 接口。 当我使用 SEM_INIT()创建信号量时,会创建一个简单的(FIFO)信号量。 但我需要一个优先级感知信标。 我如何才能做到这一点?
您好 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()来创建这样一个信号量呢?
哈里
您好 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;
请告诉我您对此有何看法。
哈里