本帖最后由 苦瓜你好 于 2017-11-30 09:26 编辑
一、前言:第一次接触这个操作系统,感觉还不错,相关介绍就不再累赘,百度百科里讲得很详细。
RTT的发展时间相对ucos还是比较短的,百度一下资料相对也不是很多。
此笔记主要记录笔者学习这个操作系统的过程,以及遇到的问题和解决方法。
也希望对想入门此操作系统的同学有所帮助,一起学习,一起进步。个人理解,如有错误,欢迎更正。
二、开发环境:
1、软件:window 10 专业版,keil_v5.24.1
2、硬件:STM32F407ZG(正点原子探索者开发板),Jlink。//================================================================== 《一》点亮LED灯
<1>点亮LED灯犹如入门编程语言的Hello world一样经典。入门前个人习惯先收集各大网站的相关资料,文末附上个人收集的相关资料。(文中RTT == RT-thread)
<2>入门环境的搭建,参考RT-thread官网的入门教程:正点原子板Nano入门环境搭建
(如果遇到RTT的pack安装不了,在库里面更新不了,把keil升级到最新版本就可以了。升级到最新的MDK,驱动的相关文件也会升级到最新版本,某些jlink或st-link在下载程序时会出现keil停止运行的情况,把相关dll替换成旧的就行了:解压缩里面的dll文件替换到路径keil_v5/ARM/Segger下即可。)
编译下载后,即可看到板子的两颗LED灯以不同的频率闪烁了。
这个是比较规范的工程:
<3>由于之前没接触操作系统,理解起来还是有点难度的。
先从main函数入手:
main函数只有创建LED0和LED1的两个静态线程,平时非常重要的初始化也不见了。
查看<正点原子板Nano入门环境搭建>的第三部分:RT-thread程序执行流程分析。可知系统运行时,连接器是先调用$$Sub$$main函数再进入rtthread_startup() 完成初始化工作。而main()函数只是系统的一个任务,我们在这个任务里创建了两个静态线程,分别是LED0和LED1的工作。
到这里已经大致明白RTT系统运行时的流程了。
//================================================================
知识补充: RT-Thread中支持静态和动态两种定义方式。 用线程来举例的话,rt_thread_init对应静态定义方式,rt_thread_create对应动态定义方式。 使用静态定义方式时,必须先定义静态的线程控制块,并且定义好堆栈空间,然后调用rt_thread_init来完成线程的初始化工作。采用这种方式,线程控制块和堆栈占用的内存会放在RW段,这段空间在编译时就已经确定,它不是可以动态分配的,所以不能被释放。而只能使用rt_thread_detach函数将该线程控制块从对象管理器中脱离。 使用动态定义方式rt_thread_create时,RT-Thread会动态申请线程控制块和堆栈空间。在编译时,编译器是不会感知到这段空间的,只有在程序运行时,RT-Thread才会从系统堆中申请分配这段内存空间,当不需要使用该线程时,调用rt_thread_delete函数就会将这段申请的内存空间重新释放到内存堆中。 这两种方式各有利弊, 静态定义方式会占用RW空间,但是不需要动态分配内存,运行时效率高。 动态方式不会占用额外的RW空间,占用空间小,但是运行时需要动态分配内存,效率没有静态方式高。 总的来说,这两种方式就是空间和时间效率的平衡,可以根据实际环境需求选择采用具体的分配方式。 //======================================================================== 以上是对RTT系统的一个初步认识,和简单运用,对于进一步理解RTT启动流程见这个帖子:rt_thread启动流程分析 RTT资料下载:
|