第7砍 - 第一滴血

上班Day2

目前都还蛮好玩的

学到很多东西 发现以之前所学还是太浅了

继续努力:)

void  OSTimeTick (void)
{
#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
    OS_CPU_SR  cpu_sr;
#endif    
    OS_TCB    *ptcb;


    OSTimeTickHook();                                      /* Call user definable hook                 */
#if OS_TIME_GET_SET_EN > 0   
    OS_ENTER_CRITICAL();                                   /* Update the 32-bit tick counter           */
    OSTime++;
    OS_EXIT_CRITICAL();
#endif
    if (OSRunning == TRUE) {    
        ptcb = OSTCBList;                                  
        while (ptcb->OSTCBPrio != OS_IDLE_PRIO) {          
            OS_ENTER_CRITICAL();
            if (ptcb->OSTCBDly != 0) {                     
                if (--ptcb->OSTCBDly == 0) {               
                    if ((ptcb->OSTCBStat & OS_STAT_SUSPEND) == OS_STAT_RDY) { 
                        OSRdyGrp               |= ptcb->OSTCBBitY; 
                        OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
                    } else {                               
                        ptcb->OSTCBDly = 1;                
                    }                                      
                }
            }
            ptcb = ptcb->OSTCBNext;                        
            OS_EXIT_CRITICAL();
        }

今天拿RTOS的source code来当范例

每一个系统都一定会有时间中断

而中断又以时间中断为重任, 排程会由时间中断来计数行程可执行的周期是否结束, 并且不管是在waiting queue或是睡觉中的任务只要时间中断进来发现该你run了, 任务就会被设为running.

以代码为例,

可以看到TimeTick()为前面的中断处理後会呼叫的function, 必须知道每一次的中断CPU都势必需要保留前一个任务所留存的值, 在复杂的系统中, 有太多优化的方式可以加速这个操作. 但在嵌入式系统, 大多都是full context switch, 保留所有寄存器的值进stack. 所以中断越多次所消耗掉的效能也越多. 这也是为什麽排程演算法也如此重要, 要是没有写好 preemption太常发生, 效能就直接下去了 甚至造成任务延时.

这一段代码最重要的点是TCBList的结构,

他会走访每一个行程的TCB并且查看状态是否Ready, 如果行程睡饱了, 那这边就会把他设成standby

离开TimeTick的时候会在reschedule一次, 这时就会依据排程性来执行下一个行程

结论就是, 时间中断跟任务排程息息相关. 所以後面再看排程演算法的代码或是公式解时都会有这项参数呢

晚安


<<:  JS 08 - 静态方法

>>:  [DAY8]制作容器(七)

[Day 18] 再访 HLP — 人(?)的表现是己欲立而立人

Being human means having doubts and yet still con...

5种常见网站安全攻击手段及防御方法

网站攻击方法多种多样,防御手段也各有侧重,但只要在创建或运营网站时不跳过安全设置,至少能缓解遭攻击...

每日挑战,从Javascript面试题目了解一些你可能忽略的概念 - Day20

tags: ItIron2021 Javascript 作者碎碎念 终於来到第20天了,回头看了一下...

AE-LED流动效果1-Day19

今天要来练习LED的流动练习 参考来源-六指渊:https://www.sixvfx.com/exp...

後记

这是铁人赛的最後一篇文章,我想在这个结尾分享为什麽我会写这个主题,这是因为几个月前的某一天我正在与跨...