RT-Thread
文章平均质量分 69
lyyyuna
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
extern int Image$$RW_IRAM1$$ZI$$Limit
RO段、RW段和ZI段 --Image$$??$$Limit 含义一直以来对于ARM体系中所描述的RO,RW和ZI数据存在似是而非的理解,这段时间对其仔细了解了一番,发现了一些规律,理解了一些以前书本上有的但是不理解的东西,我想应该有不少人也有和我同样的困惑,因此将我的一些关于RO,RW和ZI的理解写出来,希望能对大家有所帮助。要了解RO,RW和ZI需要首先了解以下知识:ARM转载 2013-02-05 10:24:16 · 6370 阅读 · 3 评论 -
[RTT例程练习] 2.9 事件机制event
事件也是一种在线程间同步的方式。RTT中,事件是一个32bit(4个字节)的变量,其中每一个位可以表示代表一种事件。接收事件的线程既可以在多个事件同时发生后(即多个bit位同时置1)触发,正如本例中线程1中第一条语句所演示的那样。也可以多个事件任意一个发生后(即多个bit位任意一个置位)就可以触发。主程序中创建三个线程,线程1接收事件标志。线程2和线程3则向发送事件标志。可以说,事件更为灵活。原创 2013-04-01 10:09:41 · 2704 阅读 · 0 评论 -
[RTT例程练习] 3.2 动态内存管理之rt_realloc和free
realloc 用于重新分配内存的场景。如果原先通过 malloc分配的空间过小,则可通过realloc重新分配大小。当然具体实现的时候分两种情况,如果原内存块后有足够的空间,则之间将原内存块扩大,如果不够,则重新寻找一个地方,将原数据也拷贝至此。代码:#include struct rt_thread thread1;static rt_uint8_t thread1_stack[原创 2013-04-06 21:28:02 · 2537 阅读 · 0 评论 -
[RTT例程练习] 4.1 定时器基本使用
定时器分为软件定时器和硬件定时器。硬件定时器,是指单片机本身提供的一种外设,能够产生定时事件,而且不占用CPU时间。优点是定时精度高,独立于CPU,还可灵活配置其他许多功能,例如PWM。而软件定时器是操作系统提供的一种定时接口,其精度取决于操作系统的tick时间,而RTOS的tick建立在硬件定时器之上,一旦开机就不再改变。但优点是其数量不受硬件定时器数目的限制,而且便于操作系统统一管理。原创 2013-04-07 13:30:45 · 3561 阅读 · 0 评论 -
[RTT例程练习] 4.4 定时器控制
定时器可以通过rt_timer_control(),来改变定时器的某些特性,比如定时时间。这里,一开始定时周期是100,并且在程序中使用 rt_tick_get()-tick来确认定时周期是否如预设那样。当8次之后,使用rt_timer_control(),将定时周期改为3000。实际效果通过打印的tick信息和直观感受都可以验证。程序:#include static原创 2013-04-07 13:44:26 · 3670 阅读 · 0 评论 -
[RTT例程练习] 3.3 静态内存管理,内存池mempool
内存池是一种静态的内存管理方法。它预先将一块固定连续的内存区域划分成几个大小不同的块。使用者申请时就将对应大小的内存块给他。这种方法的优点是不会有内存碎片,但不够灵活,适用于需要频繁存取的场合,例如buffer。这个例子有两个线程。thread1不停分配内存块,但其中并没有使用delay() 来使自己挂起,所以thread2 由于优先级低于 thread1 而一直得不到运行。thread1 分原创 2013-04-07 13:16:46 · 2788 阅读 · 0 评论 -
[RTT例程练习] 4.2 动态定时器
动态和静态的意思和前面完全一样,这里不再重复。这里创建两个动态定时器,一个是周期的另一个是单次的。其中timeout() 函数都是回调函数,即定时时间到之后,操作系统会自动调用的函数。 程序:#include static rt_timer_t timer1;static rt_timer_t timer2;static rt_uint8_t count;static原创 2013-04-07 13:35:50 · 2145 阅读 · 0 评论 -
[RTT例程练习] 6.1 Finsh 的基本使用
Finsh是调试的利器,它可以获取系统运行时信息,对任意寄存器和内存地址进行读写操作,还能直接调用系统函数访问系统变量。要使用这个功能,需要开启/* SECTION: Finsh, a C-Express shell */#define RT_USING_FINSH/* Using symbol table */#define FINSH_USING_SYMTAB#defi原创 2013-04-07 14:00:19 · 5164 阅读 · 1 评论 -
[RTT例程练习] 6.2 在 Finsh 中运行自定义函数
可以直接在Finsh中运行自己定义的函数。官方有三种方式,我觉得第二种比较方便,其他就不介绍了。首先需要在application.c 中包含 finsh.h 头文件,然后在函数下方添加宏FINSH_FUNCTION_EXPORT(fun_with_arg, function with a argument);程序#include #include static原创 2013-04-07 14:09:30 · 4683 阅读 · 0 评论 -
[RTT例程练习] 6.3 在 Finsh 中查看自定义变量
和前面类似,使用宏,就可以将变量输出至FinshFINSH_VAR_EXPORT(count, finsh_type_int, count variable for finsh);程序#include #include static rt_thread_t tid = RT_NULL;static void thread_entry(void *parameter)原创 2013-04-07 14:20:00 · 2523 阅读 · 0 评论 -
[RTT例程练习] 总目录
寒假闲来无事,把RTT官网上的初学者例程中的一部分实现了一遍。以下的这些实验有助于了解一般RTOS的用法。虽然现在RTT的版本比较多,但这些例程的效果都是和版本无关的。配置和编写有关RTT的程序也比较简单,只需改动 rtconifg.h 和 application.c 即可。还有一个好处,所有的实验(除了一个和按键有关的),都可以在keil中软件仿真,不需要实物平台。代码地址:http原创 2013-02-18 10:33:48 · 1897 阅读 · 1 评论 -
[RT-Thread 源码分析] 1. 内存管理1
rt-thread的小内存管理是其默认的堆内存管理算法。是采用静态链表来实现的,源文件为mem.c。1.数据结构===== struct heap_mem { /* magic and used flag */ rt_uint16_t magic; // 如果此内存块被分配了,则置0x1ea0,以此标志原创 2013-04-11 09:45:43 · 2576 阅读 · 0 评论 -
[RT-Thread 源码分析] 2. 内存管理2
/** * This function will change the previously allocated memory block. * * @param rmem pointer to memory allocated by rt_malloc * @param newsize the required new size * * @return the changed mem原创 2013-04-19 15:20:41 · 1748 阅读 · 0 评论 -
[RT-Thread 源码分析] 3. 内核对象管理
RTT在设计时虽然采用了c语言,但使用了面向对象的思想。所有的线程、事件设备等都是继承自object,且采用链表的方式统一管理。如图所示。对象控制块 /** * Base structure of Kernel object */ struct rt_object { char name[RT_NAME原创 2013-04-22 11:09:39 · 1663 阅读 · 0 评论 -
[RTT例程练习] 3.1 动态内存管理之rt_malloc和rt_free
rt_malloc和rt_free 和 malloc free 类似,是用来在堆上分配内存的,RT-Thread中是用小内存法来实现的。下面程序就是不停分配内存和释放内存,并打印分配到的内存首地址。程序:#include struct rt_thread thread1;static rt_uint8_t thread1_stack[512];static void threa原创 2013-04-01 10:23:37 · 3979 阅读 · 0 评论 -
[RTT例程练习] 2.7 邮箱 mailbox
邮箱是操作系统中,一个进程给另一个进程发送消息的方式。在裸奔的单片机中,在两个函数中交换信息的时候,我们通常选择最简便的方式-全局变量,这种编程模式无疑是降低了安全性和可靠性。再且,邮箱还能起到挂起线程的作用。本实验中创建一个邮箱,两个线程,线程2以一定周期发送邮箱,线程1以一定周期从邮箱中取出邮件。当线程2中发送20封邮件之后,发送一封特殊的邮件通知其他线程,自己已经运行结束。线程1取出原创 2013-03-18 14:01:20 · 3961 阅读 · 0 评论 -
RTT startup.c 代码学习
RTT的学习集中在应用层,底层的代码会在必要的时候涉及一下。 startup是RTT的启动代码,类似于ucos。 void rtthread_startup(void){ /* init board */ rt_hw_board_init(); /* show version */ rt_show_version();原创 2013-02-04 10:04:43 · 2529 阅读 · 0 评论 -
[RTT例程练习] 1.1 动态线程创建,删除
创建两个动态线程,thread2 运行4s后删除thread1。这里两个都为动态线程,所谓动态线程即在堆中动态创建,删除之后也从RAM中消失。区别于静态线程。由于是动态,所以需开启#define RT_USING_HEAP以下是application.c 的代码#include rt_thread_t tid1 = RT_NULL;rt_thread_t tid2原创 2013-02-18 10:42:55 · 2241 阅读 · 1 评论 -
[RTT例程练习] 1.2 静态线程除初始化与脱离
静态线程的栈是在编译时确定的,故不能由内核动态的创建或删除。静态线程只能通过detach 来使其脱离内核的调度而做不到 delete。所以静态线程中会像这样定义栈static rt_uint8_t thread1_stack[512];这一点是和ucosii 类似的,但ucosii 没有动态线程。个人感觉动态线程更有优势,也更像PC。尤其是在外扩了SRAM的情况下优势就更明显了。原创 2013-02-18 10:54:50 · 1470 阅读 · 0 评论 -
[RTT例程练习] 1.3 线程让出
RTT 支持相同优先级,而ucosii 不支持。如果一个线程不调用rt-thread_delay() 来让出调度器,那么它就会一直运行,其它线程永远处于就绪态。而相同优先级的线程,在初始化或创建时还定义了其单次运行的最长的时间片,强迫其让出调度器。这里,使用rt_thread_yield(); 也可让出调度器。#include rt_thread_t tid1 =原创 2013-02-18 11:06:51 · 1675 阅读 · 0 评论 -
[RTT例程练习] 1.4 线程优先级抢占
RTT 是抢占式的RTOS,高优先级的线程会先执行。这个例程显示了是如何抢占的。解释我懒得写了,下面这段来自官网论坛:因为更高的优先级,thread1率先得到执行,随后它调用延时,时间为3个系统tick,于是thread2得到执行。可以从打印结果中发现一个规律,在第一次thread2了打印两次thread1会打印一次之后,接下来的话thread2每打印三次thread1会打印一次。原创 2013-02-18 11:20:57 · 1803 阅读 · 0 评论 -
[RTT例程练习] 1.5 优先级相同线程轮转调度
之前说过,相同优先级的线程,在自己的时间片用光之后,会被剥夺调度器,让给同优先级的其他线程。程序:#include static struct rt_thread thread1;static struct rt_thread thread2;static char thread1_stack[512];static char thread2_stack[512];//s原创 2013-02-18 11:27:06 · 1401 阅读 · 0 评论 -
[RTT例程练习] 1.7 优先级翻转之优先级继承
RTT 的mutex 实现了优先级继承算法,可用其来解决优先级反转的问题。还是来自官网:thread2和worker线程虽然优先级比thread1要高,但是这两个线程均在进程开始出就执行了延时函数,于是轮到 thread1 执行,然后 thread1获得互斥量,thread2延时结束后,虽然它的优先级高于thread1,但是它所需的互斥量被thread1占有了,它无法获得所需的互斥量以便继原创 2013-02-18 11:44:58 · 1815 阅读 · 0 评论 -
[RTT例程练习] 2.1 问题引入 线程抢占导致的临界区问题
这一小节是只是一个演示问题的实验。在编程中,时常会碰到全局变量,程序在不同的地方都可以对全局变量进行修改,引起很大的麻烦。在RTOS中,尤其如此。因为不同的线程都有可能修改一个全局变量,而修改的顺序确实由调度决定的,不能通过人力决定。当然,这个问题不是只限于全局变量。例如两个线程都可以通过串口向终端打印信息。如果没有一种控制机制,两个线程打印的信息就会交织在一起。下面这段程序只是演示了原创 2013-02-25 21:01:30 · 1167 阅读 · 0 评论 -
[RTT例程练习] 2.2 信号量之基本使用(动态/静态信号量)
信号量的解释:来自百度百科:信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。RT-Thread 的信号量有静态和动态,这里同线程的静态和动态是一个意思。对信号量有两种操作,take 和 release。程原创 2013-02-25 21:20:33 · 3246 阅读 · 0 评论 -
[RTT例程练习] 2.3 信号量-检测按键(同步) -(信号量互斥)
这里,使用信号量来同步两个线程。简单来说,线程每隔一定的时间扫描按键。一旦其检测到有效的按键,便release 信号量,使得线程2 从挂起进入 运行态,向串口打印按键信息。这样,便实现了两个线程的同步。程序:#include #include "stm32f10x.h"#define KEY_PORT GPIOB#define KEY_PIN (GPIO_P原创 2013-02-25 21:31:41 · 2448 阅读 · 0 评论 -
[RTT例程练习] 2.6 互斥锁 mutex
互斥锁是一种保护共享资源的方法。当一个线程拥有互斥锁的时候,另一个线程若是等待锁,则其就会被挂起,从而保证只有一个线程会操作共享数据。这里的例子同样有静态锁和动态锁,其差别同之前一样,仅仅是创建和删除的方式不同。例子中,线程2 一开始拥有锁,因为线程2的优先级高。而后线程1一开始采用等待10个tick的方式,所以线程1等锁的时候一定会超时。最后线程2 等1秒之后释放锁,然后这时线程1再次试原创 2013-03-11 21:52:46 · 3081 阅读 · 0 评论 -
[RTT例程练习] 1.6 线程优先级反转原理
优先级反转是不希望出现的现象。简单来说,有三个线程A, B, C, 优先级A>B>C,A和C有共享资源S。A.B挂起,C运行且有S,A没有S所以一直挂起,B进入调度,调度完之后C再运行直到释放S之后,A才能运行。可以看出,A虽然优先级最高,但实际运行却是最后一个运行,其实际的优先级反转了。下面这段来自官网:三个线程的优先级顺序是 thread2 > worker > threa原创 2013-02-18 11:37:07 · 1443 阅读 · 0 评论 -
[RTT例程练习] 2.8 消息队列message queue
消息队列(来自百度百科)消息队列就是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息。消息队列是随内核持续的。描述程序运行的过程。首先创建了三个线程,三个线程处于同一优先级,但由于thread1首先被启动,所以它先运行,thread2,3紧随其原创 2013-03-29 10:35:00 · 2817 阅读 · 0 评论 -
RT-Thread 源码分析 总目录
1. 内存管理12. 内存管理23. 内核对象管理原创 2013-03-11 22:08:12 · 1465 阅读 · 0 评论
分享