RT_Thread OS 基本例程说明 本文档主要针对RT-OS基本例程的说明,不对RT-OS的原理进行讲解,也不做移植的说明,因为RT-OS的论坛以及网站,已经对RT-OS的说明很详细,且有移植好的工程文件,移植教程里面也有详细的说明。所以这里我们只是根据下面链接的帖子里面的例程做一个总结,帖子链接:http://www.rt-thread.org/phpBB3/viewtopic.php?f=28&t=1877,该帖子是依据STM32F1进行编写的,这里我们把部分例程移植到我们的金龙107上面 这些例程所用到的硬件只有串口,以及我们金龙107开发板的一个LED灯和一个按键,只需要用串口线把我们金龙107和PC机连接起来,只需要一根串口线就可以完成RT-OS所有试验。其中LED灯是作为指示程序的运行,并没有其他作用,按键在其中一个例程中有用到。 例程已将Lwip移植到金龙107开发板上了,如果需要使用到网络可以在rtconfig.h文件里面将#define RT_USING_LWIP宏打开,同时在application.c文件中注释去掉修改如下:
跳线帽JP9接23,连接网线设置电脑IP为192.168.1.203,开发板IP为192.168.1.199。进入电脑命令提示符界面输入ping 192.168.1.199,显示如下信息,说明网络连接正常。 1、动态线程的创建与删除该例程主要说明动态线程的创建与删除,首先我们要在rtconfig.h中开启两个宏定义: #define RT_USING_HEAP;开启此项可以创建动态线程和动态信号量,如果使用静态线程和静态信号量,则此项不是必要的。请注意这里的动态和静态,后面的例程大多用到动态线程或者信号量等,所以此项也是一直开启的,后面将不再赘述。 #define RT_USING_CONSOLE;本实验使用rt_kpriintf向串口打印按键信息,因此需要开启此项。后面的实验,都需要向串口输出数据,所以此项是必须的,我们就不再赘述。 另外还有一个宏定义,我们需要注意,就是:#define RT_TICK_PER_SECOND 100,这个宏定义的意思是,操作系统的100个Tick是1S,则一个OS Tick=10ms。后面的程序中我们使用的都是100,所以后面我们也将不再赘述此选项。 前面说过的,我们不对操作系统的解说,只是对程序的说明,如果对RT-OS不了解的地方,可以参考RT-Thread.pdf和rtthread_manual.zh.pdf这两个文档,其中已经说的很详细。也可以到RT-OS官网上下载这两个文档。 下面开始讲解我们的程序,首先我们要定义两个指向动态线程的指针并建立线程入口函数,如图1-1所示。 图1-1 如图1-1所示,线程1首先打印信息,然后循环进行计数,并打印,延时1S继续循环。线程2首先也是打印信息,然后延时4S,然后删除线程1,并打印信息。 下面看线程的创建,如图1-2所示。第一个线程是静态线程,上面提到的LED灯的闪烁,指示程序运行的作用。主要看下面的两个线程的创建下面的两个线程采用的是创建,而不是初始化,是不一样的。这是动态的线程,采用的是rt_thread_create()函数,返回的是线程控制块的地址。也就是我们上面定义的线程指针。 第一个参数是线程的名字,可以随意, 第二个参数是线程入口函数, 第三个参数是线程入口函数的参数, 第四个参数是线程的堆栈空间, 第五个参数是线程的优先级, 最后一个参数是时间片。 因为RT-OS支持时间片轮法,当两个线程优先级相同时,则采用时间片轮法进行线程的切换。最后判断线程是否创建成功,创建成功则给线程指针分配地址,则其不为空指针,然后启动线程即可。第二个线程一样。 图1-2 结果分析: 程序的执行结果如图1-3所示。 图1-3 上面是打印的RT-OS的信息,因为线程1的优先级比较高,所以先执行,打印一个数据,在线程1的循环中有一个延时,所以打印一次信息之后,要进行延时,则线程1挂起,执行线程2,打印成功创建线程2之后,线程2也进行了4S的延时,所以线程2挂起,等待线程1再运行三次,因为每次都是延时1S,当到了线程1打印出thread1 count: 1之后,再延时1S的时候,线程2的延时时间到,则执行线程2中的删除线程1代码,则线程1不再运行,线程2打印出信息之后,运行结束,并自行删除。
|