四轴飞行器1.2.1 RTThread 环境搭建

 买的飞控板到了,开始写下位机的程序了,本来打算用UCOS的,因为以前用过,比较熟悉,可以很快上手,不过板子的卖家推荐了RT-Thread,以前虽然有接触过,但是没用过,于是去官网看了下,感觉还不错。其一这是咱们国人写的,其二USOS有的基本任务调度功能它都有了,其三它的GUI貌似原生支持中文(不确定),其四他有很多的附加组件,虽然这些组建大部分在以前做项目的时候都自己完成过,并且我并不怎么喜欢集成度太高的RTOS,但是这次可以尝试看看。还有它有些好的环形buffer,可以用来做串口的缓冲,哈,这个以前都是自己写的,有现成的,不过试试它带的也好,同时还集成设备管理功能,可以自己写驱动,我看了下,驱动接口都是些类似于winCE的流驱动的接口函数,我们可以把串口放在它的设备管理里面,用它的流驱动接口试一试。不过不知道稳定性怎么样。

      既然选定用RT-Thread了,第一步就是下源码,可以去官网网站www.rt-thread.org下载,我下的是RT-Thread1.2.1。下下来后目录如下:
根据编程手册可以知道,目录名 描述
bsp                    针对各个具体开发板、平台的目录,其中包含相应的Keil工程文件(如果包含了Keil MDK的移植)
filesystem          包含了RT-Thread的文件系统组件代码
finsh                 包含了RT-Thread的finsh shell组件代码
include             包含了RT-Thread核心的头文件
libc                   面向GCC移植的小型C库
libcpu               面向各个芯片移植的代码
net                   包含了RT-Thread的网络组件代码
rtgui                 包含了RT-Thread/GUI图形用户界面组件代码
src                   包含了RT-Thread内核核心的代码
说明:上图中的 SI 是我SourceInsight的工程目录,和RTT无关。
这个手册可能挺久没更新了,filesystem  只的就是途中的components。rtgui 已经被单独拿出来了,要单独下载,net 包涵在了components里面了。

下下来的文件包涵了很多的平台,飞控板用的是STM32F407的芯片,所以其他平台的文件全部删掉。在bsp目录下可以找到stm32f40x文件夹,这文件夹里面包括了库函数,其他芯片平台的文件夹统统删掉,在libcpu下,只需要将arm文件夹里面的common和cortex-m4留下来,其他的也都统统删掉。还有其他一些辅助性的文件,如:documentation、examples、tools什么的我们也统统删掉,处理完这些后,一个干净的RTT就准备好了,舒爽很多。

接下来 跑嵌入式里面的第一个例子,hello world啊。。哈哈。。

RTT的项目里面就创建了两个线程,在这两个线程里面单独控制两个LED灯,
 
 1 //------- init led1 thread
 2     rt_thread_init(&thread_led1,
 3                    "led1",
 4                    rt_thread_entry_led1,
 5                    RT_NULL,
 6                    &thread_led1_stack[0],
 7                    sizeof(thread_led1_stack),11,5);
 8     rt_thread_startup(&thread_led1);
 9 
10     //------- init led2 thread
11     rt_thread_init(&thread_led2,
12                    "led2",
13                    rt_thread_entry_led2,
14                    RT_NULL,
15                    &thread_led2_stack[0],
16                    sizeof(thread_led2_stack),11,5);
17 rt_thread_startup(&thread_led2); 

分别找到rt_thread_entry_led1和rt_thread_entry_led2两个函数,在里面控制LED灯就可以了。。

 1 static void rt_thread_entry_led1(void* parameter)
 2 {
 3  
 4 
 5     while (1)
 6     {
 7         rt_thread_delay(RT_TICK_PER_SECOND);
 8         GPIO_ResetBits(GPIOE,GPIO_Pin_7);
 9         rt_thread_delay(RT_TICK_PER_SECOND/3);
10         GPIO_SetBits(GPIOE,GPIO_Pin_7);    
11         
12     }
13 }

另一个进程其实也是一样的,控制得灯不一样而已。。。代码比较粗糙,测试用的。。

原文地址:https://www.cnblogs.com/adfjhg/p/3871844.html