RT-thread
文章平均质量分 88
我很倔
这个作者很懒,什么都没留下…
展开
-
rt-thread的小内存管理算法分析
rt-thread的小内存管理是rt-thread操作系统默认堆内存管理算法,是一种简单的内存分配算法,当有可用的内存的时候,会从中分割一块来作为分配的内存,而剩下的则返回到动态内存堆中.此算法采用了一个静态链表来实现的,其源码文件在根目录下的src目录下,包含mem.c和mem.h两个文件.1 数据结构小内存管理算法将内存看成是一个个内存块:[cpp] v转载 2016-08-10 20:12:10 · 4021 阅读 · 1 评论 -
【RT-Thread学习笔记 3】线程优先级抢占实验
同时处于就绪状态的线程,优先级高的先执行。高优先级就绪时,低优先级任务让出CPU,让高优先级任务先执行。创建两个任务函数://线程优先级抢占void thread1_entry(void *parameter){ rt_uint32_t count = 0; while(1) { for(;;count++)转载 2016-07-04 15:01:37 · 1167 阅读 · 1 评论 -
【RT-Thread学习笔记 2】RT-Thread的线程(任务)处理
RT-Thread中使用线程这个概念,而不是任务。两者相似,我在这里把他的线程当作任务来理解了1、任务处理:动态任务相关API创建任务:rt_thread_create函数,创建任务之后会返回rt_thread_t类型的任务ID创建之后启动任务:rt_thread_startup删除任务:rt_thread_delete任务延时函数:rt_threa转载 2016-07-04 15:00:52 · 3723 阅读 · 0 评论 -
【RT-Thread学习笔记 1】熟悉RT-Thread的软硬件环境
软件环境:Win7+MDK4.7.2硬件环境:STM32F4Discovery所用OS代码:RT-Thread2.0.0 beta 下载地址: https://github.com/RT-Thread/rt-thread/archive/v2.0.0_beta.zip 解压缩后,使用\rt-thread-2.0.0_beta\bsp\stm32f40x\转载 2016-07-04 14:58:57 · 1786 阅读 · 0 评论 -
RT-thread 设备驱动组件之IIC总线设备
本文主要介绍RT-thread中IIC总线设备驱动,涉及到的主要文件有:驱动框架文件(i2c_core.c,i2c_dev.c,i2c-bit-ops.c,i2c_dev.h,i2c.h);底层硬件驱动文件(i2c_soft.c,i2c_soft.h)。这里的i2c_soft.c和i2c_soft.h是指利用MCU的GPIO口模拟IIC总线时序,而不是利用MCU的硬件IIC接口。应用IIC总线设备转载 2016-07-04 14:52:02 · 7021 阅读 · 1 评论 -
RT-thread 设备驱动组件之SPI设备
本文主要介绍RT-thread中的SPI设备驱动,涉及到的文件主要有:驱动框架文件(spi_dev.c,spi_core.c,spi.h),底层硬件驱动文件(spi_hard.c,spi_hard.h)。这里spi_hard.c和spi_hard.h是指利用MCU的硬件SPI接口,而不是通过GPIO口来模拟SPI时序。应用SPI设备驱动时,需要在rtconfig.h中宏定义#define RT_U转载 2016-07-04 14:51:30 · 4917 阅读 · 0 评论 -
RT thread 设备驱动组件之USART设备
本文以stm32f4xx平台介绍串口驱动,主要目的是:1、RTT中如何编写中断处理程序;2、如何编写RTT设备驱动接口代码;3、了解串行设备的常见处理机制。所涉及的主要源码文件有:驱动框架文件(usart.c,usart.h),底层硬件驱动文件(serial.c,serial.h)。应用串口设备驱动时,需要在rtconfig.h中宏定义#define RT_USING_SERIAL。一、RTT转载 2016-07-04 14:50:30 · 8915 阅读 · 0 评论 -
RT-thread 设备驱动组件之PIN设备
在RT-thread 2.0.0正式版中引入了pin设备作为杂类设备,其设备驱动文件pin.c在rt-thread-2.0.1\components\drivers\misc中,主要用于操作芯片GPIO, 如点亮led,按键等。同时对于相应的芯片平台,需要自行编写底层gpio驱动,如gpio.c。本文主要涉及的pin设备文件有:驱动框架文件(pin.c,pin.h),底层硬件驱动文件(gpio.c转载 2016-07-04 14:49:57 · 4344 阅读 · 0 评论 -
RT-thread finsh组件工作流程
finsh是RT-Thread的命令行外壳(shell),提供一套供用户在命令行的操作接口,主要用于调试、查看系统信息。在大部分嵌入式系统中,一般开发调试都使用硬件调试器和printf日志打印,在有些情况下,这两种方式并不是那么好用。比如对于RT-Thread这个多线程系统,我们想知道某个时刻系统中的线程运行状态、手动控制系统状态。如果有一个shell,就可以输入命令,直接相应的函数执行获得需要的转载 2016-07-04 14:48:54 · 4545 阅读 · 1 评论 -
RT-thread main函数分析
RT-thread系统的main函数位于startup.c文件中。/** * This function will startup RT-Thread RTOS. */void rtthread_startup(void){ /* init board */ rt_hw_board_init();//NVIC_config, SysTick_config, se转载 2016-07-04 14:48:09 · 2265 阅读 · 0 评论 -
RT-thread组件初始化代码分析
RT-thread提供了组件化功能,具体实现是在components/init文件夹下components.c文件中实现的。应用组件化功能首先在rtconfig.h中添加宏定义#define RT_USING_COMPONENTS_INIT;若需要启用调试模式,则还要添加#define RT_DEBUG_INIT 1。void rt_components_board_init(vo转载 2016-07-04 14:47:36 · 1555 阅读 · 0 评论 -
【RT-Thread学习笔记 4】线程让出实验
API: rt_thread_yield线程函数中调用,本线程释放MCU。如果此时有别的相同优先级的任务整处于等待状态,将获得MCU使用权。线程让出就是给OS增加一个任务调度的机会。创建两个线程,观察他们的结果://线程让出试验void yield_test1(void* parameter){ rt_uint32_t count = 0;转载 2016-07-04 15:02:42 · 614 阅读 · 0 评论 -
【RT-Thread学习笔记 5】优先级反转实验,使用信号量实现
RTOS中很经典的问题。就是在使用共享资源的时候,优先级低的进程在优先级高的进程之前执行的问题。这里模拟这种情况。下面的实验模拟了优先级反转的情况:先定义三个线程://优先级反转实验rt_sem_t sem;rt_uint32_t t1_count = 0,t2_count = 0,worker_count = 0;rt_thread_t t1,t2,worker转载 2016-07-04 15:03:19 · 1170 阅读 · 0 评论 -
【RT-Thread学习笔记 6】RT-Thread下的串口驱动程序分析
编写本文稿的目的,在于通过分析stm32平台上的串口中断源码,学习RTT中如何编写中断处理程序如何编写RTT设备驱动接口代码了解串行设备的常见处理机制先以RTT官方源码中的STM32 BSP包来分析。rt-thread\bsp\stm32f10x 下,涉及的文件为:usart.cusart.hserail.cserail.转载 2016-07-04 15:04:59 · 5309 阅读 · 2 评论 -
rt-thread的内核对象管理系统分析
rt-thread采用内核对象管理系统来访问和管理所有内核对象.首先来看看rt-thread的内核对象是如何定义的:1 数据结构1.1 对象控制块在include/rtdef.h头文件中可以找到内核对象有结构定义:[cpp] view plain copy/** * Base structure of Kernel object转载 2016-08-10 20:14:45 · 2344 阅读 · 0 评论 -
rt-thread的定时器管理源码分析
1 前言rt-thread可以采用软件定时器或硬件定时器来实现定时器管理的,所谓软件定时器是指由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受数目限制的定时器服务。而硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到转载 2016-08-10 20:16:26 · 1486 阅读 · 0 评论 -
rt-thread线程源码分析
rt-thread操作系统是一个多线程的操作系统,线程对于rt-thread来说是一个很重要的概念,因此,必须掌握它。1 线程控制块的数据结构[cpp] view plain copy/** * Thread structure */ struct rt_thread { /* rt object *///这转载 2016-08-10 20:17:37 · 1745 阅读 · 0 评论 -
rt-thread线程调度器源码分析
1 前言RT-Thread中提供的线程调度器是基于全抢占式优先级的调度,在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身.系统总共支持256个优先级(0 ~ 255,数值越小的优先级越高,0为最高优先级,255分配给空闲线程使用,一般用户不使用。在一些资源比较紧张的系统中,可以根据情况选择只支持8个或32个转载 2016-08-10 20:19:12 · 1088 阅读 · 0 评论 -
rt-thread线程调度器获取当前最高优先级线程算法过程分析
上一章大概分析了rt-thread操作系统的线程调度器的源码,此文具体来讲讲rt-thread在调试时,是如何获取获得当前最高优先级线程的算法过程。之前已提到过,rt-thread采用了一个位图来实现此过程,在具体分析此过程之前,我们首先来看看此位图的结构及相关的一些参数变量。1 位图结构及相关参数1.1 位图结构在rt-thread的源码文件scheduler.c中在转载 2016-08-10 20:20:12 · 924 阅读 · 0 评论 -
时钟中断是rt-thread的线程调度器的驱动力
1 系统时钟中断驱动引擎rt-thread操作系统中当线程时间片耗尽,或是当线程sleep一段时间后唤醒再被调度,此过程又是如何进行的呢?到底是谁来驱动这一过程的呢?答案是时钟中断源。且来看看时钟中断例程:在bsp/stm32f20x/drivers/board.c源文件中存在这么一个时钟中断例程代码:(这里以stm32f20x的MCU为例)[c转载 2016-08-10 20:21:04 · 941 阅读 · 0 评论 -
rt-thread的空闲线程源码分析
rt-thread的空闲线程在是线程空闲时执行的,它的主要操作是进行“垃圾回收”,这里的“垃圾”是待close掉的线程。1 空闲线程的实现在rt-thread线程启运时,系统会初始化空闲线程并启动它:[cpp] view plain copy/** * @ingroup SymstemInit * * This转载 2016-08-10 20:22:25 · 668 阅读 · 0 评论 -
rt-thread的IO设备管理系统源码分析
rt-thread的IO设备管理模块为应用提供了一个对设备进行访问的通用接口,,并通过定义的数据结构对设备驱动程序和设备信息进行管理。从系统整体位置来说I/O管理模块相当于设备驱动程序和上层应用之间的一个中间层。I/O管理模块实现了对设备驱动程序的封装:设备驱动程序的实现与I/O管理模块独立,提高了模块的可移植性。应用程序通过I/O管理模块提供的标准接口访问底层设备,设备驱动程序的升级不会转载 2016-08-10 20:25:47 · 1106 阅读 · 0 评论 -
rt-thread的IPC机制之信号量源码分析
rt-thread操作系统的IPC(Inter-Process Communication,进程间通信)包含有信号量,互斥锁,事件,邮箱,消息队列.本文主要针对信号量.信号量是用来解决线程同步和互斥的通用工具,和互斥量类似,信号量也可用作资源互斥访问,但信号量没有所有者的概念,在应用上比互斥量更广泛。信号量比较简单,不能解决优先级翻转问题,但信号量是一种轻量级的对象,比互斥量小巧、灵活。因转载 2016-08-10 20:27:35 · 1066 阅读 · 0 评论 -
RT-thread内核之定时器管理
一、前言rt-thread采用软件定时器线程模式或硬件定时器中断模式来实现系统定时器管理。而rt-thread操作系统在默认情况下是采用的硬件定时器中断模式的方式,用户可以通过宏定义RT_USING_TIMER_SOFT来修改定时器管理模式。硬件定时器中断模式是利用MCU芯片本身提供的硬件定时器功能,一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入转载 2017-05-31 15:47:04 · 1560 阅读 · 0 评论 -
RT-thread-2.0.1移植(基于STM32F4xx)
1、将下载的rt-thread-2.0.1解压后,得到如下图所示的文件列表。在bsp目录下可以找到stm32f40x文件夹,这文件夹里面包括了库函数,其他芯片平台的文件夹统统删掉。在libcpu下,只需要将arm文件夹里面的common和cortex-m4留下来,其他的也都统统删掉。还有其他一些辅助性的文件,如:documentation、examples、tools什么的我们也统统删掉,转载 2016-07-04 14:46:42 · 1834 阅读 · 0 评论 -
RT-thread内核对象标志flag总结
一、内核标志flag 在内核对象控制块中有一个标志成员flag(rt_uint8_t flag; ),这个标志在不同有内核对象中具有不同的含义。rt-thread的内核对象有定时器、线程、信号量、互斥锁、事件、邮箱、消息队列、内存堆、设备、模块,这些内核对象都继承了内核对象的成员,其中也就包含了内核对象的flag成员,因此,内核对象成员flag在这些不同的场合是具体不同的含义的。转载 2016-07-04 14:45:15 · 1592 阅读 · 0 评论 -
RT-thread内核之消息队列
一、消息队列控制块:在include/rtdef.h中#ifdef RT_USING_MESSAGEQUEUE/** * message queue structure */struct rt_messagequeue{ struct rt_ipc_object parent; /***/ //继承自IPC对转载 2016-07-04 14:44:37 · 2575 阅读 · 0 评论 -
RT-thread内核之线程内核对象
在RT-Thread实时操作系统中,任务采用了线程来实现,线程是RT-Thread中最基本的调度单位,它描述了一个任务执行的上下文关系,也描述了这个任务所处的优先等级。重要的任务能拥有相对较高的优先级,非重要的任务优先级可以放低,并且可以类似Linux一样具备分时的效果。线程控制块是操作系统用于控制线程的一个数据结构,它会存放线程的一些信息,例如优先级,线程名称等,也包含线程与线程之间连接用的链表转载 2016-07-04 14:28:12 · 731 阅读 · 0 评论 -
RT-thread内核之对象管理系统
一、数据结构1、对象控制块:在include/rtdef.h中定义 1 /** 2 * Base structure of Kernel object 3 */ 4 struct rt_object 5 { 6 char name[RT_NAME_MAX]; /*对象名称,RT_NAME_MAX在rtconfig.h中定义 */ 7转载 2016-07-04 14:26:11 · 495 阅读 · 0 评论 -
RT-thread内核之内核对象模型
RT-Thread的内核对象模型是一种非常有趣的面向对象实现方式。由于C语言更为面向系统底层,操作系统核心通常都是采用C语言和汇编语言混合编写而成。C语言作为一门高级计算机编程语言,一般被认为是一种面向过程的编程语言:程序员按照特定的方式把要处理事物的过程一级级分解成一个个子过程。面向对象源于人类对世界的认知多偏向于类别模式,根据世界中不同物品的特性分门别类的组织在一起抽象并归纳,形成各个类别的自转载 2016-07-04 14:25:16 · 1127 阅读 · 0 评论 -
RT-thread国产实时操作系统概述
RT-Thread实时操作系统是一个分层的操作系统,它包括了:• 组件层components,这些是基于RT-Thread核心基础上的外围组件,把一些功能模块划分成独立的一个个组件模块,做到组件与组件之间的低耦合,组件内部的高内聚。 例如文件系统,命令行shell接口,lwIP轻型TCP/IP协议栈,GUI图形用户界面等。• 硬实时内核kernel,这层是RT-Thread转载 2016-07-04 14:22:46 · 7363 阅读 · 0 评论 -
RT-Thread互斥锁
互斥锁和信号量很相似, RT-Thread 中的互斥锁也有静态和动态之分,和互斥锁有关的操作如下:初始化—rt_mutex_init()(对应静态互斥锁);建立—rt_mutex_create()(对应动态互斥锁);获取—rt_mutex_take();释放—rt_ mutex_release();脱离—rt_mutex_detach()( 对应静态信号量) ;删除—r转载 2016-07-13 21:28:00 · 8371 阅读 · 0 评论 -
RT-Thread信号量实际运用—按键点灯
上面是魔笛开发板上 LED 和按键的 IO 分布,我们通过信号量的方法来同步按键线程和LED 线程,实现当 enter 键按下后,点亮或关闭 LED 的动作。/************************************************************************************************************转载 2016-07-13 21:26:05 · 4826 阅读 · 0 评论 -
RT-Thread信号量的基本操作
抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为 0 时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: take ( 获取) 和Release(释放)。当一个线程调用 take 操作时,它要么得到资源然后将信号量减一,要么一直等下去(指放入阻塞队列),直到信号量大于等于一转载 2016-07-13 21:24:52 · 8490 阅读 · 0 评论 -
RT-Thread的线程间同步
禁止系统调度上一节《 多线程导致的临界区问题》中由于 test1 线程被 test2 线程打断,才导致了我们没有得到预期的结果,我们一般可通过关闭中断和调度器上锁这两种简单的途径来禁止系统调度,防止线程被打断,从而保证临界区不被破坏。1、 关闭中断线程中关闭中断保护临界区的结构如下:#include #include #include "test.h"rt_ui转载 2016-07-13 21:24:01 · 713 阅读 · 0 评论 -
RT-Thread多线程导致的临界区问题
临界资源是指一次仅允许一个线程使用的共享资源。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它们进行访问。每个线程中访问临界资源的那段代码称为临界区( Critical Section),每次只准许一个线程进入临界区,进入后不允许其他线程进入。多线程程序的开发方式不同于裸机程序,多个线程在宏观上是并发运行的,因此使用一个共享资源是需要注意,否则就可能出现错误的运行结果。#i转载 2016-07-13 21:21:03 · 2331 阅读 · 1 评论 -
RT-Thread的CPU使用率计算
CPU 的使用率一般是我们比较关心的问题,在这里我们就用空闲线程的钩子函数去统计 CPU 的使用率,并通过串口打印出来。首先我们在初始化线程中设置好钩子函数,并在 LED 线程中给系统人为的加入很多“事情”,让其占用率变高,方便统计,然后每个 1 秒中打印一次 CPU 使用率。其中 CPU 的使用率我们是根据 CPU 的空闲率反推出来的。#include #include #转载 2016-07-13 21:20:15 · 4207 阅读 · 1 评论 -
RT-thread内核之线程调度器
一、前言RT-Thread中提供的线程调度器是基于全抢占式优先级的调度,在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身.系统总共支持256个优先级(0 ~ 255,数值越小的优先级越高,0为最高优先级,255分配给空闲线程使用,一般用户不使用。在一些资源比较紧张的系统中,可以根据情况选择只支持8个或32个优先转载 2016-07-04 14:29:40 · 785 阅读 · 0 评论 -
RT-thread内核之线程调度算法
一个操作系统如果只是具备了高优先级任务能够“立即”获得处理器并得到执行的特点,那么它仍然不算是实时操作系统。因为这个查找最高优先级线程的过程决定了调度时间是否具有确定性,例如一个包含n个就绪任务的系统中,如果仅仅从头找到尾,那么这个时间将直接和n相关,而下一个就绪线程抉择时间的长短将会极大的影响系统的实时性。当所有就绪线程都链接在它们对应的优先级队列中时,抉择过程就将演变为在优先级数组中寻找具有最转载 2016-07-04 14:30:37 · 1840 阅读 · 0 评论 -
RT-thread内核之空闲线程
空闲线程是系统线程中一个比较特殊的线程,它具有最低的优先级,当系统中无其他线程可运行时,调度器将调度到空闲线程。空闲线程通常是一个死循环,永远不被挂起。RT-Thread实时操作系统为空闲线程提供了钩子函数(钩子函数:用户提供的一段代码,在系统运行的某一路径上设置一个钩子,当系统经过这个位置时,转而执行这个钩子函数,然后再返回到它的正常路径上),可以让系统在空闲的时候执行一些特定的任务,例如系统运转载 2016-07-04 14:31:39 · 3359 阅读 · 0 评论