RT-Thread学习笔记(2)- 流水灯代码分析与系统滴答时钟
(一)流水灯例程
流水灯的例程如下,我们只用了一个函数就实现了,现在我们逐层分析一下。
其实led_sample_init()这个函数创建了一个线程(任务),这样相当于在RTT 操作系统上注册了,相当于 人有了身份证一样,有了自己的ID, 第一个参数led_thread 是一个任务控制块,有着系统完成任务管理需要的各种信息。第二个参数则是线程的 名称。
第三个参数是线程的实体,里面的代码如下图所示,和裸机代码的实现很类似,只是延时函数不一样,在这了,一旦进入延时函数,线程就放弃CPU的使用权,将使用权交给别的函数(裸机的延时则是CPU一直耗在延时函数上面)。
(二)系统滴答时钟
在上面那个程序中我们看到这个 宏定义RT_TICK_PER_SECOND,我们来解释一下这个重要的宏定义,在rtconfig.h文件中,我们可以看到如下定义,注释已经解释了其用处,我们可以根据我们的需求和硬件的性能来更改,以得到合适的时钟心跳,这个心跳意味着,每次时钟心跳一到,系统就会发生一次任务调度。至于这个宏是怎么和硬件实现的,之后专门再写。
(三)系统的状态
RTT中线程有 三种状态(个人理解,具体看官方文档):
(1)运行态: 指的是任务正在占用CPU的状态。
(2)挂起态:任务是去CPU使用权处于等待的状态, 比如上文中进入 延时函数时,这个流水灯线程就处于挂起态。
(3)就绪态:得到了系统资源,等待获得CPU使用权(之前没有使用过CPU)。