RTOS
文章平均质量分 84
Mnnk
这个作者很懒,什么都没留下…
展开
-
RT-Thread 应用篇
问题:串口乱码,或者延时时间不准确解决:查看外部晶振配置是否正确,文件stm32f4xx.h中HSE_VALUE要与实际的晶振大小相同。#define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */同时,system_stm32f4xx.c文件中PLL_M页要修改为对应值。...原创 2019-04-16 20:37:35 · 534 阅读 · 0 评论 -
RT-Thread移植到S5P4418(五):线程通信
RT-Thread实现了三种线程间通信方式,邮箱(mailbox)、消息队列(messagequeue)、和信号(signal)。邮箱邮箱中的每一封邮件只能容纳固定的 4 字节内容。任何线程都可以发送或接受邮件消息。邮箱控制块struct rt_mailbox{ struct rt_ipc_object parent; rt_uint32_t* msg_pool; ...原创 2019-03-10 23:21:50 · 823 阅读 · 0 评论 -
RT-Thread移植到S5P4418(四):线程同步
同步是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制(如互斥量,事件对象,临界区)来控制线程之间的执行顺序,也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步,那线程之间将是无序的。线程的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个 (或一类) 线程运行。RT-Thread实现了三种线程间同步方式,信号量(semaphore)、互斥量(mutex)...原创 2019-02-26 14:36:22 · 363 阅读 · 0 评论 -
RT-Thread移植到S5P4418(三):静态内存池管理
内存堆管理器可以分配任意大小的内存块,非常灵活和方便。但其也存在明显的缺点:一是分配效率不高,在每次分配时,都要空闲内存块查找;二是容易产生内存碎片。为了提高内存分配的效率,并且避免内存碎片,RT-Thread 提供了另外一种内存管理方法:内存池(Memory Pool)。内存池是一种内存分配方式,用于分配大量大小相同的小内存块,它可以极大地加快内存分配与释放的速度,且能尽量避免内存碎片化。此外...原创 2019-02-21 16:49:55 · 703 阅读 · 0 评论 -
RT-Thread移植到S5P4418(二):动态内存管理
内存管理在RT-Thread中分为动态内存管理和静态内存管理。静态的又称为内存池管理,动态的称为内存堆管理。内存堆:官方提供了三种管理方式。小内存管理。申请时在一块大的、连续的内存中按需求分割出相匹配的小内存块;释放时,归还给堆管理系统。每个内存块都包含一个管理用的数据头,通过双向链表来管理使用块和空闲块。slab 管理算法。TODO!memheap 管理算法。适用于系统含有多个地址...原创 2019-02-17 19:19:21 · 896 阅读 · 0 评论 -
RT-Thread移植到S5P4418(一):调度器
S5P4418,Cortex-A9系列。结合了 RT-Thread内核实现(六):时间片 和 S5P4418裸机开发(十四):TIMER 的代码。SysTick &amp;amp;amp;amp; PendSVRT-Thread实现线程调度两个比较核心的中断。SysTick更新系统时基。PendSV做上下文切换。SysTick在S5P4418中用timer0代替。周期10ms,注意中断服务函数要清除中断标志位...原创 2019-01-28 20:25:27 · 799 阅读 · 0 评论 -
RT-Thread内核实现(六):时间片
整体思想假如A、B两个线程优先级相同,A先启动,只要A不主动让出CPU,线程B就没机会执行。时间片就是为了解决相同优先级下多线程的并发问题。线程控制块添加rt_ubase_t init_tick属性,remaining_tick记录剩余的时间片。struct rt_thread{ /* rt 对象 */ char name[RT_NAME_MAX]...原创 2018-12-09 20:51:44 · 1404 阅读 · 0 评论 -
RT-Thread内核实现(四):多优先级
整体思想:前几章并不支持多优先级,都是手动切换指定的线程来运行。支持优先级后,调度器只会找当前最高优先级的线程来运行。RT-Thread属于抢占式实时操作系统,CPU会被当前最高优先级线程抢占,除非最高优先级线程主动放弃,比如调用rt_thread_delay(rt_tick_t tick)延时函数,会将线程状态改为挂起状态或者说阻塞状态,然后执行系统调度。线程控制块添加了几属性...原创 2018-12-02 00:21:26 · 673 阅读 · 0 评论 -
RT-Thread内核实现(三):空闲线程与阻塞延时的实现
空闲函数 idle如果没有其它线程可以运行, RTOS 都会为 CPU 创建一个空闲线程,这个时候 CPU 就运行空闲线程。 在 RTThread 中,空闲线程是系统在初始化的时候创建的优先级最低的线程,空闲线程主体主要是做一些系统内存的清理工作。相关定义。idle.c#define IDLE_THREAD_STACK_SIZE 512 // 空闲线程的栈大小ALIGN(...原创 2018-11-27 21:20:01 · 2137 阅读 · 0 评论 -
RT-Thread内核实现(二):临界区,对象容器
临界区(Critical Section)保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。RT-Thread 对临界段的保护就处理的很干脆,直接把中断全部关了, NMI FAULT 和硬 FAULT 除外。Cortex M3权威指南 中对异常掩蔽寄存器的说明。当临界段嵌套时,如果简单的开关总中断,内部临界段释放时总中断被打开,而外部临界段并...原创 2018-11-24 21:59:45 · 497 阅读 · 0 评论 -
RT-Thread内核实现(一):线程与调度
线程是一个独立的、无限循环且不能返回的函数。系统为了顺利的调度线程,为每个线程都额外定义了一个线程控制块,这个线程控制块就相当于线程的身份证,里面存有线程的所有信息,比如线程的栈指针,线程名称, 线程的形参等。rtdef.h中定义了线程控制块结构体/*****************************************************************...原创 2018-11-19 14:08:33 · 844 阅读 · 0 评论 -
RT-Thread内核实现(五):定时器
定时器结构体成员row[RT_TIMER_SKIP_LIST_LEVEL] 表示该节点在跳跃表中的纵向分布,根据跳转表的特性,第一级链表必须包含所有节点,所以row[RT_TIMER_SKIP_LIST_LEVEL - 1]必须挂在rt_timer_list[RT_TIMER_SKIP_LIST_LEVEL - 1]上。原创 2018-12-09 13:56:50 · 1145 阅读 · 0 评论