首先感谢论坛和RT-Thread组织的这次读书活动,收到《RT-Thread内核实现与应用开发实战指南》这本书已经有一个礼拜的时间了,虽然没有第一时间分享读书笔记,但这一个星期的时间仔细的阅读了书中前10章的内容,并按照书中建议“一边看书一边调试代码”,在keil5下把书中的代码跟着手动敲写了一番,下面就总结一下近期学习到的知识点。 书中1-4章节的内容,主要介绍了RT-Thread的简介和KEIL5环境的搭建,这些基础的知识就没什么总结的东西了。
一,裸机系统
裸机系统可分为轮询系统和前后台系统
(1)轮询系统:初始化好相关的硬件之后,主程序在一个死循环中不断循环,顺序的处理各种事物,适用于只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情
(2)前后台系统:就是在轮询系统的基础上增加了中断机制,能够对外部事件进行响应,事件的处理回到轮询系统中完成(如果事 件处理的事情很简单,也可在中断服务程序里处理),其中中断被称为前台,主函数里面的无限循环称为后台
自己目前工作中用到的正是前后台系统的模式,没用到过纯粹的轮询系统
二,多线程系统
首先是线程的概念,线程是一段程序代码,虽然是代码,但是既然称为线程就必然具备一些特点:
(1)线程是独立的,不同的线程互不干扰
(2)线程一旦进入便无限循环并且不能返回
(3)线程具备自身的优先级
多线程系统,就是根据程序的功能,把程序主体分割成多个线程去处理,然后具体执行哪个线程,决定权交个操作系统,由操作系 统调度管理,这样相比于裸机系统,就不必自己设计程序的执行流程,但是会带来存储空间上的开销。
正如书中所言,无论是轮询系统、前后台系统还是多线程系统、各有各的应用领域优势,无好坏优劣之分,合适才是最好
三,线程栈
线程栈 — 单片机RAM里面一段连续的内存空间(通常是一个定义好的全局数组),那么线程栈是用来做什么的,为什么要用到线 程栈?
单片机有一组寄存器,这些寄存器中存储的值记录了程序运行的全部状态,因此在程序运行的不同时刻,里面的内容是会随时发生变的,既然用到了多线程系统,也就是说系统运行起来之后,各个线程随时会被系统调用或被系统轮休,并且线程被调用或轮休的时间点是随机的,那一个线程从被轮休到被调用要想无缝的从上次被轮休的时间点继续运行怎么才能做到,因为单片机的寄存器记录了程序运行的全部状态,也就是说一个线程从被轮休前运行的那一刻所有的执行状态都在单片机的寄存器中存储着了,但是单片机的寄存器只有一组,并且是时刻变化着的,因此,线程轮休前将寄存器的值保存起来,再次运行的时候,将保存的值恢复到单片机的寄存器中,就可以实现线程两次运行之间无缝连接了,因此就用到了线程栈,线程栈正是用来保存线程被轮休前的运行状态的。由此可见每一个线程都应该配备一个线程栈才行。
四,线程控制块
线程控制块是神马东西?又是做神马用的???
线程已经通过线程栈保存了轮休前运行状态信息,继续工作后知道自己应该从哪开始干活儿了,可以说线程自己的事儿解决了,但 是,线程啥时候开始干活儿,啥时候轮休要操作系统决定啊,那操作系统根据啥决定呢,到哪儿去找一个具体的线程来干活儿?那好吧,给线程建个账户,保存好线程的个人信息,这样操作系统要用到某个线程的时候,到账户下一查就明白了。既然是要保存线程的信息,毫无疑问,线程控制块就是存数据的了,其实,线程控制块一个数据结构,里面保存了线程的所有信息。
今天就先写这么多,洗洗睡了
此内容由EEWORLD论坛网友dong2213dong原创,如需转载或用于商业用途需征得作者同意并注明出处
本帖最后由 dong2213dong 于 2019-4-25 21:23 编辑