中断有自己的一套优先级系统,
但是MQX硬是把中断的优先级与任务的优先级结合起来。
任务和中断其实是可以是同一个优先级的。
uint_32 _psp_init_readyqs
(
void
)
{ /* Body */
KERNEL_DATA_STRUCT_PTR kernel_data;
READY_Q_STRUCT_PTR q_ptr;
uint_32 priority_levels;
uint_32 n;
_GET_KERNEL_DATA(kernel_data);
kernel_data->READY_Q_LIST = (READY_Q_STRUCT_PTR) NULL;
priority_levels = kernel_data->LOWEST_TASK_PRIORITY + 2; //6+2=8
q_ptr = (READY_Q_STRUCT_PTR)_mem_alloc_zero(sizeof(READY_Q_STRUCT) * priority_levels);
#if MQX_CHECK_MEMORY_ALLOCATION_ERRORS
if ( q_ptr == NULL ) {
return (MQX_OUT_OF_MEMORY);
} /* Endif */
#endif
_mem_set_type(q_ptr, MEM_TYPE_READYQ);
n = priority_levels;
while (n--) {
q_ptr->HEAD_READY_Q = (TD_STRUCT_PTR)q_ptr;
q_ptr->TAIL_READY_Q = (TD_STRUCT_PTR)q_ptr;
q_ptr->PRIORITY = (uint_16)n;
//2
if (n + kernel_data->INIT.MQX_HARDWARE_INTERRUPT_LEVEL_MAX < ((1 << CORTEX_PRIOR_IMPL) - 1))
//如果优先级比最低ISR硬件优先级还高,则将任务的优先级设为相应的最高优先级.
q_ptr->ENABLE_SR = CORTEX_PRIOR(n + kernel_data->INIT.MQX_HARDWARE_INTERRUPT_LEVEL_MAX);
else
//否则都设为6
q_ptr->ENABLE_SR = CORTEX_PRIOR((1 << CORTEX_PRIOR_IMPL) - 2);
q_ptr->NEXT_Q = kernel_data->READY_Q_LIST;
kernel_data->READY_Q_LIST = q_ptr++;
}
/*
** Set the current ready q (where the ready queue searches start) to
** the head of the list of ready queues.
*/
kernel_data->CURRENT_READY_Q = kernel_data->READY_Q_LIST;
在这个函数中,将任务的优先级向后推迟了两个+2。
然后 ,比中断最低优先级低的,ENABLE_SR 优先级统一设置为最低值
比中断优先级高的ENABLE_SR 设置为相应高的优先级额,但还是需要向后退两个。