task_timeslice()

本文介绍了一个根据进程静态优先级计算时间片的算法实现。通过不同的公式处理不同优先级的进程,确保了系统的调度公平性和响应性。
根据进程p的静态优先级static_prio计算该进程的时间片
(根据下面公式计算时间片)
static  inline unsigned  int  task_timeslice(task_t  * p)
{
    
if (p->static_prio < NICE_TO_PRIO(0))
        
return SCALE_PRIO(DEF_TIMESLICE*4, p->static_prio);
    
else
        
return SCALE_PRIO(DEF_TIMESLICE, p->static_prio);
}




注:(1)
                          +--> (140 - static priority) * 20 
                          |          (static priority < 120)
(task_struct.time_slice)  |        
  base time quantum =     |                                  
(in milliseconds)         |
                          |          (static priority >= 120)
                          +--> (140 - static priority) * 5 

(2)
NICE_TO_PRIO(0) = 120

(3)
#define SCALE_PRIO(x, prio) /
    max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO/2), MIN_TIMESLICE)
--------------------------------------------------------
    max(x * (140 - prio) / (40/2), 5) =
    max(x * (140 - prio) / 20), 5)










#include “timeslice.h” #include “uart_test.h” #include <string.h> /* 时间片周期配置数组 (ms) */ static const uint32_t timeslice_periods[TIMESLICE_COUNT] = { 1, // 10, // 50, // 100, // 500, // 1000 // }; /* 全局变量定义 */ uint32_t g_system_tick = 0; // 系统总tick计数 bool g_timeslice_flags[TIMESLICE_COUNT] = {false}; // 时间片标志数组 uint32_t g_timeslice_counters[TIMESLICE_COUNT] = {0}; // 时间片计数器数组 /** @brief 时间片系统初始化 */ void TimeSlice_Init(void) { uint8_t i; // 初始化系统tick g_system_tick = 0; // 初始化时间片标志和计数器 for (i = 0; i < TIMESLICE_COUNT; i++) { g_timeslice_flags[i] = false; g_timeslice_counters[i] = 0; } } /** @brief 时间片tick更新 @note 在TIM1中断中调用,每1ms调用一次 */ void TimeSlice_TickUpdate(void) { uint8_t i; // 系统tick自增 g_system_tick++; // 遍历所有时间片,检查是否到达周期时间 for (i = 0; i < TIMESLICE_COUNT; i++) { g_timeslice_counters[i]++; // 检查是否到达设定的周期 if (g_timeslice_counters[i] >= timeslice_periods[i]) { g_timeslice_flags[i] = true; // 设置时间片标志 g_timeslice_counters[i] = 0; // 重置计数器 } } } /** @brief 检查时间片标志是否置位 @param id 时间片ID @return true 标志已置位,false 标志未置位 */ bool TimeSlice_IsSet(TimeSlice_ID_t id) { if (id >= TIMESLICE_COUNT) return false; return g_timeslice_flags[id]; } /** @brief 清除时间片标志 @param id 时间片ID */ void TimeSlice_ClearFlag(TimeSlice_ID_t id) { if (id >= TIMESLICE_COUNT) return; g_timeslice_flags[id] = false; } /** @brief 获取系统运行时间 @return 系统运行时间(ms) */ uint32_t TimeSlice_GetSystemTick(void) { return g_system_tick; } /** @brief 主循环任务调度 @note 在主循环中调用此函数进行任务调度 */ void TimeSlice_TaskScheduler(void) { for(int i = 0;i<TIMESLICE_COUNT;i++) { if(TimeSlice_IsSet(i)) { TimeSlice_ClearFlag(i); switch(i) { case TIMESLICE_1MS: // 1ms高频任务 break; case TIMESLICE_10MS: // 10ms任务 - 串口处理 UART_Process(); break; case TIMESLICE_50MS: // 50ms任务 break; case TIMESLICE_100MS: // 100ms任务 break; case TIMESLICE_500MS: // 500ms任务 break; case TIMESLICE_1000MS: // 1000ms任务 - 串口测试数据发送 // UART_SendTestData(); break; } } }使用这个时间片当收到0x00,60秒后发送0x01
07-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值