导航:首页 > 源码编译 > rtthread源码结构

rtthread源码结构

发布时间:2022-06-07 03:12:09

1. RT-Thread RTOS的关于RT-Thread的背景和成长

记录下RT-Thread0.3.x的成长
先解释几个常见问题:
1. RT-Thread从哪里而来?
RT-Thread RTOS,Kernel部分完成于2006年上半年,创始人源于国内一老牌RTOS:DOOLOO RTOS,甚至是BSP 一些结构都源于DOOLOO RTOS。但与DOOLOO RTOS明显不同的是,Kernel完全重新编写,突出的是实时性和小而灵活,并且引入了内核 的对象模型以摒弃内核对象的与动态内存管理器无关化。
2. RT-Thread用于商业产品&工程,版权如何界定?
RT-Thread RTOS内核部分完全由我们编写,无其他版权问题,可以放心在商业产品 & 工程中使用。对于把RT-Thread使用于商业产品中,我们承诺永久不收费(使用人拥有使用权,使用用途责任请自行承担)。另外有两点需要注意:
- RT-Thread RTOS代码原始版权属于RT-Thread所有。
- 在商业产品 & 工程中使用RT-Thread RTOS,请在产品说明书上明确说明使用了RT-Thread,如有串口输出,请在系统启动显示RT-Thread的版本信息。如使用了RT-Thread RTGUI,请保留RT-Thread LOGO。
3. RT-Thread RTOS由谁开发,由谁维护?
目前RT-Thread RTOS由国内RT-Thread工作室开发及维护
4. RT-Thread RTOS是否已经在产品中使用?稳定度 & BUG情况如何?
目前已经有数家公司使用RT-Thread RTOS做为他们的系统平台,在上面进行产品开发,稳定性表现不错。
就如同没有100%的完美事物一样,BUG是存在的,反馈上来我们会努力尽快修正。
5. 我能加入到RT-Thread的开发者队伍中吗?
能!
我们欢迎任何对RTOS感兴趣的人,不管你是学生或资深嵌入式系统开发工程师。RT-Thread的开发人员通常依赖于论坛、邮件、GTalk进行联系交流,由于目前上海的开发人员比较多一些,所以会不定期的在上海举行开发者聚会。
6. RT-Thread依靠什么持续发展下去,能够盈利吗?
目前RT-Thread的发展主要依赖于大家的兴趣爱好,大多数都是在业余时间进行开发的。以后会通过技术支持、组件定制、组件开发、辅助工具等 方式进行盈利。从几大开源软件来看,商业支持是软件持续发展不可或缺的一部分,所以我们希望能够有更多的公司选择RT-Thread RTOS做为系统平 台,这个对于公司、对于整个RT-Thread社区都是双赢的局面。对于公司,能够获得免费的RTOS套件,同时也能够推动着这个RTOS套件不断的朝着 稳定的方向发展。对于我们,有公司支持的发展无疑会令RT-Thread的发展更上一层楼,当然也意味着以后的支持费用有着落啦。
=========
问题完了,开始进入0.3.x系列的主题。在对外发布上,相信大家已经看到了,RT-Thread已经进入了0.3.x的密集发布周期。RT- Thread/STM32F103VB已经发布了0.3.0系列的3个beta版本,RT-Thread/STM32F103ZE已经发布了0.3.0系 列的2个beta版本,RT-Thread/LPC2148已经发布了一个0.3.0系列的beta版本。接下来会考虑发布RT-Thread/LM3S 的第一个beta版本(汗一个,刚发过了的板子有些硬件问题,返修了)...
这些版本,大多数上会包含:Kernel + FinSH shell + Filesystem + LwIP等。
0.3.0系列,RT-Thread还包括两大内容:
- 编程指南文档
- RTGUI图形界面系统
编程指南一直在修订,比较遗憾文笔有限,所以文档还请大家不要太挑剔,有什么建议欢迎大家提出来。关于编程指南,还要提一句的是,这份文档是一份 编程的指南,在RT-Thread上编程需要考虑的地方都会提出来。但是,它并不是一份代码分析的文档,虽然它可能会提到内部的一些大致结构框架,但它不 会对代码进行一行行分析,所以请大家多多注意。
另外的RTGUI组件,会是以后的重点任务,目前的打算是在现有的STM32F103ZE开发板上实现一套可用的手持终端设备,当然也依然延续 RT-Thread的习惯,这套东西会以开源的形式释放出来。在s3c2410/2440上,这套GUI表现得是相当不错的,面向对象的设计,独立的控件 对象模型,留给了用户最大的可扩展性。
其他的,caoxulong的x86分支在整理完毕后也会放到0.3.0这个分支上来,通过这个分支大家可以完全摒弃开发板,在PC或 VMWare/QEMU上体验RT-Thread。LPC系列分支,苦于目前开发板不足,所以进展慢一些,上次发布的RT-Thread /LPC2148 0.3.0 beta1也只能包含SD卡、以太网口驱动框架,这个系列会把 wyoujtg/风城少主 的LPC2106的移植合并进 来。
文件系统这块现在代码已经发布出来了,其实里面还包括另外一个分支的:DFS-FAT,这个分支就如同DFS一样,是我们自己编写的,也能够支持NandFlash等介质上的坏块管理,写了很多个测试例子在测,等通过压力测试后会取代目前的DFS-EFSL发布出来。

2. RT-Thread RTOS的RT-Thread / uCOS / FreeRTOS 简单比较

1 、任务管理及调度:
RT-Thread - 32/256可选优先级抢占式调度,线程数不限,相同优先级线程时间片轮转调度;支持动态创建/销毁线程。
uCOS - 256优先级抢占式调度,不允许相同优先级任务存在
2、 同步/通信机制:
RT-Thread - 支持semaphore, mutex, mailbox, message queue, event。mailbox可存储多条消息,任务等待可按优先级进行排队。
uCOS -semaphore,mutex, mailbox, message queue, event。mailbox只能存放1条消息
3、内存管理:
RT-Thread -固定分区内存管理,小内存系统动态内存管理,大内存系统SLAB内存管理
uCOS - 固定大小内存块管理
4、定时器:
RT-Thread - 挂接到系统OS定时器的硬定时器
uCOS - 只能使用OSTimeDly进行时间间隔处理
5、中断嵌套:
RT-Thread - 允许
uCOS - 允许
6、源码许可证:
RT-Thread - 遵循GPLv2+许可证。可用于商业产品(只需要注明使用了RT-Thread)
uCOS - 商业收费

3. 介绍几种主流嵌入式操作系统的特点,并分析比较 哥们,我现在纠结这个问题,可以给点指点吗

如果你是学习阶段的话,那linux和UCOS-II是比较合适的
uc/os和uclinux操作系统是两种性能优良源码公开且被广泛应用的的免费嵌入式操作系统,可以作为研究实时操作系统和非实时操作系统的典范。本文通过对 uc/os和uclinux的对比,分析和总结了嵌入式操作系统应用中的若干重要问题,归纳了嵌入式系统开发中操作系统的选型依据。
两种开源嵌入式操作系统介绍
uc/os和uclinux操作系统,是当前得到广泛应用的两种免费且公开源码的嵌入式操作系统。uc/os适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2k。uclinux则是继承标准linux 的优良特性,针对嵌入式处理器的特点设计的一种操作系统,具有内嵌网络协议、支持多种文件系统,开发者可利用标准linux先验知识等优势。其编译后目标文件可控制在几百k量级。
uc/os是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。
uclinux是一种优秀的嵌入式linux版本。uclinux是micro-conrol-linux的缩写。同标准linux相比,它集成了标准linux操作系统的稳定性、强大网络功能和出色的文件系统等主要优点。但是由于没有mmu(内存管理单元),其多任务的实现需要一定技巧。
两种嵌入式操作系统主要性能比较
嵌入式操作系统是嵌入式系统软硬件资源的控制中心,它以尽量合理的有效方法组织多个用户共享嵌入式系统的各种资源。其中用户指的是系统程序之上的所有软件。所谓合理有效的方法,指的就是操作系统如何协调并充分利用硬件资源来实现多任务。复杂的操作系统都支持文件系统,方便组织文件并易于对其规范化操作。
嵌入式操作系统还有一个特点就是针对不同的平台,系统不是直接可用的,一般需要经过针对专门平台的移植操作系统才能正常工作。进程调度、文件系统支持和系统移植是在嵌入式操作系统实际应用中最常见的问题,下文就从这几个角度入手对uc/os和uclinux进行分析比较。
进程调度
任务调度主要是协调任务对计算机系统内资源(如内存、i/o设备、cpu)的争夺使用。进程调度又称为cpu调度,其根本任务是按照某种原则为处于就绪状态的进程分配cpu。由于嵌入式系统中内存和i/o设备一般都和cpu同时归属于某进程,所以任务调度和进程调度概念相近,很多场合不加区分,下文中提到的任务其实就是进程的概念。
进程调度可分为"剥夺型调度"和"非剥夺型调度"两种基本方式。所谓"非剥夺型调度"是指:一旦某个进程被调度执行,则该进程一直执行下去直至该进程结束,或由于某种原因自行放弃cpu进入等待状态,才将cpu重新分配给其他进程。所谓"剥夺型调度"是指:一旦就绪状态中出现优先权更高的进程,或者运行的进程已用满了规定的时间片时,便立即剥夺当前进程的运行(将其放回就绪状态),把cpu分配给其他进程
作为实时操作系统,uc/os是采用的可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。uc/os中最多可以支持64 个任务,分别对应优先级0~63,
其中0为最高优先级。调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。
其最高优先级任务的寻找是通过建立就绪任务表来实现的。uc/os中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块tcb(task control block)数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量 ostcbhighrdy记录当前最高级就绪任务的tcb地址,然后调用os_task_sw() 函数来进行任务切换。
uclinux的进程调度沿用了linux的传统,系统每隔一定时间挂起进程,同时系统产生快速和周期性的时钟计时中断,并通过调度函数(定时器处理函数)决定进程什么时候拥有它的时间片。然后进行相关进程切换,这是通过父进程调用fork 函数生成子进程来实现的。
uclinux系统fork调用完成后,要么子进程代替父进程执行(此时父进程已经 sleep),直到子进程调用exit退出;要么调用exec执行一个新的进程,这个时候产生可执行文件的加载,即使这个进程只是父进程的拷贝,这个过程也不可避免。当子进程执行exit或exec后,子进程使用wakeup把父进程唤醒,使父进程继续往下执行。
uclinux由于没有mmu管理存储器,其对内存的访问是直接的,所有程序中访问的地址都是实际的物理地址。操作系统队内存空间没有保护,各个进程实际上共享一个运行空间。这就需要实现多进程时进行数据保护,也导致了用户程序使用的空间可能占用到系统内核空间,这些问题在编程时都需要多加注意,否则容易导致系统崩溃。
由上述分析可以得知,uc/os内核是针对实时系统的要求设计实现的,相对简单,可以满足较高的实时性要求。而uclinux则在结构上继承了标准linux的多任务实现方式,仅针对嵌入式处理器特点进行改良。其要实现实时性效果则需要使系统在实时内核的控制下运行,rt-linux就是可以实现这一个功能的一种实时内核。
文件系统
所谓文件系统是指负责存取和管理文件信息的机构,也可以说是负责文件的建立、撤销、组织、读写、修改、复制及对文件管理所需要的资源(如目录表、存储介质等)实施管理的软件部分。
uc/os是面向中小型嵌入式系统的,如果包含全部功能(信号量、消息邮箱、消息队列及相关函数),编译后的uc/os内核仅有6~10kb,所以系统本身并没有对文件系统的支持。但是uc/os具有良好的扩展性能,如果需要的话也可自行加入文件系统的内容。
uclinux则是继承了linux完善的文件系统性能。其采用的是romfs文件系统,这种文件系统相对于一般的ext2文件系统要求更少的空间。空间的节约来自于两个方面,首先内核支持romfs文件系统比支持ext2文件系统需要更少的代码,其次romfs文件系统相对简单,在建立文件系统超级块(superblock)需要更少的存储空间。romfs文件系统不支持动态擦写保存,对于系统需要动态保存的数据采用虚拟ram盘的方法进行处理(ram盘将采用ext2文件系统)。
uclinux还继承了linux网络操作系统的优势,可以很方便的支持网络文件系统且内嵌tcp/ip协议,这为uclinux开发网络接入设备提供了便利。
由两种操作系统对文件系统的支持可知,在复杂的需要较多文件处理的嵌入式系统中uclinux是一个不错的选择。而uc/os则主要适合一些控制系统。
操作系统的移植
嵌入式操作系统移植的目的是指使操作系统能在某个微处理器或微控制器上运行。uc/os和uclinux都是源码公开的操作系统,且其结构化设计便于把与处理器相关的部分分离出来,所以被移植到新的处理器上是可能的。
以下对两种系统的移植分别予以说明。
(1)uc/os的移植
要移植uc/os,目标处理器必须满足以下要求;
·处理器的c编译器能产生可重入代码,且用c语言就可以打开和关闭中断;
·处理器支持中断,并能产生定时中断;
·处理器支持足够的ram(几k字节),作为多任务环境下的任务堆栈;
·处理器有将堆栈指针和其他cpu寄存器读出和存储到堆栈或内存中的指令。
在理解了处理器和c编译器的技术细节后,uc/os的移植只需要修改与处理器相关的代码就可以了。
具体有如下内容:
·os_cpu.h中需要设置一个常量来标识堆栈增长方向;
·os_cpu.h中需要声明几个用于开关中断和任务切换的宏;
·os_cpu.h中需要针对具体处理器的字长重新定义一系列数据类型;
·os_cpu_a.asm需要改写4个汇编语言的函数;
·os_cpu_c.c需要用c语言编写6个简单函数;
·修改主头文件include.h,将上面的三个文件和其他自己的头文件加入。
(2)uclinux的移植
由于uclinux其实是linux针对嵌入式系统的一种改良,其结构比较复杂,相对 uc/os,uclinux的移植也复杂得多。一般而言要移植uclinux,目标处理器除了应满足上述uc/os应满足的条件外,还需要具有足够容量(几百k字节以上)外部rom和ram。
uclinux的移植大致可以分为3个层次:
·结构层次的移植,如果待移植处理器的结构不同于任何已经支持的处理器结构,则需要修改linux/arch目录下相关处理器结构的文件。虽然uclinux内核代码的大部分是独立于处理器和其体系结构的,但是其最低级的代码也是特定于各个系统的。这主要表现在它们的中断处理上下文、内存映射的维护、任务上下文和初始化过程都是独特的。这些例行程序位于linux/arch/目录下。由于linux所支持体系结构的种类繁多,所以对一个新型的体系,其低级例程可以模仿与其相似的体系例程编写。
·平台层次的移植,如果待移植处理器是某种uclinux已支持体系的分支处理器,则需要在相关体系结构目录下建立相应目录并编写相应代码。如mc68ez328就是基于无mmu的m68k内核的。此时的移植需要创建 linux/arch/m68knommu/platform/ mc68ez328目录并在其下编写跟踪程序(实现用户程序到内核函数的接口等功能)、中断控制调度程序和向量初始化程序等。
·板级移植,如果你所用处理器已被uclinux支持的话,就只需要板级移植了。板级移植需要在linux/arch/?platform/中建立一个相应板的目录,再在其中建立相应的启动代码crt0_rom.s或crt0_ram.s和链接描述文档rom.ld或ram.ld就可以了。板级移植还包括驱动程序的编写和环境变量设置等内容。
结语
通过对uc/os和uclinux的比较,可以看出这两种操作系统在应用方面各有优劣。 uc/os占用空间少,执行效率高,实时性能优良,且针对新处理器的移植相对简单。uclinux则占用空间相对较大,实时性能一般,针对新处理器的移植相对复杂。但是,uclinux具有对多种文件系统的支持能力、内嵌了tcp/ip协议,可以借鉴linux丰富的资源,对一些复杂的应用,uclinux具有相当优势。例如cisco 公司的 2500/3000/4000 路由器就是基于uclinux操作系统开发的。总之,操作系统的选择是由嵌入式系统的需求决定的。简单的说就是,小型控制系统可充分利用uc/os小巧且实时性强的优势,如果开发pda和互联网连接终端等较为复杂的系统则uclinux是不错的选择。

还有就是如果从开发的工具方便好用,易用的角度来看,那些收费的系统用起来更爽一些

4. 有关rt-thread的编程语言,请大神指教~

我觉得有两种可能:
1. 存放结构体内容的空间的首字节地址
2. 结构体的各成员均有各自的地址,这些地址是放在一块连续的内存中,结构体的指针存放的是这块连续的内存的首字节地址。
其实吧,对于这个结构体指针里面的具体内容不是那么重要,只要了解这种指针怎么用就行了,希望采纳

5. RT-Thread RTOS的RT-Thread 开发者自述

1、诞生
一切东西还得从头谈起。RT-Thread RTOS,Kernel部分完成于2006年上半年,其IPC部分甚至是年中时才具备相应的雏形。最开始时是因为要为朋友做一个小型的手持设备,而我本人起初又是另一国内老牌RTOS:DOOLOO RTOS开发人员,但这个团队在2005年底已经解散。但朋友的系统要上,用ucos吗,一不熟悉,二看不上。答应朋友的事,总得有解决方法吧,即使是原来的DOOLOO RTOS,因为其仿VxWorks结构,导致它的核心太大,包括太多不必要的东西(一套完整的libc库),这些方案都否决了。怎么办?当时朋友那边也不算太急,先自己写一套内核吧。这个就是源头!(后来虽然朋友的项目夭折了,但这套OS则保留下来了,并开源了,万幸)当然RT-Thread和原来的DOOLOO RTOS差别还是很大的。DOOLOO RTOS是一种类VxWorks风格的,而RT-Thread则是一种类NucluesPlus风格的,小型、实时、可剪裁。这三个方面RT-Thread可以骄傲的说做得比DOOLOO RTOS都要好很多,小型:RT-Thread核心能够小到4K ROM,1K RAM;实时:线程调度核心是完全bitmap方式,计算时间是完全固定的;可剪裁性,配置文件rtconfig.h包含多种选项,对Kernel细节进行精细调整,对各种组件(文件系统,使用EFSL、ELM FatFs;网络协议栈,finsh shell)进行可选配置。2、艰难的发展期在第一个公开板发布后(0.1),RT-Thread意识到了一个问题,光有核心不行。别人如何使用:虽然采用了doxygen风格的注释,并自动产生相应的API文档,但能够使用的人寥寥,有这个功底的人不见得认可你的系统,没相应功底的人也玩不转你的系统。所以下一个系列,考虑如何让系统能够支持更多的平台。首选ARM,为什么?应为ARM正处于发展的前期,使用的人也广泛,而RT-Thread第一个支持的平台就是s3c4510,这个是lumit开源项目赠送的平台。在其后,支持了包括s3c44b0,AT91SAM7S64,AT91SAM7X256,s3c2410,AT91SAM9200,coldfire,x86等一系列平台,编译器统一使用GCC,这个时期无疑是最艰难的时期(真的艰难吗?呵呵,但肯定是迷茫的),这个就是0.2.0、0.2.1、0.2.3、0.2.4版本等,不同的版本支持不同的平台。猜猜我这段时间是干什么工作的?不知道大家对这个领域是否熟悉,手机2G,3G协议栈开发。每天都和协议栈打交道,而且最痛苦的是上千页的25.331 RRC协议,都是英文的,所以RT-Thread算做是工作之外的苦中作乐吧。而也正是这个时候,shaolin同学出现了,帮助完成了RT-Thread/x86的移植,他当时还是学生。这其中还有一件郁闷的事,当时RT-Thread团队还有几个人,只不过主要是shaolin和我。当0.2.3发布时,我建议开始微内核的道路,嗯,可能很多人还比较困惑,RT-Thread后面跟着的为什么是“启动下一代RTOS演化”,当时就是因它而感慨:把微内核引入进来,把内核态和用户态分开来,并且建立一个类似于L4的微内核。当然最重要的是,其中有一个强实时核心。而且L4实际上是把页表操作放到内核之外的,如果内核是一个强实时内核将对整个系统的实时性提升很大,而因为微内核的缘故,也能够运行linux的应用程序,并且当时RT-Thread也提出了一种,线程即IPC的概念。。。只是,最后的提案被大家否决了。团队开始有数人,只是能够坚持的没几个。3、一年增加0.0.1本人很早就接触了Linux,算是国内资深的Linux接触者(早期也算一个Linux开发人员吧),KDE 1.0几乎是看着发展起来的(大家有谁用过RedHat 5.1?)。个人算是很多方面有一些自由软件的习惯:软件的版本号是非常重要的一个标志,宁愿增加一个细微的版本号也不轻易的增加一个大的版本号,因为大的版本号是需要对用户负责的。1.0版本更代表了系统的稳定性,健全性。例如mplayer到1.0版本就经历众多小版本,0.99的beta版本亦无数。RT-Thread也把这点体现得淋漓尽致,0.2.2到0.2.3一个版本的增加,整整花了一年多的时间。但这个小版本号的增加,却带来了开源社区嵌入式环境中最完善的TCP/IP协议栈:LwIP。当然,开始时并不算稳定。在这几个版本中,RT-Thread也终于从迷茫中走出来,RT-Thread需要自己的特色,一个单独的RTOS Kernel没太大的用处,因为你并没有上层应用代码的积累,并且一些基础组件也非常重要,有这些基础组件基本上意味着,在这个平台上写代码,这些代码就是你的,甚至是你哪天也可以把它放到另外一个硬件平台上运行。同样,0.2到0.3版本号的变更,花费的时间会更长^-^ 版本号的长短,是和计划的feature实现是密切相关的,没到设定的目标如何可能进行发布呢?4、Cortex-M3的变革RT-Thread的变革因为Cortex-M3而来,因为ST的STM32使用的人太广了,当然还有非常重要的一点。RT-Thread已经开始支持Keil MDK,armcc了。GNU GCC确实好,并且也由衷的推崇它,使用它,只是调试确实麻烦,阻碍了更多人使用它(ARM平台上)。当RT-Thread + Cortex-M3 + Keil MDK碰撞在一起的时候,火花因它而生,越来越多人使用RT-Thread了,当然这和RT-Thread厚积薄发是离不开的,因为这个时候,RT-Thread已经有一个稳定的内核,shell方式的调试利器finsh,DFS虚拟设备文件系统,以及LwIP协议栈。而RT-Thread/GUI则在密集的移植到CM3上,RT-Thread/GUI成型于2008年底,但为了Cortex-M3分支,这个组件停下来很多,但这种停留是值得的。另外就是特别感谢UET赠送的STM32开发板了,RT-Thread/STM32的分支都是在UET赠送的STM32开发板上验证的。5、RT-Thread为什么是对象化的设计方法可能这个话题太偏技术化了,说说其他,呵呵。面向对象编程有它的好处,例如继承。可以让具备相同父类的子类共享使用父类的方法,基本可以说是不用写代码就凭空多出了很多函数,何乐而不为呢。另外,对象的好处在于封装。当一个对象封装好了以后,并测试完成后,基本上就代表这个类是健全的,从这个类派生的子类不需要过多考虑父类的不稳定性。这里着重提提另外一个人,我工作后的第三年,曾向当时的同事也是好友,L.Huray学习面向对象的实时设计方法:Octpus II。深刻体会到了面向对象设计的好处(需求分析,体系结构设计,子系统分析,子系统设计,测试,实时性分析),但鉴于嵌入式系统中C++的不确定性,所以个人更偏向于使用C来实现。所以,L.Huray算是我的老师了,一直希望能够有时间把他老人家的思想更进一步的发扬光大,希望以后有这个机会。(Octpus I最初起源于Nokia,然后由M.Award, L.Huray发展成Octpus II,现在几乎见不到踪影了,唉)。
(作者原文:实时线程操作系统(RT-Thread)4年开发历程 乐与苦)

6. 嵌入式RT-thread中初始化线程函数中(void *)entry的意义何在,为什么要使用(void*)

因为这里是一个变量赋值,entry是一个裸指针,定义应该就是 void *
而函数传入的参数是void (*entry)(),这是一个函数指针,因此在赋值的时候需要强行转化一下。

7. 怎样学习RT-Thread,感觉看起来一知半解,有什么推荐的学习方法

学习方法 为了取得较好的学习效果,您需要不时地问自己:“这是什么?”“为什么会这样?”“它是怎样来的?”“它还会有什么变化?”“引申发展后会成什么样子?”“还有什么和它紧密联系,互为因果或共同作用?”“它在专业知识体系中的地位”……最为重要的是,您要问自己,“它对我有什么用,我该如何用它,可能会有什么结果?” 学就是为了用。如果连它是什么都不知道,怎么会用呢,怎么可能用得更好?就比如用电脑,编程高手学什么软件都要比一般人要快。兴趣是最好的老师,这是因为兴趣能驱动人去以不同的方式积极应用。人能够从应用中发现自己的不足,并及时地把缺陷补上。为了用而学,往往能够提高学习的积极性。 同时,学不仅仅是为了用。用往往是操作技术,是问题解决的具体方法。如果仅仅只会用,停留在具体的应用上,他可能是模仿来的,不可能有创造。他的适应能力也很差。我喜欢用系统学习法的理论基础来解释这一现象。世界是变化的。不单是自然环境起着变化,社会环境也在快速地转变。动态的问题需要以动态的方法加以解决。如果一个人不能够将自己的所学体系化,提纯出来,以新的、独特的、满足自身和环境资源需要的、更有效的方式去组织这些知识,他所学到的,永远都只是过去,他的操作技术,也只是针对过去,而不是将来。他很可能被历史淘汰。即使能够因为社会因素能够在价值链中生存,他的位置也只会越来越低,对于整个社会而言价值越来越小。 我一直强调学习方法的提炼和升级。一方面,某些科学的学习方法是可以通过学习和强化训练得来。知识是多方面、多层次、多结构的。学习方法总结出来也是一种可以传授的知识。另一方面,学习方法必须经过实践感受和思考,与人的个性相结合,做好度的把握。那些看了交通规则,听了驾驶课的人还是跑不好山路的。那更多的是一种感觉和发挥。学习和做其他事情没什么太大的区别,都重在体验。仅仅是沉迷于课本是学不好的。 人必须明确自己想学的是什么,明确自己想要的是什么。人的努力,其实都是为了达到这些目标创造条件。知识的积累不过是创造条件的一种有效方法。通过不断地提高效率,提高行为的有效性,合理定位,降低失败的风险等等途径来充实和完善自身。 我还强调的是自信。信心能够让人坚持。我一直都让咨询者别迷信智商等理论。人可以通过不断超越自我获得成功,获得自我实现的巅峰体验。我以自身的经历证明了先天的聪明在一个人的成长过程中并不重要。后天因素决定成功。 我常对咨询者说,没有自觉,没有信心,那么什么学习方法都没有用。 只有自觉,才能够用心。特别是在强化学习的过程中,那种高强度的活跃脑细胞的运动,离开了自觉,只可能什么效果都没有。 信心才能够坚持,才可以突破自己在长久的迷失中形成的心理障碍,比如学习恐惧,缺乏耐心等等。 我们需要以不断的小的成功来积累信心。 如何减轻学习的惰性 在不少人身上,我们都可以明显地看到学习的惰性。 最常见的是: 1、学得不好的人。他们对学习有着抵触情绪甚至逃避。 2、工作以后的人。他们往往缺乏学习的韧性。 3、年龄大的人。记忆力,以及对新事物的接受能力下降,学习的难度大大增加。精力不足。看看书就累了,想睡觉。 成人教育中,学习惰性是最值得一提的。 学习惰性产生的原因很多。主要是: 1、畏难情绪。这仅仅是心理作用。还没有开始学,就因为听说它难,而开始产生消极情绪。 2、缺乏信心。这在学习挫折以后很明显。 3、枯燥。学习是多种多样的,学习过程也是丰富多彩的,但是这不意味着某些东西学习的枯燥,特别是一般的学校教育。 4、过于抽象。与实际生活的联系太少。 5、语言障碍。特别是留学人士。毕竟不是母语,在学习起来难度很大。 6、基础知识障碍。基础知识准备得不足,太多地方看不懂的时候,谈学习动力是没有必要的了。 7、分心。考虑其他的事情太多。可供的选择太多,妨碍了有效的学习。 但是,我们不能不学习。特别是在一些并不是能够直接见效的知识的学习中。 让我们分析一下传统的减轻学习惰性的处理方法。 1、毅力。以自制力作为减轻学习惰性的手段是不可取的。原因很简单。勉强自己只会活得很累,很痛苦。是否能真地坚持下去,对于一般人来说是一个很重要的问题。人都是趋利避害的。这是天性。许多父母抱怨孩子缺乏自制力那其实是对孩子有着不切实际的要求。一些人对自己的毅力也产生怀疑。许多学习相当优秀的大学生在向我咨询时也很多都提到自己的自制力不够。长期的负情绪会摧毁任何人的毅力。 2、利弊分析。谁都知道学好了的好处。哪怕再差的学生也一样有着学好的渴望。因为学习成绩好的好处太多了。有社会认可,甚至能得到丰厚的物质奖励。因此,以学好了的前景来教育孩子,或者教育自己是没有用的。 3、加强监督。学习本来就是个人的事情。如果学习也必须让别人来看管的话,那么还不如不学,或者改变学习的方法、学习的内容和学习的模式。 推荐方案: 1、项目法。 设定项目。以项目的完成促进学习。以实际的运用来促进知识的学习。我在大学学习应用统计的时候就为自己设定了跟踪、分析国际棉花价格的项目。等项目弄玩,统计以及相关课程也已经自学完。这样的效率很高。 再以林凡顺的德语学习为例子。林凡顺在31岁以后才开始学德语。他的困难和压力是相当大的。最大的问题是,他捧着一本词汇书或语法书,看不上十分钟就疲倦欲睡。即使他很深刻地体会系统学习法,也难以取得进展。因此,在工作忙的时候,往往没时间就成为逃避学习的借口。但是他要留学德国,计划中也要将业务拓展到德国,与德国企业建立双赢的联系。德语学不好是社会交往中最大的障碍。 他到了德国之后,开始设定项目。比较了一下,他从词汇入手,决定编写德语词典(请参考Fundset Deutsch2Chinese(S) 词典 自述文件)。编写词典不等于就能清楚记得那些词汇,但是,经过了打字、整理、翻译以后,印象比简单地看看书要深刻得多。他的要求也不高,只是留下印象而已,以后在看到时能有多多少少的感觉。这就是系统学习法的模糊学习。由于他要发布的是免费的词库文件,他的工作得到了鼓励与支持。词库文件一天一天的增大也让他有了动力和信心。在词库达到他设定的第一阶段目标(6000词汇量)以后,他开始转向语法的学习。这时的项目是编写语法辞典。在为别人造福的同时,自己也得到很大的提高。 2、内容分解法。 将学习的内容化整为零,只需要学一点东西,那么就会因为学得容易而消除了畏难情绪和消极对抗的心理障碍。对发展需求的适当梳理能够增强信心。 3、合理情绪法。 不要对自己的自制力和毅力有太高的要求。人都是有惰性的。你的学习困难别人一样会遇到。但你的选择不是退缩,也不是逃避,而是正视它。尝试着改变学习的方式和方法,找出一个最舒服、最让自己开心的学习途径来。 4、背水一战法。 在优越的环境,有时反倒不容易学进去。不如到花园、或室外安静的地方学习。靠无可靠,趴无可趴,躺无可躺。这样学习效率也会高不少。 为什么速成学习也是科学的 很多人都说,学习没有捷径,必须认认真真、扎扎实实地学。 这话对,也不完全对。学习需要的是积累,是温故而知新。再好的学习方法,如果不去学、不去记,不加以认真思考,也都没有用。 就以系统学习法为例,真正做好树状结构和网状联系,不经过长期的有目的的努力是不行的。 但这不等于排斥速成学习。系统学习法也可以速成,那就是建立知识体系的大致构架,提出一些基本的关系的联系。以这些学习成果参加考试,要获得60-80分并不是难事。 分析每一种速成法,都可以看到,他们是把学习的难度降低。只有不对人、不对自己过高要求,才可能有信心、有兴趣坚持。坚持往往才会成功。 大目标分解成小目标是一个很好的做法。每天尝到甜头,每天都用适当的成效鼓励自己,每天都满意于努力和付出,这样就能够坚持。有计划的坚持就是积累。 人应该有大的目标。大目标是对自我的挑战,最能够满足人的发展需求,最让人有自我实现的渴望。 人需要挑战,回避挑战往往让人感觉不到生活的趣味,也渐渐失去应有的动力和紧张。所以,我在学习的时候,总是朝最难的地方进军。我认为,最难的地方都闯过了,其他的没有理由闯不过去,剩下的只是时间、精力和积极的坚持和积累。 以快速将知识压入潜意识。 哪怕遗忘,也无所谓。总有熟悉和不熟悉的感受。 有时候就不需要记忆,只需要感觉。 集中注意 快速组织所学内容 及时回忆和复习 优胜心态和逃避心态 近来,由于研究“家庭与儿童心理健康”大量接触了很多初高中学生,在感觉到他们的聪明的同时也发现他们的意志、毅力、目标和动力的缺失。这是信息爆炸与社会浮躁共同作用的结果,问题发生在孩子身上,但问题的原因可以追溯到家庭、学校与社会环境。 心态浮躁,很难积累和坚持。目标不明确,很难品尝到成功的喜悦。这些都可能导致放纵和迷失。 今天,在向一个亲戚的孩子辅导“系统学习法”的时候,我心里再次浮现这种强烈的感觉。以至于后来我觉得,对于这个孩子,现阶段学习方法并不是很重要,更重要的是学习的主动性、自觉性和学习的方向性。这首先是优胜心态。 优胜心态是指认为自己能够做得比别人好,现在能够比过去好、将来能够比现在好的心态。 首先是信心。要相信自己能够超越自己,能够面对并更好地解决现存的或即将到来的问题。 其次是主动性。在问题到来的时候,要能够主动地去认识它、了解它,摸索其中的关系。 再则是采取行动。将问题解决化解为具体的目标。 什么是高手 高手就是能够迅速有效地解决问题的人。 高手就是能够积极创新、突破的人。 也许有的人知识积累很多,但由于无法恰当表现,成不了高手。 这就是匠和大师的区别。 有的人学了很多武功,但是在比试中几乎次次失手,甚至打不过才学武不久的人。 这就是悟性和应变能力在实战更重要。 有的人也许是外行,但是他学习能力强,规划能力强,有有效的手段化复杂为简单,迅速切入、发展神速。 基础很重要。但基础是为了发展,纯粹的基础是没有意义的。就如没有盘活的存量资产远远没有快速流通的小资金有效一样。通过滚动发展,小企业可能会在几年内成为大企业。 要认可结果的重要。成王败寇。 就象比尔盖茨,哪怕大学没有毕业,在经营管理方面都胜过MBA人士,在市场竞争中屡屡获胜。这就是高手。 高手就是在难题面前,让别人不服都不行。 高手能够创造新境界。 系统记忆法 系统记忆法是系统学习法的重要组成部分。 系统记忆法要求人们把需要记忆的内容的关系层次弄清,尽可能地以更大的整体模块来记忆。最好还能够结合以前已经知道的内容,组合成有机单元来记忆。 记忆分为“记”和“忆”两个过程。 “记”是通过强化刺激,在大脑中留下痕迹。“记”是必要的阶段。 “忆”是把大脑里形成的刺激联结给取用出来。要改善记忆的效果,必须把更多的时间从“记”转到“忆”来。那主要是通过回忆、思考、联想、实际应用来熟悉并强化刺激联结。 “记”的过程 系统记忆法在“记”的过程中强调分类存储。相当于仓库,只有分类清晰,结构有序,才可能迅速地从中找到东西。 有序地“记”,将为“忆”提供了极大的便利。 先在心里构架一个体系树模型。空的。仅仅是一个结构。在开始的时候,可以以教材的目录、章节为节点,构架体系树。 在记忆的过程中,要学会找出知识点(记忆内容),通过分析、归纳,将知识点的特性,特别是与其他知识点或者外界联系发掘出来。 将知识点放在体系树上。相当于树的叶子、果实、花和嫩芽。可以根据知识点的特性,调整体系树结构。 可以根据感觉和推理,留出体系树的空缺部分。有些教材仅仅是一个方面的内容,适当的空缺就是和其他相关教材或学科的接口。 “忆”的过程 其实在结构体系树的时候需要运用的思考,就已经开始包含“忆”的成分了。只有“忆”,才可能取用其他知识点,与此知识点发生联系。结构树需要不时地回想,以扫描缺少的枝叶,再及时地集中精力,将遗失的枝叶重新挂到体系树上。 回想的过程就是“忆”的过程。要做到心中有“树”,就是“忆”的基础上的体系树。 “记”和“忆”的统一 增加刺激联结是记忆的诀窍。这也是系统学习法最有效的地方。 “记”和“忆”是两个不同的过程,但是他们不是孤立的,而必须交错行进。 根据“忆”的需要去补充“记”,将使“忆”更有效,也更完全。 体系树对于“忆”来说是相当重要的。从一系列刺激联结迅速找到想要的内容,这只有清晰的体系树才能做到。 就象收拾房子,如果大致分类,什么东西在什么地方,这就会给使用制造方便。否则,就算这物品(刺激联结)实际存在,也找不出来。不能使用,相当于没有。 人有遗忘的本能。如果刺激联结无序,很可能就作为无效信息,清理出大脑。记忆的效率将很低。 重温往往就是再记和再忆。 很多人在考试时总考不出自己的实际水平,拿不到理想的分数,究其原因,就是心理素质不过硬,考试时过于紧张的缘故,还有就是把考试的分数看得太重,所以才会导致考试失利,你要学会换一种方式来考虑问题,你要学会调整自己的心态,人们常说,考试考得三分是水平,七分是心理,过于地追求往往就会失去,就是这个缘故;不要把分数看得太重,即把考试当成一般的作业,理清自己的思路,认真对付每一道题,你就一定会考出好成绩的;你要学会超越自我,这句话的意思就是,心里不要总想着分数、总想着名次;只要我这次考试的成绩比我上一次考试的成绩有所提高,哪怕是只高一分,那我也是超越了自我;这也就是说,不与别人比成绩,就与自己比,这样你的心态就会平和许多,就会感到没有那么大的压力,学习与考试时就会感到轻松自如的;你试着按照这种方式来调整自己,你就会发现,在不经意中,你的成绩就会提高许多; 这就是我的经验之谈,妈妈教给我的道理,使我顺利地度过了中学阶段,也使我的成绩从高一班上的30多名到高三时就进入了年级的前10名,并且没有感到丝毫的压力,学得很轻松自如,你不妨也试一试,但愿我的经验能使你的压力有所减轻、成绩有所提高,那我也就感到欣慰了; 最祝你学习进步!

8. rt-thread建立两个线程,一个线程开灯,一个线程灭灯,怎么循环打印

rt-thread建立两个线程,一个线程开灯,一个线程灭灯,怎么循环打印。
1、wait方式是让当前持有锁的线程进入等待队列(不是阻塞队列),调用了wait方法后,当前线程就不会执行wait之后的代码逻辑了,所以notify方法必须在wait方法之前。
2、需要在循环结束后,加上notify,因为当其中一个线程正常执行完后,另一个线程一定还处于等待队列,所以最后需要被唤醒,如果不写,则虽然能正常打印出结果,但是程序不会结束。
3、要保证两个线程的开始顺序,因为thread.start方法,并不是先调用就一定是先调用的线程先执行,所以可以用countdownlatch来保证打印顺序的开始。

阅读全文

与rtthread源码结构相关的资料

热点内容
積架小型空气压缩机 浏览:553
绿盾文档加密系统哪里有卖 浏览:635
我的世界怎么开挂在服务器里面 浏览:787
西门子自锁正反转编程图 浏览:747
出国英语pdf 浏览:918
算法线性匹配 浏览:671
山东省dns服务器云主机 浏览:552
安卓5g软件怎么隐藏 浏览:837
编译内核空间不足开不了机 浏览:884
汉纪pdf 浏览:471
在哪里下载国家医保app 浏览:654
没有与文件扩展关联的编译工具 浏览:425
我的世界反编译mcp下载 浏览:18
安卓手柄下载什么软件 浏览:67
pushrelabel算法 浏览:848
硬盘资料部分文件夹空白 浏览:614
cssloader的编译方式 浏览:937
java面板大小 浏览:501
怎么用命令方块打出字体 浏览:497
台湾加密货币研究小组 浏览:294