- 博客(25)
- 收藏
- 关注
原创 RT-Thead 的学习理解索引
索引基础篇中级篇高级篇本索引主要的目的是,收集整理在 RT-Thread 操作系统学习时的心得。在文章命名时会依据 “[基础篇] _ xx _ [xxxxx]” 的形式命名文章。如果想了解更详细的使用方法,建议访问官方的文档中心。基础篇基础篇的内容主要是描述 RT-Thread 出现的接口如何使用,以及在使用时需要注意的内容。基础篇_01_线程创建基础篇_02_线程切换钩子函数与临界区基础篇_03_堆的初始化及 map 文件基础篇_04_IPC之信号量基础篇_05_IPC之互斥锁
2021-04-18 18:11:36
422
原创 ENV工具的使用
Scons构建工具的使用 scons工具在我第一次接触时候,就深深喜欢这样的配置方式。在env工具的加持下,配置工程变得轻而易举;学会使用scons工具不能局限于使用,还应当制作出package,进一步改善开发环境。目录Scons构建工具的使用...
2019-04-20 14:42:26
5566
原创 中级篇_07_定时器和时间片的实现
目录定时器的实现定时器的细节定时器定时余时检索硬定时器和软定时器时间片的实现时间片的细节长延时下的RT-Thread任务切换线程就绪列表,优先级表,定时器链表,对象容器,时间片这五者的关系怎么用一张图表示?他们中间是如何切换的?定时器的实现定时器的细节 对于一个单片机,定时器通常是最基础的功能。不过,这里的定时器是基于硬件的定时器。依靠时钟晶振,硬件电路来实现的。RT-Thread也有自己...
2018-11-17 20:50:00
2650
原创 中级篇_06_优先级的实现
目录多优先级是怎么实现的__rt_ffs是怎么快速找到最先转入就绪态的线程的支持最多的优先级达到256级,怎么实现的[^1]多优先级是怎么实现的 多优先级是怎么实现的,__rt_ffs是怎么快速找到最先转入就绪态的线程的支持最多的优先级达到256级,怎么实现的1RTThread物联网操作系统<传送门> ↩︎...
2018-11-17 13:42:41
1917
原创 中级篇_05_空闲线程和阻塞延时的实现
目录对空闲线程的理解空闲线程的实现对阻塞延时的理解阻塞延时的实现支持修改当前线程的状态支持记录线程恢复就绪态时间统计支持线程的切换对空闲线程的理解 空闲线程对于一个实时操作系统来说是十分重要的。因为线程会因为需要而主动放弃对CPU的使用,而恰好当前所有线程都放弃对CPU的使用,这时候就需要一个保底的线程----优先级最低的空闲线程。空闲线程的实现 空闲线程也是一个线程,同样是调用r...
2018-11-16 17:14:07
1005
原创 中级篇_04_对象容器的实现
目录对象枚举定义容器的定义容器接口的实现rt_object_get_information()函数rt_object_init()函数对象枚举定义** * The object type can be one of the follows with specific * macros enabled: * - Thread * - Semaphore * - Mutex ...
2018-11-02 18:32:27
2216
原创 中级篇_03_线程调度的实现(二)
前情提要Cotex - M内核的三个中断屏蔽器 PRIMASK 只有一个单一比特的寄存器,被置一则关闭所有可屏蔽异常。只剩下MMI和硬FAULT可以响应。缺省为0,表示没有中断 FAULTMASK 只有一个单一比特的寄存器,被置一时,只有NMI才能响应。缺省为0,表示没有关异常 BASEPRI 最多有9位(由表达优先级的位数决定),它定义了被屏蔽优先级的阈值...
2018-10-30 21:19:52
1121
原创 中级篇_02_线程调度的实现(一)
多任务的切换的关键在于:保存当前任务的数据 + 切换到其他任务。这两个条件的目的是为了能够使程序看起来像是连贯的进行,就像是同时进行一样。至于保存当前程序的状态,什么反映了当前程序的状态?大家恐怕是比较疑惑这里的,实际上,程序得以运行是依靠ARM架构下的寄存器的,寄存器包括哪些?这里有传送门<ARM寄存器组织>。调度准备篇还有思考过在创建线程时,需要开启一个栈,栈大小为512,...
2018-10-28 16:27:09
1140
原创 中级篇_01_从线程的创建到就绪态
多线程的表象就是CPU来回在多个线程中切换,造成这几个线程同时都在响应的感觉。所以核心是调度,而使调度有意义就需要告诉系统,当前可以调度那些线程。在RT-Thread中,线程创建——>加入就绪态——>线程运行。就绪态的实现,是因为引入了一个双向链表,将线程插入链表则表示就绪态,删除则表示脱离就绪态。...
2018-10-16 22:07:04
693
原创 ARM指令集 --RISC精简指令集
汇编语言是与硬件接触的美妙语言,同时汇编语言又可以和C语言高度契合,在深入理解嵌入式时,汇编语言是一条不可忽略的一条道路。就像是记忆关键字一样记忆ARM的指令集,是一项必备的知识。ARM处理器支持ARM指令集,也支持16位的Thumb指令集,从ARMv6开始,新的ARM处理器支持16/32位的Thumb-2指令集(ARMv7-M仅支持Thumb-2)。ARM指令集使用标准的,固定长度的32位指...
2018-10-15 10:18:59
12230
2
原创 Linux的安装-CentOS 7版本带X Windows
嗯,distributions的版本是不能等同于Linux的版本的。作为入门必备,就先从CentOS开始入门,具体了解Linux系统。当然要学习的话,自然就要有环境。我呢,因为条件原因,选择使用虚拟机来完成Linux的初步学习。学习时候是对照着《鸟哥的Linux私房菜》来了解Linux的,书上的阶段还是CentOS 5,时过境迁现在都已经出到CentOS 7了,还真是感叹广大伟大的Linux开...
2018-10-11 10:51:02
8999
2
原创 HTML篇
我为什么想到学习前端的知识呢?其实呢,我的内心也没有准确的答案。可能是因为年轻,什么都想学一学试一试的缘故。不想蹉跎了青春时光。但是这个部分并不是我学习的重点,只是我在学习嵌入式之外的补充,所以可能较为浅显,还望各位大佬批评指正。html/css/javascript是前端三宝(学习嵌入式也就是玩玩C语言和汇编,另外由于个人能力的问题,也就只能说自己学过C语言,这里上来就三样,真心羡慕啊)。没...
2018-10-10 20:48:43
182
转载 嵌入式C高级用法 //转自RT_Thread物联网操作系统
1、内存管理我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字的,只知道地址。 内存的使用时程序设计中需要考虑的重要因素之一,这不仅由于系统内存是有限的(尤其在嵌入式系统中),而且内存分配也会直接影响到程序的效率。因此,我们要对C语言中的内存管理,有个系统的了解。 在C语言中,定义了4个内存区间:...
2018-09-29 12:11:21
267
原创 基础篇_11_内存池
内存池,申请出得内存情况是内存块,相对于动态内存申请rt_malloc()申请的内存,rt_mp_alloc()申请的内存块的开头和结尾会包含指向上一块的指针和指向下一块内存块的指针。每块内存块的大小相等。动态申请内存不会出现任务调度,内存池申请内存会出现任务调度。1.初始化内存池对象/*静态初始化内存池对象*/static rt_uint8_t *ptr[50];static rt...
2018-09-24 19:25:11
342
原创 基础篇_10_软件定时器
定时器,由RT_Thread虚拟出来得定时器,输入的参数有五个;相对于硬件的定时器,虚拟出来的定时器的定时时间的时间精度为滴答时钟起振的倍数,所以精度会有所损失;不过有利就有弊,软件定时器可以虚拟很多啊,也很好用。1.定时器的创建/* 静态创建 *//* 定时器的控制块 */static struct rt_timer static_timer;rt_timer_init(&am...
2018-09-24 16:59:48
1097
原创 基础篇_09_信号机制
信号,信号不同于一般得IPC变量,信号不需要初始化,也没有删除;信号有安装,监控,发送,响应的操作。为什么没有安装操作的原因是,信号大部分是被系统所使用的,是已经创建过的,信号室友具体标号的,例如我们能使用的SIGUSR1,SIGUSR2;还有我们可以自己定义的部分。/** Each of the following macros expand to a positive integral...
2018-09-24 12:27:26
405
2
原创 基础篇_08_IPC之消费者生产者问题
/* * 程序清单:生产者消费者例子 * * 这个例子中将创建两个线程用于实现生产者消费者问题 *(1)生产者线程将cnt值每次加1并循环存入array数组的5个成员内; *(2)消费者线程将生产者中生产的数值打印出来,并累加求和 */#include <rtthread.h>#define THREAD_PRIORITY 6#define THREA...
2018-09-24 10:42:08
386
原创 基础篇_07_IPC之事件
事件是什么,为什么需要事件?在RT-Thread中的IPC量已经包含了信号量,互斥量,邮箱,消息队列。事件作为IPC量的一种,它的和信号量和互斥锁类似,同样是为线程的运行增加限定条件。只不过事件的满足,拥有更加严格的条件。例如:同时满足1和2,满足1和2中的某一个,同时满足1,2,3,6中的条件或者满足其中某一个。1.事件的创建/*静态事件的创建*//*事件控制块*/static...
2018-09-23 22:01:42
451
原创 基础篇_06_IPC之邮箱及消息队列
邮箱和消息队列,都是在需要数据交换的场景下使用。那么首先,先介绍邮箱。邮箱有一个具体的大小,邮箱内接收的数据的个数,不能超过邮箱总大小的四分之一。1.邮箱的创建&消息队列的创建/*静态邮箱的创建*/static struct rt_mailbox static_mailbox;static char mb_pool[2048];rt_mb_init(&stat...
2018-09-23 20:08:29
2400
原创 基础篇_05_IPC之互斥锁
互斥锁,IPC的一部分。互斥锁,算是信号量中特殊的一个例子,即信号量的数量只为1,只要有任何一个线程获取到这个互斥量,在没有释放这个互斥量之前,任何线程都获取不到。除此之外,互斥锁还有一个作用,那就是提升当前信号量获取线程的的优先级。/*节选自rt_mutex_take()函数*//* change the owner thread priority of mutex */ if (th...
2018-09-23 09:26:47
491
原创 基础篇_04_IPC之信号量
IPC: Inter proess communication 大的任务中的各任务信息交互配合,内容包括信号量,互斥锁,消息队列,邮箱,事件 本篇文章,只讨论第一个内容,信号量1.信号量的创建和线程的创建方式类似,信号量的创建也分动态dynamic和静态static的分别,分别由两个函数实现。/*静态信号量的线程控制块*/static struct rt_semapho...
2018-09-22 11:26:06
786
原创 基础篇_03_堆的初始化及 map 文件
堆栈,是我们常常会听说过的词汇。搞嵌入式如果说不懂得堆栈可能会被怀疑学习了一个假的嵌入式。不过,坦白来说,我还是不太理解其中的细节,比如说栈的位置在哪?我们说栈是先进后出FILO形式的数据结构,堆是先进FIFO先出的形式的数据结构。栈是由系统操作的,而堆是由程序员操作的。我感觉这些解释都是玄而又玄的说法,我现在还没有理清头绪,以后有具体头绪了再来写出我的想法。现在先学习大佬的想法:栈...
2018-09-19 21:21:29
450
原创 基础篇_02_线程切换钩子函数与临界区
我们常说,空闲任务的优先级是最低的,仿佛任何任务都比它重要。但是实际上空闲任务,是作为所有RTOS中不可或缺的一部分。不管有那个任务被执行,总需要在必要时间切换到其他任务,满足系统的需要。所以,它最神奇,同时也最深奥。不过,由于知识能力所限,本人现在还不能清楚其中的重要核心部分;为了满足开发的需求,需要简单理解空闲任务及回调函数(钩子函数)的使用现象和简单的思考。1.钩子函数的创建 ...
2018-09-18 16:25:55
910
原创 基础篇_01_线程创建
1.thread线程的创建/*静态线程的创建启动删除的注意点*/在创建静态线程时,要注意分配线程控制块大小,以及线程结构体 threadx_statck[XX],static char threadx_statck[xx];static struct rt_thread threadx;静态线程的创建需要使用rt_thread_init()函数rt_thread_init...
2018-09-18 16:25:14
591
3
原创 ARM的异常响应过程
其他内容不再赘述,现在粘贴三张需要的表表1 异常类型,优先级及向量地址异常类型 优先级 工作模式 异常向量地址 说明 复位 RESET 1 管理模式 0x00000000 当RESET引脚有效时进入该异常 未定义的指令 UND 6 未定义指令的终止模式 0x00000004 协处理...
2018-09-08 09:48:50
12282
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人