这只是一个测试代码,实际中不可用。实际的设计中,信息更多,结构也更复杂,同时也会用到链表等更高级的数据结构。
这里只是做一个测试。
测试代码:
#include "stdio.h"
#define TASK_NUM 10
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
typedef enum state_tag
{
ready = 1,
sleep = 2,
suspend = 3
} task_state_t;
typedef struct task_tcb_tag
{
uint16_t priority;
task_state_t state;
uint16_t task_id;
} tcb_t;
tcb_t task_dmeos[TASK_NUM];
uint8_t task_ready_tbl[TASK_NUM];
tcb_t *get_task2run(void)
{
int i = 0;
int j = 0;
int active_task_num = 0;
int task_rdy_index[TASK_NUM];
int task_priority[TASK_NUM];
uint16_t pri_max;
for (i = 0; i < TASK_NUM; i++)
{
if (task_dmeos[i].state == ready)
{
task_rdy_index[j] = i;
task_priority[j] = task_dmeos[i].priority;
j++;
active_task_num++;
printf("%d\n", task_dmeos[i].priority);
}
}
pri_max = task_priority[0];
j = 0;
for (i = 1; i < active_task_num; i++)
{
if (task_priority[i] > pri_max)
{
pri_max = task_priority[i];
j = i;
}
}
return &task_dmeos[task_rdy_index[j]];
}
int main(void)
{
tcb_t *p_tcb;
task_dmeos[0].task_id = 0;
task_dmeos[1].task_id = 1;
task_dmeos[2].task_id = 2;
task_dmeos[3].task_id = 3;
task_dmeos[4].task_id = 4;
task_dmeos[5].task_id = 5;
task_dmeos[6].task_id = 6;
task_dmeos[7].task_id = 7;
task_dmeos[8].task_id = 8;
task_dmeos[9].task_id = 9;
task_dmeos[0].priority = 0;
task_dmeos[1].priority = 1;
task_dmeos[2].priority = 2;
task_dmeos[3].priority = 13;
task_dmeos[4].priority = 4;
task_dmeos[5].priority = 5;
task_dmeos[6].priority = 6;
task_dmeos[7].priority = 7;
task_dmeos[8].priority = 8;
task_dmeos[9].priority = 9;
task_dmeos[0].state = sleep;
task_dmeos[1].state = suspend;
task_dmeos[3].state = ready;
task_dmeos[4].state = ready;
task_dmeos[5].state = ready;
task_dmeos[6].state = suspend;
task_dmeos[7].state = sleep;
task_dmeos[8].state = sleep;
task_dmeos[9].state = sleep;
p_tcb = get_task2run();
printf("priority is : %d\n", p_tcb->priority);
printf("task id is : %d\n", p_tcb->task_id);
return 0;
}
几次修改并测试,感觉效果还可以。

测试修改的代码就不再整理说明了。
















